DEV Community

Cover image for 13 findings no Juice Shop. Nenhuma virou issue.
Tiago Vilas Boas (Montanha)
Tiago Vilas Boas (Montanha)

Posted on Edited on

13 findings no Juice Shop. Nenhuma virou issue.

Eu quase cometi uma gafe constrangedora que muitos desenvolvedores e analistas iniciantes de segurança cometem: quase abri 13 issues no GitHub do famoso projeto OWASP Juice Shop.

A IA tinha trabalhado muito bem. Ela gerou um relatório lindo com 13 apontamentos cirúrgicos, mapeados para o padrão OWASP ASVS e com arquivo:linha exatos: SQL Injection no login, eval() no perfil de usuário, CORS aberto com * e até um IDOR clássico onde um usuário podia ver a cesta de compras de outro.

Eu já estava pronto para postar os relatórios no repositório quando bati o olho na descrição do projeto no package.json:

"Probably the most modern and sophisticated insecure web application".

Foi o momento do choque de realidade: aquilo não era um bug ou falha acidental. A vulnerabilidade é o próprio produto.

Neste artigo, vamos entender por que ambientes de laboratório (CTFs e labs deliberadamente inseguros) servem exclusivamente para calibrar seus sensores e prompts, e por que abrir issues em labs é o maior atestado de amadorismo técnico que existe.


1. Lab Deliberadamente Inseguro vs Código de Produção

Antes de rodar qualquer agente de segurança ou scanner, a regra fundamental de engenharia é identificar o propósito do repositório:

                     ┌─────────────────────────────────────────┐
                     │          Qual é o Alvo do Scan?         │
                     └────────────────────┬────────────────────┘
                                          │
                  ┌───────────────────────┴───────────────────────┐
                  ▼                                               ▼
     ┌─────────────────────────┐                     ┌─────────────────────────┐
     │   Laboratório de Treino │                     │  Software de Produção   │
     │ (Juice Shop, WebGoat)   │                     │ (Next.js, Cal.com, etc) │
     └────────────┬────────────┘                     └────────────┬────────────┘
                  │                                               │
     Propósito: Ensinar falhas                       Propósito: Resolver problema
     Vulnerabilidades: INTENCIONAIS                  Vulnerabilidades: ACIDENTAIS
                  │                                               │
                  ▼                                               ▼
     [ Ação: Calibrar prompts ]                      [ Ação: Responsible Disclosure ]
     (NUNCA abrir issue!)                            (Issue ou e-mail privado)
Enter fullscreen mode Exit fullscreen mode

Matriz Comparativa: Não Confunda as Portas

Critério Ambientes de Lab (Juice Shop / WebGoat) Softwares Reais em Produção
Objetivo do Código Treinar estudantes e profissionais de AppSec Entregar valor real para usuários finais
Vulnerabilidade Encontrada Desafio documentado (Challenge do placar) Falha acidental de implementação
O Que o SECURITY.md Diz "Não reporte desafios conhecidos" "Reporte via e-mail privado / canal de segurança"
O Que Você Ganha Treinamento, calibração e teste de IA Prevenção de vazamento, CVE ou Bug Bounty

Se o README.md diz "intentionally vulnerable" ou "hacking challenge", seu relatório não deve ir para a internet. Seu relatório deve ficar na sua máquina para testar se a IA é precisa.


2. A Radiografia dos 13 Achados no Juice Shop

Rodamos uma análise puramente estática com agentes de código, sem enviar requisições de rede (sem tráfego e sem exploração ativa).

O modelo local analisou 13 arquivos centrais de rotas e bibliotecas (routes/, lib/, data/) e gerou exatamente 13 apontamentos mapeados contra o padrão OWASP ASVS:

# Tipo de Vulnerabilidade Requisito ASVS Arquivo e Linha Classificação Real
1 Busca com concatenação SQL direta V1.2.4 routes/search.ts True Positive (Challenge oficial)
2 Login concatenando e-mail na query V1.2.4 routes/login.ts True Positive (Challenge oficial)
3 Sanitização de usuário via eval() V1.3.2 routes/userProfile.ts True Positive (Challenge oficial)
4 Bypass de sanitização HTML no frontend V3.2.2 search-result.component.ts True Positive (Challenge oficial)
5 CORS default aberto para qualquer origem (*) V3.4.2 server.ts True Positive (Challenge oficial)
6 Manipulação de cesto por ID sem checagem de dono V8.2.2 routes/basket.ts True Positive (Challenge oficial)
7 Criptografia fraca com senha em hash MD5 V11.4.1 lib/insecurity.ts True Positive (Challenge oficial)
8 Credenciais padrão em arquivo (admin123) V6.3.2 data/static/users.yml True Positive (Challenge oficial)
9 Servidor FTP vulnerável a bypass por null-byte V5.3.2 routes/fileServer.ts True Positive (Challenge oficial)
10 Chave privada RSA de token JWT commitada V13.3.1 lib/insecurity.ts True Positive (Challenge oficial)
11 Mock sintético de teste apontado como segredo V13.3.1 test/api/apiSpec.js False Positive (Fixture de CI local)
12 Ausência aparente de rate limit em rota pública V2.4.1 routes/feedback.ts False Positive (Tratado no reverse proxy)
13 Alerta de cabeçalho HSTS ausente em dev V3.4.1 server.ts False Positive (Ambiente local HTTP)

3. Para Que Serve um Lab: Medindo Precisão e Recall com Matriz de Confusão

Se você nunca deve abrir issues em labs, para que serve rodar agentes neles?

Para calibrar a sua esteira de engenharia antes de tocar em código corporativo.

Sem um denominador formal, dizer que um agente "acertou bastante" é apenas opinião. Em engenharia, precisamos da Matriz de Confusão:

                        ┌──────────────────────────────────────────────┐
                        │          Matriz de Confusão Medida           │
                        └──────────────────────┬───────────────────────┘
                                               │
                       ┌───────────────────────┴───────────────────────┐
                       ▼                                               ▼
         [ Vulnerabilidade Real ]                            [ Código Inofensivo ]
         (Challenges do Lab)                                 (Código Seguro/Mocks)
  ┌─────────────────────────────────────────┐     ┌─────────────────────────────────────────┐
  │ True Positives (TP): 10                 │     │ False Positives (FP): 3                 │
  │ Apontou e o desafio existia de fato     │     │ Apontou risco onde era mock ou proxy    │
  └─────────────────────────────────────────┘     └─────────────────────────────────────────┘
  ┌─────────────────────────────────────────┐     ┌─────────────────────────────────────────┐
  │ False Negatives (FN): 106               │     │ True Negatives (TN): N/A                │
  │ Desafios reais não vistos no estático   │     │ Linhas seguras não alertadas            │
  └─────────────────────────────────────────┘     └─────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

As Métricas Reais do Experimento:

  • População Total de Desafios do Lab (Ground Truth): 116 vulnerabilidades catalogadas na documentação oficial do Juice Shop.
  • Amostra Analisada: 13 arquivos centrais de código estático inspecionados pelo agente.
  • Precisão (Precision): 10 / (10 + 3) = 76,9%. Quando o agente apontou um risco crítico de negócio, ele estava correto em mais de 3 a cada 4 vezes.
  • Cobertura Global (Recall): 10 / 116 = 8,6%.

[!NOTE]
Por que um Recall de 8,6% é um dado excelente e libertador?
Porque leitura puramente estática de código só enxerga o que está escrito no arquivo. Ela é completamente cega para falhas de lógica em runtime, ataques de timing, desserialização dinâmica ou encadeamento complexo de pacotes. Isso prova numericamente que nenhum agente de IA estático substitui sensores dinâmicos (DAST, fuzzing e testes end-to-end).


4. Eficiência de Custo: Classificação Local com Downshift

Fazer varreduras completas em bases inteiras de código usando exclusivamente modelos de nuvem de raciocínio profundo consome tokens muito rápido.

A recomendação para times maduros é utilizar um classificador local em Go como o Downshift (harness-downshift):

  • O classificador analisa a complexidade e a extensão dos arquivos localmente na sua máquina;
  • Funções simples e arquivos de configuração passam por linters estáticos locais;
  • Apenas trechos que envolvem regras de autenticação, criptografia ou autorização complexa são enviados para modelos de raciocínio avançado via OpenRouter.

Referências Técnicas Canônicas

Para explorar laboratórios de segurança e entender como treinar seus conhecimentos de forma ética:


Resumo em Uma Frase

Use laboratórios como o Juice Shop para afiar a sua espada e testar a precisão dos seus agentes de IA; mas guarde a lâmina na bainha quando estiver diante do placar de desafios de outros desenvolvedores.

A maturidade de um engenheiro de software não se mede pela quantidade de issues que ele abre, mas pela capacidade de discernir onde cada achado tem valor de verdade.

Top comments (0)