Skip to content

[P1][security][integrity] raiz de confianca da ancora de integridade tem de ser a assinatura do release, nao estado local #2168

Open

Description

@FabioLeitao

Classe: a detecção de adulteração (#856, #1262) hoje decide "validado" a partir de estado que existe só na própria máquina (âncora local, metadados do pacote instalado). Um mecanismo de integridade cuja raiz de confiança é local não prova nada contra quem controla a máquina, e o caminho de recuperação manual criado no #1262 confia nesse mesmo estado. Esta issue troca a raiz de confiança. Detalhes de abuso ficam fora desta issue (repo público).

Requisito: upgrade legítimo NUNCA aparece como adulteração, e adulteração real NUNCA vira "validado" por comando do usuário.

Critérios de aceite

  • ADR em docs/adr/ definindo o desenho: o release publica um manifesto de integridade (hashes dos módulos críticos) assinado por chave do projeto; a chave pública vai embutida no pacote; a verificação roda offline na inicialização. Usar chave de assinatura que o projeto já tem; nenhuma chave nova sem ordem do operador. O ADR diz quem assina e em que passo do release (chaves privadas não ficam no CI sem decisão do operador).
  • Estado validated / expected só quando os módulos instalados batem com um manifesto cuja assinatura verifica. Sem assinatura válida, ou hash divergente: tampered, mesmo após qualquer comando de recuperação.
  • O comando manual --reconcile-integrity-anchor deixa de poder produzir validated sozinho: removido, ou condicionado à mesma verificação de assinatura. A âncora local passa a ser só registro forense (eventos append-only), não árbitro.
  • Upgrade de qualquer versão anterior para a nova: sem INTEGRITY TAMPER DETECTED e sem -alpha, sem nenhum comando do usuário.
  • Testes adversariais no repo: módulo crítico alterado após a instalação → tampered, inclusive depois do comando de recuperação; manifesto adulterado ou com assinatura inválida/ausente → tampered; downgrade → tampered; upgrade legítimo → validated. Nenhuma asserção existente enfraquecida.
  • Documentar o limite honesto: o que o mecanismo prova e o que não prova (quem controla a máquina inteira, incluindo a chave pública embutida, ainda pode contornar; a raiz externa é a chave publicada fora do pacote). Sem afirmar mais do que o código prova.
  • Inclui o fixture de upgrade da Release gate: add an upgrade-path smoke (previous release to candidate) so known upgrade bugs like #1262 cannot ship again #2162 (versão publicada anterior → candidato, sem TAMPER/-alpha) no smoke do release.
  • Criar docs/plans/PLAN_INTEGRITY_SIGNED_MANIFEST.md com <!-- plans-hub-summary: ... -->; executar python scripts/plans_hub_sync.py --write; adicionar entry em docs/plans/PLANS_TODO.md.
  • Uma única PR para a fila inteira (ADR 0092).

Relacionadas: #1262 (recorrência no 1.8.0), #2162 (smoke de upgrade), #856.

Activity

  1. added this to the v1.8.1 milestone on Nov 2, 2026
  2. added 5 commits that reference this issue on Nov 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions