Skip to content

p2-identity#6: Os verificadores publicados dizem VERIFIED sem a assinatura do agente, aceitam chave aposent... #123

Description

@fabianocruz

Achado da auditoria de engenharia, ID canonico p2-identity#6, severidade ALTA.
Alcance em producao, classificado em 23/08: Os dois pacotes estao marcados PUBLIC nos package.json (@codespar/cli 0.6.0, @codespar/sdk 0.11.0), entao o defeito sai da nossa infra. Nao medi downloads deste par especifico, e a memoria do projeto avisa que picos de download sao bots.

Este corpo reproduz a evidencia registrada pela auditoria, sem parafrase. Onde a auditoria nao registrou um campo, ele esta ausente aqui em vez de preenchido por inferencia.

Mecanismo

Tres defeitos no mesmo veredito. (i) verified = anyVerified && !anyFailed (codespar-core/packages/cli/src/commands/mandate-verify.ts:168 e codespar-core/packages/core/src/mandate/index.ts:276-278): assinatura ausente conta como absent/skipped e nunca como failed, entao remover agent_sig do envelope, o que nao quebra o issuer_sig porque a string assinada e a mesma e nao inclui as assinaturas, produz token que imprime 'mandate token verified' com a identidade do agente nao provada. (ii) verifyAgainst (mandate-verify.ts:44-52) testa a assinatura contra TODAS as chaves do documento DID, e o documento lista as retired de proposito (agent-keys.ts:508-511); o kid do token so reordena a lista via preferredKid, nao restringe, entao chave aposentada por rotacao verifica para sempre, o oposto da regra D3. (iii) expired e calculado (mandate-verify.ts:172) e nao entra no veredito. Limite estrutural por cima disso: os 14 campos assinados da V3 (canonical.ts:167-181) incluem expires_at e nao incluem issued_at, entao a regra D3 (valida se o kid estava ativo no momento da emissao) e inverificavel offline por construcao, independente de quem escreva o verificador.

Evidencia e ancora no codigo

codespar-core/packages/cli/src/commands/mandate-verify.ts:44-52 e :168

Fix

A auditoria nao registrou fix sugerido para este achado. Desenhar a partir do mecanismo acima, e escrever aqui o desenho antes de codificar.

Antes de mergear

  • Controle positivo E negativo. Provar que o caminho perigoso e recusado nao prova que o legitimo continua passando. Toda assercao negativa precisa do caso legitimo mais parecido ainda passando.
  • Sensibilidade: mude uma entrada e exija que a saida acuse aquele item pelo nome. Delta agregado nao serve.
  • Guard varre a arvore inteira, nao o diff. Dois PRs limpos isolados aprovam um estado quebrado.
  • Frase absoluta e teste que ninguem rodou. Varra o corpo do PR, os comentarios de codigo e a doc tocada pelo diff. Closes/Fixes/Resolves vao primeiro, porque a plataforma os executa.
  • Se tocar dinheiro, auth ou isolamento entre clientes, lente adversarial e obrigatoria.

Rastreado na planilha de auditoria (codespar-core, linha 92 da aba Achados).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions