
Bazzite плюс уровень аттестации загрузки TPM. В разработке: сборки не проверены, механизм UKI не решён. Спецификация: github.com/plunder707/attested-gaming
Экспериментальный образ аттестации загрузки Linux и стенд для сбора свидетельств, предназначенный для проверки того, что вендор античита мог бы верифицировать вместо опоры на белый список имён дистрибутивов.
Механизм, модель угроз и спецификация для вендора находятся в plunder707/attested-gaming. Этот репозиторий — образ, который производит свидетельства.
СТАТУС: ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР МЕХАНИКИ ИСХОДНОГО КОДА. НЕ УСТАНАВЛИВАЕМЫЙ И НЕ ДОВЕРЕННЫЙ ДЛЯ ПРОДАКШЕНА.
Запуски GitHub Actions 31157890393 и 31159951490 собрали QCOW2 на основе Bazzite, загрузили его в QEMU/OVMF с swtpm и без гостевой сети, подготовили постоянные дескрипторы EK/AK и проверили raw quote по SHA-256 PCR 7, 11, 12 и 15 изнутри гостя. Его ограниченная квитанция имеет SHA-256
ad5ef12592cb5f4d1dfa8f0da88148931d48f0e6018924b2de4c766e1523ddaf. Отдельный workflow верификатора 31160003873 проверил финальный коммит агентаb918392этого репозитория на изолированном программном TPM и прошёл регистрацию AK, проверку raw quote, отклонение повторов, отклонение подделки подписи и подключение TPM в QEMU/OVMF.Загруженный результат также подтверждает блокер политики Bazzite: не было ни файла UKI, ни признаков systemd-stub, предусмотренные аргументы lockdown отсутствовали, а PCR 11 и 15 остались нулевыми. PCR 12 тоже был нулевым, но это не самостоятельный отказ: встроенная командная строка UKI относится к PCR 11, тогда как PCR 12 фиксирует внешние входные параметры командной строки и может корректно оставаться нулевым, если таковые не передаются. Регистрация ключей Secure Boot, измерение командной строки через UKI, аппаратное происхождение, воспроизведение журнала событий, привязка к транспорту и допуск по политике загрузки остаются нерешёнными. Ни один из «зелёных» запусков не создаёт функционирующую продакшен-систему аттестации.
Отдельный положительный контроль Fedora с запечатанным образом прошёл дважды в запуске 31218059725 и ещё раз на голове объединённого исходного кода в запуске 31219745053. Он доказывает, что стенд может загрузить неизменяемый UKI, подписанный вышестоящим проектом, связать выбранный прошивкой путь и хэш загруженного файла с проверкой до загрузки, наблюдать ненулевой PCR 11 и отклонять неподписанную модификацию
.cmdline. Это только контроль стенда: все флаги доверия производителя, политики и продакшена остаются ложными, и он не делает предварительную версию Bazzite устанавливаемой.Отдельная дорожка с подписанным policy-addon для PCR 12 затем прошла дважды в запуске 31234464516. Вышестоящий UKI и PCR 11 остались побайтово идентичными; обе подписанные загрузки применили
lockdown=confidentiality module.sig_enforce=1ровно один раз и воспроизвели PCR 12ca62dd5f...a8f5; подделка после подписания была отклонена, и система вернулась к базовому нулевому PCR 12. Это доказывает ограниченный механизм, а не развёртываемую иерархию ключей или политику доверия операционной системы.Этот исходный код доступен для рецензирования и воспроизводимой эмуляции. Никакой GHCR-образ не опубликован, и это не устанавливаемый доверенный дистрибутив.
Завершённый эксперимент с Bazzite описан в
BOOTED_IMAGE_CANARY.md. Инструкции по
воспроизведению и сборке из исходников — в BUILDING.md.
Базовые свидетельства UKI и его независимые критерии допуска зафиксированы в
UKI_BASE_DECISION.md. Эксперимент с подписанным
policy-addon для PCR 12 описан отдельно в
FEDORA_PCR12_ADDON_CANARY.md.
Порядок вех и правила остановки отслеживаются в ROADMAP.md.
Отдельный контроль стенда с загруженным UKI описан в
FEDORA_SEALED_POSITIVE_CONTROL.md.
Ничего не удаляется и не пропатчивается. Поверх добавляются четыре вещи:
tpm2-tools и tpm2-tss, которые нужны агенту во время выполнения./usr/lib/attestos/cmdline с
lockdown=confidentiality и module.sig_enforce=1.attestos-provision, одноразовый unit, который создаёт отдельные
постоянные идентичности RSA EK и AK внутри TPM и читает сертификат
подтверждения (endorsement certificate) из NV-памяти, если он существует.attestos-agent, активируемый через сокет на loopback, который отвечает
на строгий запрос attestos.tpm/v1 на идентичность, активацию или котировку
сырыми свидетельствами TPM. Агент никогда не выносит вердикт о доверии.Bazzite основан на Fedora, а семейство Fedora — это то, что белые списки античитов сейчас блокируют. Доказать, что аттестация работает именно здесь, — это и есть тот случай, который стоит доказать. Сборка на SteamOS ничего бы не доказала, потому что SteamOS уже пропускается, и успешная демонстрация там дала бы доступ, который у неё уже есть.
Bazzite также рассчитан на наслаивание. Это OCI-образ, поэтому этот репозиторий — это Containerfile и GitHub Action, а не дистрибутив с зеркалами и установщиками.
Именно эта часть определяет, имеет ли всё это хоть какой-то смысл.
lockdown=confidentiality блокирует /dev/mem, kprobes против работающего
ядра и загрузку неподписанных модулей. Эта гарантия ничего не стоит, если
политика живёт только в конфиге загрузчика, который пользователь может
редактировать. В противном случае пользователь может удалить аргументы,
загрузиться с тем же измерением ядра и предъявить котировку, которая ничего не
говорит об отсутствующей политике.
Unified Kernel Image связывает ядро, initrd и встроенную командную строку в один подписанный PE-бинарник, измеряемый в PCR 11. Отдельно подписанный systemd add-on для командной строки может расширять дополнительную политику в PCR 12, не изменяя вышестоящий UKI. Любой из путей должен быть привязан к точно загруженному артефакту и воспроизведён верификатором; наличие файла или ненулевой PCR недостаточно.
Bazzite не использует UKI, и теперь это подтверждено, а не предполагается. Его Containerfile активно исключает пакеты ядра UKI:
dnf5 -y config-manager setopt "*fedora*".exclude="mesa-* kernel-core-* \
kernel-modules-* kernel-uki-virt-* steam"
systemd-ukify нигде в репозитории не встречается. Таким образом, файл
cmdline, поставляемый этим образом, сейчас — не более чем декларация о
намерениях: без UKI его нечем запечатать, пользователь может отредактировать
его в загрузчике, и PCR 11 не измеряет то, что, как предполагает дизайн, он
измеряет.
Исправление Bazzite — это не строка в build.sh. Требуется доверенный путь
измерения до запуска ядра — либо изменив способ загрузки образа, либо взяв
основу, которая уже загружается через systemd-stub.
Эксперименты сужают практические варианты: