SAST
Raio-x do código sem executar nada: acha padrões vulneráveis antes do primeiro deploy.
O que é
(Static Application Security Testing) analisa o código-fonte, bytecode ou binário sem executar o programa. O scanner procura construções perigosas — concatenação de SQL, , criptografia fraca, — e aponta arquivo e linha, no formato que o desenvolvedor já consome.
A sigla esconde três técnicas bem diferentes: pattern matching (regras textuais), análise de fluxo de dados (o famoso ) e análise semântica. Sem entender as três, o output do scanner parece mágica — e os falsos positivos parecem bug.
Do texto ao AST
Antes de qualquer análise, o código passa por um parser e vira uma AST (): cada construção da linguagem vira um nó tipado, e o scanner navega nessa árvore em vez de ler texto solto. É isso que permite perguntar coisas como 'existe um nó de concatenação dentro de uma chamada de query?'.
Uma linha inocente de JavaScript vira uma árvore assim:
const sql = "SELECT * FROM users WHERE id = " + req.query.id
VariableDeclaration
id: Identifier "sql"
init: BinaryExpression "+"
left: StringLiteral "SELECT * FROM users WHERE id = "
right: MemberExpression
req.query.idSource → sink: o coração da análise
A AST sozinha diz que existe uma concatenação — não diz se ela é perigosa. A pergunta de segurança é outra: esse dado tem origem confiável? Onde ele termina?
Taint analysis (análise de contaminação) responde seguindo o dado: fontes não confiáveis — input do usuário, headers, query strings — são marcadas como 'tainted'. O engine propaga essa marca por atribuições, concatenações e chamadas de função, e dispara o alerta quando a marca chega a um sink: um ponto onde o dado vira comando, query, HTML ou caminho de arquivo.
No exemplo abaixo, o fluxo é completo: nasce em req.query.id (source), atravessa uma concatenação (propagação) e termina dentro de db.query (sink):
app.get("/users", (req, res) => {
const id = req.query.id; // SOURCE
const sql = "SELECT * FROM users WHERE id = " + id; // propagação
db.query(sql, (err, rows) => res.json(rows)); // SINK
});O que o scanner reporta
O resultado não é 'existe concatenação' — é o caminho inteiro, com e correção sugerida. Algo como:
server.js:3
SQL Injection (CWE-89) · alta
taint: req.query.id -> id -> sql -> db.query()
fix: use query parametrizada (placeholder $1)A correção que o engine aceita
Parametrizar a query interrompe a taint: o valor do usuário deixa de ser código e vira dado. Na linguagem do taint analysis, o é um sanitizador (ou barrier) — o engine sabe que aquele caminho específico está limpo e para de alertar nele.
app.get("/users", (req, res) => {
const sql = "SELECT * FROM users WHERE id = $1"; // query fixa
db.query(sql, [req.query.id], (err, rows) => res.json(rows));
});Onde entra na pipeline
O mais cedo possível: plugin de IDE e pre-commit dão feedback em segundos, a análise completa roda no PR e no stage de build. Regras críticas quebradas falham o build () e bloqueiam o merge.
Pontos fortes
- cobertura de 100% do código, inclusive caminhos raramente executados
- acha a vulnerabilidade cedo, quando corrigir custa pouco
- não precisa de ambiente rodando nem de credenciais
Limitações
- falsos positivos: quando o engine não consegue provar que o caminho é seguro (um sanitizador customizado, por exemplo), ele alerta por precaução — e a triagem é trabalho humano
- explosão de caminhos: analisar todas as combinações de execução é caro; os engines usam heurísticas e podem perder fluxos raros
- é cego para configuração de runtime, infraestrutura e comportamento real — território do DAST
conexões no mapa
- SASTstage: build/PRCI/CD
- Shift-leftantecipaSAST
- SASTcomplementaDAST
- Threat modeling - pensar como o atacante antes de codardefine o que testarSAST
atualizado em 14/10/2026 · fontes para aprofundar · reportar erro
em outros domínios
- Relatar achados e conduzir a remediaçãooffsecachado bem escrito vira regra e teste na esteira
- O loop de verificaçãovibecodingo gate que vale para qualquer autor, humano ou agente
- A05 Injectionowaspé o padrão que a análise estática procura no código
- Tool callingai-agentspega injeção em código; aqui o alvo é o argumento da ferramenta
- Runbooks, resposta e hardening pós-incidentesecopso hardening do pós-incidente vira regra e correção no código
Estude antes
Desbloqueia
teste o que entendeu
Carregando perguntas…