Veredito

Revisão de código por prova

Revisor de IA afirma. Este prova — ou diz que não conseguiu.

Cada suspeita entra como acusação, e nada vira parecer sem artefato reproduzível. O veredito é um exit code, não opinião de modelo.

Provadoartefato anexado
Crítica security app/api/app/routers/shares.py:84-95
O que
GET /shared/{doc_id} valida apenas se existe um share para qualquer usuário do documento, não se o share é para o usuário atual: um terceiro lê o documento compartilhado entre outros dois.
Árbitro
"Quem não é dono nem destinatário não pode ler" docs/REVIEW_TASK.md:43
Evidência
contra o app rodando — GET /documents como alice → 200 POST /documents/4/share?email=bob@… como alice → 201 GET /shared/4 como carol → 200 artefatos/http_injection_03.json
Conserto
Filtrar o select por Share.shared_with_user_id == user.id (ou dono) em read_shared_document, retornando 403/404 caso contrário.

Achado real, rodada de 14/08 — 4 com parecer, 1 descartado com motivo, 1 inconclusivo com causa. Carol não é dona nem destinatária do documento 4, e mesmo assim leu.

O problema

Relatório gerado por IA já fechou instituição.

O curl encerrou seu programa de bug bounty no fim de janeiro de 2026. A taxa de confirmação ficou acima de 15% por anos e caiu abaixo de 5% em 2025, soterrada pela enxurrada de relatórios gerados por IA. Foram US$ 100 mil pagos por 87 vulnerabilidades reais antes de desligarem.

Encontrar deixou de ser o gargalo. Provar é. Uma ferramenta que afirma sem evidência não economiza trabalho de revisão — ela transfere o trabalho para quem vai conferir, e multiplica.

Como funciona

Promotores acusam. Advogado testa. Juiz sentencia.

  1. Promotores

    Seis lentes em paralelo leem o diff e o código em volta. Acusar é barato e essa lista ninguém vê — o trabalho delas é cobertura, não seletividade. Pedir que se contenham faz o modelo engolir achado real.

  2. Advogado

    A única peça que é agente de verdade: pensa, chama ferramenta, lê o resultado, decide. Vê uma acusação por vez, isolada, com o repositório montado numa cópia descartável. Não argumenta — testa.

  3. Juiz

    Regras determinísticas, cada uma com teste. O artefato ganha do modelo: disse provado e o exit code discordou, vale o exit code. A severidade acompanha a força da prova, não a gravidade teórica.

A prova

A mesma prova roda nos dois commits.

Só é provado se passa antes e falha depois. O falso alarme se elimina sozinho, sem ninguém precisar julgá-lo: se o teste já falhava no código de ontem, o problema não é do pull request.

E a evidência deixa de ser uma opinião sobre o seu código. Vira uma frase que você pode conferir em trinta segundos: este teste passa no seu código de hoje e quebra com a sua mudança.

O parecer

Três desfechos, e o terceiro é o que ninguém entrega.

  • Provado

    Artefato reproduzível anexado ao achado. É o que sustenta severidade alta — e é conferível sem confiar em nós.

  • Descartado

    A perícia refutou. Sai no parecer com o motivo, porque saber o que foi olhado e absolvido vale tanto quanto saber o que foi condenado.

  • Inconclusivo

    A ferramenta falhou, o parse quebrou, o modelo recusou. Sai rotulado, com a causa, e nunca vira absolvição.

Num veredito binário, “não consegui provar” vira absolvição limpa: a categoria mais importante se esvazia sozinha e o relatório parece rigoroso. Por isso o terceiro estado é obrigatório aqui, e as duas listas — descartados e inconclusivos — saem no parecer em voz alta.

Estado

Onde está hoje.

Custo medido
US$ 0,071por acusação verificada, com leitura e grep
Reconhecimento
2º lugarHack2L, agosto de 2026
Código
Abertogithub.com/marianocho/hack2l