fix(security): harden diagnostics storage boundary

This commit is contained in:
2026-09-07 19:52:11 +05:00
parent af9f476658
commit a3445f79c5
12 changed files with 562 additions and 37 deletions
+10 -2
View File
@@ -254,7 +254,7 @@ preflight-ошибка со словом `nftables` приводила к отк
него нельзя ни при одном взведённом флаге, включая `stateTouched`. В этом
случае system rollback не выполняется, `install-state.json` не пишется,
diagnostics-бандл не собирается (его сбор сам создал бы каталоги в
`/var/log/hy2xs`).
`/var/lib/hy2xs/diagnostics`).
- `systemctl stop/disable` выполняется **только если текущая операция сама
развернула эти unit-файлы**.
@@ -695,7 +695,15 @@ Diagnostics не копирует env/YAML и не перенаправляет
редакцию и лишь затем записываются с режимом `0600`. Некорректный UTF-8 в
конфигурационном файле даёт безопасный маркер пропуска без исходных байтов.
Вывод каждой внешней команды ограничен 8 МиБ на поток и при усечении явно
помечается; архив создаётся сразу под `umask 077`.
помечается.
Staging и архив лежат только в `/var/lib/hy2xs/diagnostics`, а не в
service-writable `HY2XS_LOG_DIR`. Родитель проверяется через `lstat`: symlink,
не-root владелец, доступ на запись для группы/остальных или режим дочернего
каталога не `0700` останавливают сбор fail closed. Рабочий каталог получает
непредсказуемое имя через `mkdtemp`, archive path заранее резервируется через
эксклюзивный `open("wx")`, итоговый файл проверяется как обычный
`root:root 0600`. После успешной упаковки staging удаляется.
Это не косметика. Построчное правило `auth:\s*(.*)` подставляло маркер в
заголовок mapping'а и оставляло нетронутым вложенный