Publicações | Codurance

Code Vulnerability

Written by Mauro Ribeiro | 03 set. 2026

No post anterior falamos de Hotspots — código que merece revisão. Vulnerability é o passo seguinte: bug de segurança que análise estática consegue confirmar.

A diferença operacional é grande. Hotspot abre a pergunta "isto é seguro neste contexto?". Vulnerability afirma "existe um caminho de exploração — corrija ou aceite o risco com justificativa".

TL;DR

Code Vulnerability é bug de segurança confirmado — diferente do Hotspot, é executável: existe um payload que aciona o problema. Análise estática moderna detecta as famílias clássicas (SQL injection, XSS, path traversal, command injection, deserialização insegura) via taint analysis. Catalogadas em CWE e OWASP Top 10 — não é teoria acadêmica, é a lista do que efetivamente é explorado em produção.

Para quem  Tech Leads que viram SQL injection em livro mas confiam que "aqui não acontece" Leitura  ~5 min Funil  Awareness → Consideration

What this article explores:

  • A diferença entre suspeito e confirmado — Hotspot vs Vulnerability lado a lado
  • Como análise estática detecta vulnerabilities — taint analysis (sources, sinks, sanitizers)
  • As 6 famílias mais frequentes em produção — Injection, XSS, Path Traversal, Deserialization, SSRF, IDOR
  • CWE — o vocabulário que falta nas reuniões com CTO/CISO
  • O impacto da IA generativa: por que ela escreve vulnerabilities por padrão estatístico
  • Plano operacional em 4 passos para começar hoje
  • Cinco pontos-chave para levar embora
§ 1 Distinção

A diferença entre suspeito e confirmado

A diferença mais clara aparece no código. Veja Hotspot e Vulnerability lado a lado:

Hotspot · depende do contextoReview
// Pode ser OK se for ID de log
const id = Math.random()
                .toString(36);
Vulnerability · SQL injection confirmadaCWE-89
app.get('/user', (req, res) => {
  const id = req.query.id;        // taint source
  db.query(`SELECT * FROM users WHERE id=${id}`,
           callback);                    // taint sink
});

A segunda função tem um caminho rastreável do input do usuário até a execução de SQL. Análise estática moderna marca isso como vulnerability — não hotspot, não warning, não suggestion. Bug com payload.

Como análise estática detecta vulnerabilities

A técnica chama taint analysis (análise de contaminação). O analisador rastreia:

  • Sources — pontos onde dados externos entram (request params, body, headers, env vars, file reads)
  • Sinks — pontos perigosos onde dados externos não deveriam chegar sem sanitização (SQL execution, shell commands, HTML render, file paths, deserialização)
  • Sanitizers — funções que neutralizam o risco (parameterized queries, HTML escape, path validation)

Se existe um caminho do source ao sink sem passar por sanitizer, a ferramenta marca vulnerability. Se passa por sanitizer reconhecido, OK. Se passa por função custom desconhecida, fica como hotspot — depende da ferramenta saber se a função sanitiza de fato.

§ 2 Famílias

As 6 famílias mais frequentes em produção

A OWASP Top 10 muda a cada 4 anos, mas as famílias que análise estática captura bem são consistentes:

CWE-89
Injection
SQL, NoSQL, LDAP, OS command. A clássica. Input do usuário interpolado em query/comando. Cura: parameterized queries, prepared statements, command builders que escapam por design.
CWE-79
Cross-Site Scripting (XSS)
Reflected, stored, DOM-based. Input renderizado em HTML sem escape. Cura: framework com escape automático (React, Angular, Vue) + CSP estrito.
CWE-22
Path Traversal
Input do usuário usado como nome de arquivo. "../../config/secrets.yml". Cura: whitelisting + path.resolve + verificação de prefixo.
CWE-502
Insecure Deserialization
Java/Python pickle/etc com input do usuário = RCE. Cura: deserialização tipada, validação de schema antes de processar.
CWE-918
SSRF
Server-Side Request Forgery. Atacante força server a fazer request interno. Cura: whitelist de domínios + verificação de IP private ranges.
CWE-639
IDOR
Insecure Direct Object Reference. /api/order/123 — qualquer autenticado acessa qualquer order. Cura: verificação de ownership em cada endpoint.

A boa notícia: ferramentas modernas detectam todas as 6 com taxa de falso positivo aceitável. A má notícia: detecção depende de a ferramenta entender seu framework. ORMs custom, frameworks proprietários, DSLs internos — tudo isso reduz cobertura.

§ 3 Vocabulário

CWE — o vocabulário que falta nas reuniões

CWE (Common Weakness Enumeration) é a taxonomia formal. Cada padrão tem um número (CWE-89 SQL injection, CWE-79 XSS, CWE-22 Path traversal, CWE-78 OS command injection, CWE-502 Insecure deserialization, CWE-918 SSRF).

Por que isso importa? Porque tira a discussão do achismo. "Achei um bug" vira "detectamos CWE-89 em 12 endpoints, todos eles em código que muda toda semana". CWE é defensível em reunião com CTO/CISO. "Bug" não é.

“

A maturidade do time aparece quando uma reunião de incidente termina com CWE number e contagem por categoria, não com "alguns bugs de segurança encontrados".

§ 4 IA Generativa

O impacto das Vulnerabilities no uso de IA

A IA generativa escreve vulnerabilities por padrão estatístico. Não porque o modelo seja malicioso — porque o corpus de treinamento tem milhões de exemplos de SQL com string interpolation, fs.readFile com path do usuário, eval() de JSON externo. O LLM aprende padrões frequentes; padrões frequentes incluem padrões inseguros.

O que acontece em código gerado por IA sem análise de vulnerability

  • Padrões inseguros se naturalizam. SQL com template literal vira default. Cada prompt similar reforça o padrão.
  • Sanitizers viram opcional. A IA gera o código que funciona; sanitização vira "feature". Sem prompt explícito pedindo, fica de fora.
  • Taint flow fica invisível. Reviewer humano lê linha-a-linha, não rastreia caminho de dados. O bug passa porque "parece ok aqui".
  • Testes refletem o bug. A IA gera teste com input válido; vulnerability só aparece com input adversário. Teste verde, bug ativo.
A boa notícia

Quando análise estática de vulnerability roda no commit (não no CI tardio), o feedback chega ao LLM via erro: "this code has CWE-89, suggest parameterized query". A próxima geração corrige. Vulnerability scanning vira pré-condição para extrair valor real de IA generativa em código com qualquer superfície externa.

§ 5 Operacional
O que fazer agora
Plano operacional · 4 passos
  1. 1 Adote uma ferramenta SAST que cubra suas linguagens. Semgrep (open source, regras customizáveis), Snyk Code, Checkmarx — ou a plataforma SQA da Codurance, que integra Vulnerabilities com os outros 2 sinais do pilar Code Security.
  2. 2 Configure regras CWE-aligned. Não use só "default". Habilite CWE-89, CWE-79, CWE-22, CWE-78 explicitamente. Verifique cobertura por seu framework.
  3. 3 Bloqueie regressão de severidade alta. Vulnerability nova de severidade critical ou high falha o build. As já existentes viram baseline negociado.
  4. 4 Inclua false-positive workflow. Toda vulnerability que o time confirma como falso positivo precisa de justificativa rastreada — caso contrário, vira hábito de ignorar.
Resumo · Pontos-chave
Cinco frases para levar embora.
  • →Vulnerability é bug confirmado. Não é warning, não é suggestion — análise estática provou caminho de exploração.
  • →Taint analysis rastreia source → sink. Sanitizer no caminho neutraliza. Sem sanitizer = vulnerability.
  • →6 famílias dominam produção: Injection, XSS, Path Traversal, Deserialization, SSRF, IDOR. Cobertas por SAST moderno.
  • →CWE é o vocabulário de reunião. Use número, não adjetivo. Tira do achismo.
  • →IA generativa propaga padrões inseguros. Vulnerability scanning é pré-condição para extrair valor de LLM em código exposto.
Próximo passo

Code Vulnerabilities é o que você escreveu — bug que análise estática encontra no seu código. Mas grande parte da superfície de risco hoje vem de código que você não escreveu: bibliotecas externas, transitive dependencies, supply chain. Log4Shell não foi bug que a Apache colocou — foi bug que pegou todo mundo que dependia de log4j. O próximo post fala disso.

Post 03 Dependency Vulnerabilities →

How Codurance can help

A Codurance acompanha times de engenharia que querem instrumentar a saúde de segurança do código sem virar AppSec. Ajudamos Tech Leads e Staff Engineers a integrar SAST em pipelines de PR, alinhar regras a CWE, e estabelecer baseline para conversas com CTO/CISO baseadas em fato — não em achismo.

Se você quer aplicar essas práticas no seu time, entre em contato hoje.

About the Author

[PARÁGRAFO_BIOGRAFICO_AUTOR]