Code Vulnerability

    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.
    § 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]

    Tell us about your challenges by clicking on the banner