fix(v1): сделать отзыв доступа, бэкап и диагностику соответствующими своим именам
Проход по операциям, которые делают не то, что обещает их имя. P0. Удаление bootstrap-admin-peer не было отзывом доступа. Признаком «создавать пир или нет» служило наличие строки в таблице, а HY2XS_ADMIN_CON_PASS продолжает жить в /etc/hy2xs/hy2xs.env — его читает systemd-юнит. Оператор удалял пира, доступ исчезал, и ближайший restart возвращал того же пира с тем же секретом. Молча. Признаком стала отметка BOOTSTRAP_PEER_SEEDED в таблице config: «создавался когда-либо», а не «существует сейчас». Отметка и пир пишутся одной транзакцией. P1. Резервная копия с includeSecrets=true проглатывала и ошибку расшифровки, и отсутствие шифртекста, отдавая пира с пустым secret и успешный ответ. Теперь недоступный секрет любого пира отклоняет весь запрос с указанием имени. P1. DecryptPeerSecret возвращала содержимое колонки как расшифрованный секрет, если оно не начиналось с v1: — остаток поколения с открытыми секретами. P1. doctor перезапускал hysteria-server и hy2xs-admin: диагностика подозрения на проблему обрывала все живые соединения. P1. Админка сама генерировала HYSTERIA2_TRAFFIC_STATS_SECRET, записать который в /etc/hysteria/config.yaml она не может. Сервис объявлял себя здоровым, а machine auth переставал совпадать. P1. Обходы проверки зависимостей (accepted-risk/skipped) не могли произвести артефакт: приёмка требует dependency_security_gate=true. Удалены из сборки и документации, отсутствие проверяется приёмкой. P2. UPDATE по отсутствующей строке config считался успехом, и cron перепланировался при несохранённом значении. Решение по RowsAffected. P2. Слой данных не отличал «записи нет» от «база не ответила»: sentinel-значения ErrPeerNotFound / ErrAdminUserNotFound / ErrConfigNotFound / ErrStorage. P2. Удалены алиасы /:id/client-url и /:id/qr. Контракт разработки: apps/go.mod объявляет toolchain go1.26.7 (директива go — языковой baseline, а не выбор компилятора), tools/dev/doctor.sh|.ps1 сверяют среду с versions.env.
This commit is contained in:
@@ -147,11 +147,28 @@ Hysteria в шаблоне) плюс несовместимость `DefaultRow`
|
||||
Версия `govulncheck` пиньтся в `versions.env`, а база уязвимостей подтягивается
|
||||
на каждом запуске: пин инструмента не должен превращаться в пин знаний о мире.
|
||||
|
||||
Аварийный выход — `ALLOW_VULNERABLE_DEPENDENCIES=true`, по той же логике, что и
|
||||
`ALLOW_DIRTY_BUILD`: выпустить релиз, зная об уязвимости, можно, но это решение
|
||||
человека, а не поведение по умолчанию. Результат шага уезжает в
|
||||
`metadata/package.env` полем `dependency_security_gate`, так что по готовому
|
||||
tarball видно, проверялся он или собран с пропущенной проверкой.
|
||||
Аварийного выхода у шага **нет**, и это отличает его от `ALLOW_DIRTY_BUILD`.
|
||||
Результат уезжает в `metadata/package.env` полем `dependency_security_gate`,
|
||||
которое принимает единственное значение `true`: по готовому tarball видно, что
|
||||
он проверялся, потому что непроверенного tarball не бывает.
|
||||
|
||||
Две переменные обхода здесь существовали и были описаны как способ выпустить
|
||||
релиз, зная об уязвимости. Способом они не были: финальная приёмка архива
|
||||
требует буквально `dependency_security_gate=true`, поэтому сборка с любой из них
|
||||
доходила до конца — компиляция, бандл, тесты, метаданные, tar — и падала на
|
||||
последнем шаге. Продукт документировал операцию, которую сам же запрещал.
|
||||
Противоречие закрыто в пользу строгой политики; отсутствие обходов проверяется
|
||||
приёмкой, а не только описано здесь.
|
||||
|
||||
Контракт читается однозначно:
|
||||
|
||||
> релизный артефакт HY2XS невозможно собрать с непройденной проверкой
|
||||
> зависимостей.
|
||||
|
||||
Новое advisory чинится обновлением графа (`apps/go.sum`,
|
||||
`apps/frontend/pnpm-lock.yaml`) или версии toolchain в `versions.env`. Для
|
||||
локальной работы обходить нечего: `go test ./...`, `govulncheck ./...` и
|
||||
`pnpm audit` запускаются напрямую и tarball не создают.
|
||||
|
||||
### Проверка, а не генерация
|
||||
|
||||
|
||||
Reference in New Issue
Block a user