
Bazzite com uma camada de atestação de inicialização TPM. Trabalho em andamento: builds não verificadas, mecanismo UKI não resolvido. Especificação: github.com/plunder707/attested-gaming
Imagem experimental de atestação de boot para Linux e harness de evidências para testar o que um fornecedor de anti-cheat poderia verificar em vez de depender de uma allowlist de nomes de distribuição.
O mecanismo, o modelo de ameaça e a especificação do fornecedor vivem em plunder707/attested-gaming. Este repositório é a imagem que produz as evidências.
STATUS: PRÉVIA DA MECÂNICA DO CÓDIGO-FONTE. NÃO INSTALÁVEL NEM CONFIÁVEL PARA PRODUÇÃO.
As execuções do GitHub Actions 31157890393 e 31159951490 criaram um QCOW2 derivado do Bazzite, o inicializaram sob QEMU/OVMF com swtpm e sem rede na VM convidada, provisionaram handles persistentes de EK/AK e verificaram uma quote bruta sobre os PCRs 7, 11, 12 e 15 de SHA-256 de dentro da VM convidada. Seu recibo delimitado tem SHA-256
ad5ef12592cb5f4d1dfa8f0da88148931d48f0e6018924b2de4c766e1523ddaf. Um workflow verificador separado 31160003873 exercitou o commit final do agenteb918392deste repositório contra um TPM de software isolado e passou no registro de AK, na verificação de quote bruta, na rejeição de replay, na rejeição de adulteração de assinatura e na conexão do TPM QEMU/OVMF.
O resultado inicializado também confirma o bloqueio de política do Bazzite: nenhum arquivo UKI ou sinal de systemd-stub estava presente, os argumentos de lockdown pretendidos estavam ausentes e os PCRs 11 e 15 permaneceram zerados. O PCR 12 também estava zerado, mas isso não é uma falha independente: a linha de comando UKI embutida pertence ao PCR 11, enquanto o PCR 12 registra entradas externas de linha de comando e pode, corretamente, permanecer zerado quando nenhuma é fornecida. O registro de chaves do Secure Boot, a medição de linha de comando baseada em UKI, a proveniência de hardware, o replay do event log, a vinculação de transporte e a admissão de política de inicialização continuam sem solução. Nenhuma das execuções verdes estabelece um sistema de atestação de produção funcional.
Um controle positivo separado com imagem selada do Fedora passou duas vezes em
execução 31218059725
e novamente no head do código-fonte mesclado em
execução 31219745053.
Ele prova que o harness consegue inicializar uma UKI imutável assinada pela
upstream, unir o caminho selecionado pelo firmware e o hash do arquivo
carregado à inspeção de pré-inicialização, observar PCR 11 não zerado e
rejeitar uma mutação não assinada do .cmdline. Isso é apenas um controle do
harness: todas as flags de confiança de fabricante, de política e de produção
permanecem falsas, e isso não torna a prévia do Bazzite instalável.
O lane separado do add-on de política PCR 12 assinado passou duas vezes em
execução 31234464516.
O UKI da upstream e o PCR 11 permaneceram byte-idênticos; ambas as
inicializações assinadas aplicaram lockdown=confidentiality module.sig_enforce=1
exatamente uma vez e reproduziram o PCR 12 ca62dd5f...a8f5; a adulteração
pós-assinatura foi rejeitada e o sistema retornou à linha de base de PCR 12
zerado. Isso prova um mecanismo delimitado, não uma hierarquia de chaves
implantável ou uma política de confiança de sistema operacional.
Este código-fonte está disponível para revisão e emulação reproduzível. Nenhuma imagem GHCR é publicada e ele não é uma distribuição confiável instalável.
O experimento Bazzite concluído está especificado em
BOOTED_IMAGE_CANARY.md. As instruções de reprodução
e de construção a partir do código-fonte estão em BUILDING.md.
As evidências base do UKI e seus critérios independentes de admissão estão
registradas em UKI_BASE_DECISION.md. O experimento
assinado de add-on de política PCR 12 está especificado separadamente em
FEDORA_PCR12_ADDON_CANARY.md. A ordem dos
marcos e as regras de parada são acompanhadas em ROADMAP.md.
O controle separado do harness de UKI carregado está especificado em
FEDORA_SEALED_POSITIVE_CONTROL.md.
Nada é removido e nada recebe patch. Quatro coisas entram por cima:
tpm2-tools e tpm2-tss, que o agente precisa em tempo de execução./usr/lib/attestos/cmdline contendo
lockdown=confidentiality e module.sig_enforce=1.attestos-provision, uma unit one-shot que cria identidades RSA
persistentes distintas de EK e AK dentro do TPM e lê o certificado de
endosso do armazenamento NV quando um existe.attestos-agent, ativado por socket em loopback, que responde a um
desafio estrito de identidade, ativação ou quote attestos.tpm/v1 com
evidências TPM brutas. O agente nunca retorna um veredito de confiança.O Bazzite é derivado do Fedora, e a família Fedora é o que as whitelists de anti-cheat bloqueiam atualmente. Provar que a atestação funciona aqui é o caso que vale a pena provar. Construir sobre o SteamOS não demonstraria nada, porque o SteamOS já é permitido; portanto, uma demonstração bem-sucedida lá conquistaria um acesso que ele já tem.
O Bazzite também é projetado para ser usado em camadas (layered). É uma imagem OCI, então este repositório é um Containerfile e uma GitHub Action, em vez de uma distribuição com mirrors e instaladores por trás.
Esta é a parte que decide se tudo isso significa alguma coisa.
lockdown=confidentiality bloqueia /dev/mem, kprobes contra um kernel em
execução e o carregamento de módulos não assinados. Essa garantia não vale nada
se a política existir apenas em uma configuração do bootloader que o usuário
pode editar. Caso contrário, um usuário pode remover os argumentos, inicializar
com a mesma medição de kernel e apresentar uma quote que não diz nada sobre a
política ausente.
Uma Unified Kernel Image (UKI) une kernel, initrd e sua linha de comando embutida em um único binário PE assinado, medido no PCR 11. Um add-on de linha de comando do systemd assinado separadamente pode estender política adicional ao PCR 12, deixando a UKI da upstream inalterada. Qualquer um dos caminhos precisa ser vinculado ao artefato exato carregado e reproduzido (replay) pelo verificador; a presença do arquivo ou um PCR não zerado não é suficiente.
O Bazzite não usa UKI, e isto agora é confirmado em vez de suspeitado. Seu Containerfile exclui ativamente os pacotes de kernel UKI:
dnf5 -y config-manager setopt "*fedora*".exclude="mesa-* kernel-core-* \
kernel-modules-* kernel-uki-virt-* steam"
systemd-ukify não aparece em lugar nenhum do repositório. Portanto, o arquivo
cmdline que esta imagem entrega é, atualmente, uma declaração de intenção e
nada mais: sem uma UKI não há nada o selando, um usuário pode editá-lo no
bootloader, e o PCR 11 não mede o que o design presume que ele mede.
Corrigir o Bazzite não é uma linha em build.sh. Exige um caminho confiável de
medição pré-kernel, seja mudando como a imagem inicializa ou adotando uma base
que já inicializa por meio do systemd-stub.
Os experimentos restringem as escolhas práticas:
Uma UKI Fedora da upstream pode manter sua assinatura de distribuição, mas um add-on de política do attestos ainda precisa de uma chave de assinatura admitida pelo firmware, Shim ou MOK. Um kernel de terceiros tem a versão maior do mesmo problema. As opções de implantação são:
O harness Fedora descartável registra um certificado local à execução em uma UEFI DB copiada e prova o mecanismo sem reivindicar um modelo de implantação. Ainda não há um contrato aceito de registro, revogação ou recuperação de chaves para o usuário final. Isso é tanto uma questão de parte confiante (relying party) quanto de engenharia.
Ainda não existe um comando de instalação suportado. Em particular,
ghcr.io/plunder707/attestos:latest não é publicada. A prévia atual é apenas
para revisão do código-fonte e reprodução isolada com QEMU/swtpm. Consulte
BUILDING.md.
Containerfile base image and the single RUN that calls build.sh
build_files/build.sh the attestation layer
system_files/ agent, provisioning script, systemd units
image-template.env image name and registry organisation
.github/workflows/ build-only and isolated evidence canaries
Justfile local build and test targets
Tudo fora de build_files/ e system_files/ veio de
ublue-os/image-template e é
trabalho deles.
14e3a21 pela
execução 31143048491 do GitHub Actions; a construção emitiu dois avisos de
lint não fatais do estado do DNF.bootc status em
tempo de execução do agente em identidade de imagem verificada. A afirmação é
metadado, não autoridade assinada; em sistemas sem bootc, ela é
explicitamente unavailable.As questões de medição em tempo de execução exigem QEMU com OVMF e swtpm, o que não requer hardware adicional. A conexão e a mecânica do protocolo TPM bruto já passaram lá, mas inicializar a imagem construída e validar seu event log e política continuam sendo experimentos separados. A aceitação pelo fornecedor exige uma conversa com o fornecedor.
Apache-2.0, em conformidade com o template a partir do qual isto é construído.