Olá a todos.
Esta semana, enquanto andava a fazer a minha review semanal de segurança (sim, eu sei, sou um bocado paranoico com estas coisas), deparei-me com mais um caso de uma empresa que foi comprometida por vulnerabilidades que podiam ter sido facilmente detetadas durante o desenvolvimento. E não, não estou a falar de uma startup qualquer – estou a falar de uma empresa com dezenas de milhares de utilizadores e recursos que fariam qualquer um de nós babar-se.
A verdade é que, enquanto andamos todos preocupados com as últimas tendências em inteligência artificial e kubernetes (e bem, essas tecnologias são fantásticas), muitas vezes esquecemo-nos do básico: o nosso código está seguro? Sabemos realmente o que estamos a importar nas nossas aplicações? E aquela biblioteca que adicionámos há três meses porque “resolvia o problema rapidamente” – será que não está cheia de buracos? O vibe do vibecoding não vibou demasiado?
É aqui que entra o Semgrep, uma ferramenta que descobri há uns tempos e que, honestamente, devia ser obrigatória em qualquer pipeline de desenvolvimento que se preze. E não, não estou a ser pago por eles para dizer isto – é mesmo uma ferramenta que faz a diferença.
O Que É o Semgrep e Porque Nos Interessa Tanto?
O Semgrep é, na sua essência, uma ferramenta de análise estática de código. É uma ferramenta de análise estática leve que funciona com muitas linguagens e permite encontrar variantes de bugs usando padrões que se parecem com código fonte. Mas sejamos honestos, “análise estática” soa a mais uma ferramenta chata que os responsáveis de segurança nos vão obrigar a usar, certo? Errado.
A diferença do Semgrep para outras ferramentas do género é que ele foi pensado para programadores, por programadores. Em vez de nos atirar relatórios incompreensíveis cheios de falsos positivos, ele mostra-nos exatamente onde está o problema, no contexto do nosso código, de uma forma que realmente faz sentido.
É uma plataforma extensível e amiga dos programadores que faz scan ao código fonte para identificar problemas de segurança verdadeiros e acionáveis com soluções de SAST assistidas por IA, SCA e deteção de segredos. E sim, tem IA, mas não é do tipo “vamos meter IA em tudo só porque sim” – é IA que realmente ajuda a reduzir o ruído e a focar-nos no que interessa.
A Realidade Assustadora dos Supply Chain Attacks
Antes de falarmos sobre como o Semgrep nos pode ajudar, vamos ter uma conversa séria sobre algo que me tira o sono: supply chain attacks. Quantos de nós realmente sabem o que está nas bibliotecas que importamos? Instalamos dependências com npm install
, pip install
, go mod
, e confiamos que está tudo bem.
A verdade é que a maioria das aplicações modernas são feitas de uma pequena percentagem de código nosso e uma grande percentagem de código de terceiros. E cada uma dessas dependências pode ter as suas próprias dependências, criando uma cadeia de confiança que pode ser quebrada em qualquer ponto.
Lembram-se do caso do event-stream no NPM? Ou do mais recente xz backdoor? Estes são apenas os casos que sabemos. Quantos mais haverá por aí que ainda não foram descobertos?
O Semgrep Supply Chain faz scan aos ficheiros de lock para responder à pergunta “estás a usar um pacote numa versão conhecida por ser vulnerável?” e depois usa as capacidades de análise de código nativo do motor Semgrep para procurar código que chega à vulnerabilidade no pacote.
Como o Semgrep Funciona na Prática
Agora vamos ao que realmente interessa: como é que isto funciona na prática? Ao contrário de outras ferramentas que parecem ter sido feitas por académicos para académicos, o Semgrep é surpreendentemente fácil de usar.
Instalação e Primeiros Passos
A instalação é trivial. Se tiverem Python (e hoje em dia, quem não tem?), basta:
pip install semgrep
Ou se preferirem usar via Docker (e eu sei que muitos de vocês preferem):
docker run --rm -v "${PWD}:/src" returntocorp/semgrep --config=auto /src
E já está. Sério, é só isto. Nada de configurações complexas, nada de ficheiros de configuração intermináveis. O Semgrep vem com um conjunto de regras pré-definidas que cobrem os problemas mais comuns em dezenas de linguagens.
Análise Automática: O --config=auto
É o Nosso Melhor Amigo
Quando executamos o Semgrep com --config=auto
, ele automaticamente deteta que linguagens estamos a usar no nosso projeto e aplica as regras mais relevantes. É como ter um colega experiente a dar uma olhadela no nosso código e a apontar: “Olha, aqui podes ter um problema.”
Por exemplo, se tiveres um projeto em Python e executares:
semgrep --config=auto .
O Semgrep vai automaticamente procurar por:
- SQL injection vulnerabilities
- Cross-site scripting (XSS) issues
- Command injection problems
- Hardcoded secrets e passwords
- Problemas de desserialização insegura
- E muito mais…
Análise de Dependências: O Verdadeiro Game Changer
Mas onde o Semgrep realmente brilha é na análise de dependências. O Semgrep Supply Chain analisa o teu código e mostra as linhas exatas onde a função vulnerável de uma dependência é usada.
Esta é a diferença fundamental entre o Semgrep e outras ferramentas: ele não se limita a dizer “tens uma dependência vulnerável”. Ele vai mais longe e diz: “tens uma dependência vulnerável E estás a usar exatamente a parte vulnerável dela nesta linha de código.”
Imaginem a diferença: em vez de receberem um relatório com 500 alertas de dependências vulneráveis (dos quais 90% são falsos positivos porque não usamos realmente a parte vulnerável), recebemos apenas os alertas que realmente importam.
Integração em Pipelines de CI/CD: Automatização Que Faz Sentido
Uma das coisas que mais me impressiona no Semgrep é como é fácil integrá-lo nas nossas pipelines. Não é preciso ser um guru de DevOps para pôr isto a funcionar.
GitHub Actions
Para quem usa GIT/tea/hub (e hoje em dia, quem não usa?), basta adicionar isto ao vosso .github/workflows/semgrep.yml
:
name: Semgrep
on: [push, pull_request]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: returntocorp/semgrep-action@v1
with:
config: auto
E pronto. A partir daí, cada push e cada pull request vai ser automaticamente analisado. Se o Semgrep encontrar problemas, o build falha, e vocês sabem imediatamente que há algo que precisa de ser corrigido.
GitLab CI
Para os utilizadores de GitLab, é igualmente simples. Adicionem isto ao vosso .gitlab-ci.yml
:
semgrep:
image: returntocorp/semgrep
script:
- semgrep --config=auto --error .
Jenkins e Outras Plataformas
Para Jenkins ou outras plataformas de CI/CD, basta executar o comando como parte do vosso pipeline:
docker run --rm -v "${WORKSPACE}:/src" returntocorp/semgrep --config=auto --error /src
A flag --error
faz com que o Semgrep termine com exit code diferente de zero se encontrar problemas, fazendo com que o vosso pipeline falhe – exatamente o que queremos.
Casos Reais: Quando o Semgrep nos salva o bacon.

Deixem-me partilhar alguns exemplos reais de como o Semgrep pode fazer a diferença:
SQL Injection: O Clássico Que Nunca Morre
Apesar de falarmos muito sobre SQL injection há décadas, continua a ser uma das vulnerabilidades mais comuns. O Semgrep deteta automaticamente padrões como:
# Código vulnerável que o Semgrep irá detetar
query = f"SELECT * FROM users WHERE id = {user_id}"
cursor.execute(query)
E sugere a correção:
# Versão corrigida
query = "SELECT * FROM users WHERE id = ?"
cursor.execute(query, (user_id,))
Secrets Hardcoded: O Erro Que Todos Já Cometemos
Quantos de nós já commitaram acidentalmente uma API key ou password? O Semgrep tem regras específicas para detetar isto:
# O Semgrep vai alertar para isto
aws_secret = "AKIA1234567890ABCDEF"
database_password = "super_secret_password_123"
Dependências Vulneráveis: A Dor de Cabeça Moderna
Para vulnerabilidades da Supply Chain baseadas em padrões e uso de código, a análise de alcance do dataflow do Semgrep determina o local exato no teu código que introduz uma vulnerabilidade.
Por exemplo, se estivermos a usar uma versão vulnerável de uma biblioteca de processamento de imagens, o Semgrep não se limita a dizer que a biblioteca é vulnerável. Ele mostra-nos exatamente onde no nosso código estamos a chamar a função vulnerável.
Regras Customizadas: Porque Cada Projeto É Único
Uma das funcionalidades que mais me impressiona no Semgrep é a possibilidade de escrever regras customizadas. E antes que digam “ah, mas eu não tenho tempo para isso”, deixem-me explicar como é simples.
As regras do Semgrep são escritas numa sintaxe que se parece com o código que queremos analisar. Por exemplo, se quisermos criar uma regra para detetar chamadas inseguras a eval()
em Python:
rules:
- id: dangerous-eval
pattern: eval(...)
message: "Uso de eval() pode ser perigoso"
languages: [python]
severity: ERROR
Isto é tudo. Não precisamos de aprender uma linguagem de query esotérica ou de entender ASTs (Abstract Syntax Trees). Se sabemos escrever código na linguagem que queremos analisar, conseguimos escrever regras para o Semgrep.
Regras Específicas da Organização
Imaginem poder criar regras que são específicas na vossa organização:
- “Todas as chamadas à base de dados devem passar pela nossa biblioteca de ORM”
- “Logs com informação sensível devem usar a nossa função de sanitização”
- “Chamadas a APIs externas devem incluir timeout”
Estas são regras de negócio que outras ferramentas não conseguem detetar, mas que o Semgrep permite implementar facilmente.
A Plataforma SaaS: Para Quem Quer Mais
Embora a versão open-source do Semgrep seja fantástica, a plataforma SaaS oferece funcionalidades adicionais que podem fazer sentido para equipas maiores:
- Dashboard centralizado: Ver o estado de segurança de todos os projetos numa só interface
- Integração com sistemas de ticketing: Criar automaticamente issues no Jira ou GitHub quando são encontrados problemas
- Métricas e reporting: Acompanhar a evolução da segurança ao longo do tempo
- Regras premium: Acesso a regras mais avançadas mantidas pela equipa do Semgrep
O Semgrep é uma ferramenta vasta e capaz, que contém muitos cantos e recantos que podem ser explorados para obter o máximo valor possível de uma ferramenta de análise estática.
Comparação Com Outras Ferramentas
Já usei muitas ferramentas de análise estática ao longo dos anos: SonarQube, Checkmarx, Veracode, CodeQL… Cada uma tem os seus pontos fortes, mas o Semgrep destaca-se em várias áreas:
Facilidade de Uso
Outras ferramentas requerem configuração complexa, licenças caras, ou equipas dedicadas para as gerir. O Semgrep funciona out-of-the-box e pode ser usado por qualquer programador.
Falsos Positivos
Esta é a grande dor das ferramentas de segurança. Nada mata a produtividade como ter de analisar centenas de alertas que afinal não são problemas reais. O Semgrep, especialmente com a análise de reachability, reduz drasticamente os falsos positivos.
Velocidade
O Semgrep é rápido. Muito rápido. Enquanto outras ferramentas podem demorar horas a analisar um projeto grande, o Semgrep faz-lo em minutos.
Linguagens Suportadas
O Semgrep suporta dezenas de linguagens, desde Python e JavaScript até linguagens menos comuns como Solidity (para contratos inteligentes) e Terraform (para infraestrutura como código).
Supply Chain Security: A Batalha Que Não Podemos Perder
O Semgrep ingere informação de CVEs e avisos de segurança de várias fontes e gera um alerta sempre que determina que a nossa base de código usa ou importa um pacote com uma vulnerabilidade.
Mas a verdadeira inovação está na análise de reachability. Imaginem ter 1000 dependências no vosso projeto (e sim, projetos modernos facilmente chegam a este número). Destas 1000, talvez 100 tenham vulnerabilidades conhecidas. Mas quantas dessas vulnerabilidades são realmente um problema para vocês?
A resposta, na maioria dos casos, é muito poucas. É altura de ignorar 98% dos alertas de dependências, diz a própria equipa do Semgrep, e eles têm razão.
Análise de Reachability: O Que Realmente Importa
A análise de reachability do Semgrep faz uma pergunta simples mas poderosa: “Estás realmente a usar a parte vulnerável desta biblioteca?”
Se tiveres uma biblioteca de processamento de imagens com uma vulnerabilidade na função de redimensionamento, mas só usas a função de rotação, então essa vulnerabilidade não te afeta. Outras ferramentas vão na mesma alertar-te. O Semgrep não.
Esta abordagem não só reduz o ruído como permite focar os recursos de segurança no que realmente importa.
Detecção de Secrets: Porque Todos Já Commitámos Uma Password
Sejamos honestos: todos nós já commitámos acidentalmente uma API key :], password, ou token. É um erro humano comum, especialmente quando estamos sob pressão para entregar uma funcionalidade.
PS: inventei um verbo novo.
O Semgrep tem capacidades avançadas de deteção de secrets que vão além de simples regex. Ele usa análise semântica e validação para reduzir falsos positivos. Por exemplo, ele consegue distinguir entre:
# Falso positivo - apenas um comentário
# A minha API key é abc123def456
# Verdadeiro positivo - secret realmente usado
api_key = "abc123def456"
make_request(api_key)
Validação de Secrets
Uma funcionalidade particularmente interessante é a validação de secrets. O Semgrep pode realmente testar se um secret encontrado é válido, fazendo chamadas às APIs correspondentes (com permissões limitadas, obviamente).
Isto significa que em vez de recebermos alertas para todos os strings que “parecem” API keys, recebemos apenas alertas para keys que são realmente válidas e funcionais.
Integração Com o Ecossistema de Desenvolvimento
O Semgrep não existe no vácuo. Integra-se naturalmente com as ferramentas que já usamos regularmente no nosso dia a dia:
IDEs e Editores
Há extensões para VS Code, IntelliJ, e outros editores populares que mostram os problemas diretamente no editor, enquanto programamos.
Sistemas de Ticketing
Integração nativa com Jira, GitHub Issues, e outros sistemas para criar automaticamente tickets para problemas encontrados.
Slack e Teams
Notificações automáticas quando são encontrados problemas críticos.
SIEM e Logging
Para organizações maiores, o Semgrep pode enviar logs estruturados para sistemas de SIEM, permitindo correlacionar problemas de código com outros eventos de segurança.
Casos de Uso Avançados: Mais Que Segurança
Embora o foco principal do Semgrep seja segurança, ele pode ser usado para muito mais e para mim isso foi o que fez pender a balanca.
Code Quality
Criar regras para fazer enforcing de padrões de código:
- “Todas as funções públicas devem ter documentação”
- “Não usar imports deprecados”
- “Seguir convenções de naming específicas”
Compliance
Para organizações em setores regulamentados:
- “Dados pessoais devem ser sempre encriptados”
- “Logs de auditoria devem incluir user ID”
- “Chamadas a APIs de pagamento devem incluir validação específica”
Migration Assistance
Ajudar em migrações de código:
- “Identificar usos da API antiga”
- “Encontrar padrões que precisam de ser atualizados”
- “Detetar dependências que precisam de ser substituídas”
Performance e Escalabilidade: Pode o Semgrep Lidar Com Projetos Grandes?
Uma pergunta que me fazem frequentemente é se o Semgrep consegue lidar com projetos grandes. A resposta curta é: sim. Com o cuidado devido.
Sei de casos onde o Semgrep tem sido usado em projetos com milhões de linhas de código, e ele mantém-se rápido e eficiente. Algumas dicas para otimizar a performance:
Paralelização
O Semgrep automaticamente usa todos os cores disponíveis. Em máquinas com muitos cores, isto faz uma diferença significativa. Olá Epyc.
Análise Incremental
Em pipelines de CI/CD, o Semgrep pode ser configurado para analisar apenas os ficheiros que mudaram, reduzindo drasticamente o tempo de análise.
Filtering
Podem excluir diretórios desnecessários (como node_modules
ou .git
) para acelerar a análise.
Caching
O Semgrep tem capacidades de caching que evitam re-analisar ficheiros que não mudaram.
O Roadmap: Para Onde Vai o Semgrep
Uma das coisas que me impressiona na equipa do Semgrep é a transparência sobre o roadmap. Algumas funcionalidades que estão a chegar:
Análise de Dataflow Mais Avançada
A análise de alcance do dataflow do Semgrep determina o local exato no código que introduz uma vulnerabilidade. Esta capacidade está constantemente a melhorar, com suporte para padrões de dataflow cada vez mais complexos.
Suporte para Mais Linguagens
Embora o Semgrep já suporte dezenas de linguagens, estão constantemente a adicionar mais. Recentemente adicionaram suporte melhorado para Rust, Swift, e Kotlin.
IA e Machine Learning
Integração de capacidades de IA para sugerir correções automáticas e identificar padrões de vulnerabilidades mais complexos.
Análise de Runtime
Funcionalidades para correlacionar análise estática com comportamento em runtime, criando uma imagem mais completa da segurança da aplicação.
Implementação Prática: Ou Como Começar Amanhã
Tudo isto é muito bonito em teoria, mas como implementar na prática? Aqui está o meu plano de implementação em fases:
Fase 1: Análise Pontual (Semana 1)
- Instalar o Semgrep localmente
- Executar
semgrep --config=auto
no projeto principal - Analisar os resultados e corrigir problemas críticos
- Documenter o processo para a equipa
Fase 2: Integração CI/CD (Semana 2-3)
- Adicionar o Semgrep à pipeline de CI/CD
- Começar com modo “warning only” para não bloquear deployments
- Monitorizar falsos positivos e ajustar configuração
- Treinar a equipa nos resultados
Fase 3: Enforcement (Semana 4)
- Mudar para modo “error” – bloquear deployments com problemas críticos
- Implementar processo para exceções (quando necessário)
- Criar dashboards para monitorizar trends
Fase 4: Customização (Mês 2)
- Identificar padrões específicos da organização
- Criar regras customizadas
- Integrar com outros sistemas (Jira, Slack, etc.)
- Implementar métricas de segurança
ROI: Quanto vale a nossa segurança?
Falemos de números. Uma breach de segurança custa, em média, milhões de euros. O tempo gasto a corrigir vulnerabilidades em produção é exponencialmente maior que corrigi-las durante o desenvolvimento.
O Semgrep, mesmo na versão paga, custa uma fração do que uma única vulnerabilidade pode custar. E na versão gratuita? Zero. O ROI é óbvio.
Mas há benefícios menos óbvios:
- Menos tempo gasto em code reviews: Problemas são automaticamente identificados
- Onboarding mais rápido: Novos developers aprendem boas práticas automaticamente
- Menos bugs em produção: Muitos bugs são também problemas de segurança
- Compliance mais fácil: Relatórios automáticos para auditorias
Limitações: Porque Honestidade É Importante
O Semgrep não é perfeito. Nenhuma ferramenta é. Algumas limitações que devem ter em atenção:
Não Substitui Code Reviews Humanos
O Semgrep é excelente a encontrar padrões conhecidos, mas não consegue entender lógica de negócio complexa ou problemas arquiteturais.
Configuração Inicial Pode Ser Trabalhosa
Embora seja fácil começar, optimizar para reduzir falsos positivos pode demorar algum tempo.
Análise de Runtime
O Semgrep é uma ferramenta de análise estática. Não vê o que acontece quando a aplicação está realmente a correr.
Curva de Aprendizagem Para Regras Customizadas
Embora seja mais fácil que outras ferramentas, escrever regras complexas ainda requer alguma experiência.
A Comunidade: Mais Que Uma Ferramenta
Uma das coisas que mais me impressiona no Semgrep é a comunidade à volta da ferramenta. Há um registry público com milhares de regras contributed pela comunidade, cobrindo tudo desde vulnerabilidades específicas até boas práticas de linguagens particulares.
Esta abordagem open-source significa que quando uma nova vulnerabilidade é descoberta, frequentemente há já uma regra do Semgrep disponível para a detetar. A resposta da comunidade é impressionantemente rápida.
Depois de meses a usar o Semgrep em projetos pessoais e profissionais, posso dizer sem hesitação que é uma das ferramentas mais valiosas que tenho na minha stack de desenvolvimento.
Não é apenas mais uma ferramenta de segurança chata que nos atira alertas incompreensíveis. É uma ferramenta pensada por developers, para developers, que realmente nos ajuda a escrever código mais seguro sem nos atrapalhar.
Para vulnerabilidades da Supply Chain baseadas em padrões e uso de código, a análise de alcance do dataflow do Semgrep determina o local exato no código que introduz uma vulnerabilidade. Isto não é apenas marketing – funciona mesmo.
Num mundo onde supply chain attacks são cada vez mais comuns e sofisticados, onde uma única vulnerabilidade pode comprometer toda uma organização, ter uma ferramenta como o Semgrep não é um luxo – é uma necessidade.
E o melhor? Podem começar hoje. Literalmente. pip install semgrep
, semgrep --config=auto .
, e em poucos minutos têm uma análise completa do vosso código.
Já não há desculpas para enviar código vulnerável para produção. O Semgrep democratizou a segurança de código, tornando-a acessível a qualquer developer, independentemente do seu background em segurança.
Vão lá experimentar, e depois digam-me o que acham. Como sempre, se encontrarem algo interessante ou tiverem dúvidas, já sabem onde me encontrar.
Abraço,
Nuno
P.S.: Se implementarem o Semgrep na vossa organização e descobrirem vulnerabilidades interessantes, façam favor de partilhar (de forma anonimizada, obviamente). Adoro uma boa história de guerra sobre segurança de código!