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).
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
Closes/Fixes/Resolvesvao primeiro, porque a plataforma os executa.Rastreado na planilha de auditoria (
codespar-core, linha 92 da aba Achados).