Todo analista de SOC conhece a situação: você escreve um prompt extenso para triagem de alertas, funciona bem, e três dias depois não consegue replicar o resultado. O colega do próximo turno improvisa outro prompt. O conhecimento institucional existe apenas na cabeça de quem está no plantão.
Skills atacam isso diretamente. Em vez de um prompt gigante carregado em toda interação, você empacota procedimentos em pastas versionadas que o agente carrega sob demanda.
O problema que Skills resolvem
O formato é simples: uma pasta com um arquivo SKILL.md contendo YAML frontmatter e instruções em Markdown, opcionalmente acompanhado de scripts e arquivos de referência.
alert-triage/
├── SKILL.md # Instruções principais
├── scripts/
│ └── ioc_extractor.py # Extração determinística
└── references/
├── scoring_guide.md # Metodologia de scoring
└── escalation.md # Critérios de escalação
O agente carrega apenas os metadados no startup. Quando uma tarefa corresponde à descrição da skill, ele puxa as instruções completas. Scripts e referências são carregados apenas quando necessário.
Na prática isso significa: você pode ter dezenas de skills disponíveis sem estourar a janela de contexto. É progressive disclosure aplicado a automação.
O padrão aberto: portabilidade entre plataformas
Em dezembro de 2025, a Anthropic publicou a especificação Agent Skills como padrão aberto em agentskills.io. A OpenAI documenta suporte ao formato no ChatGPT e no Codex, e outros agentes compatíveis implementam a mesma convenção central.
O benefício é reutilizar as instruções e os recursos centrais, não garantir portabilidade sem ajustes. Nomes de ferramentas, política de invocação, diretórios, permissões, sandbox, acesso à rede e extensões específicas variam. Levar uma skill de Claude para Codex, ou no sentido inverso, exige validação e às vezes um adaptador ou mudança de metadados.
A especificação é intencionalmente minimalista:
---
name: alert-triage-enrichment
description: Enrich security alerts with TI, asset context, historical patterns.
Use when processing SIEM alerts or investigating incidents.
license: Apache-2.0
metadata:
author: your-org
version: "1.2.0"
---
Os campos name e description são obrigatórios. A descrição influencia o matching da skill. Uma descrição específica como “extract IOCs from CrowdStrike, ANY.RUN, or Joe Sandbox reports” tem mais chance de corresponder à solicitação pretendida do que “helps with security”, mas a ativação ainda precisa de evals em cada host.
Como funciona a ativação
Skills suportam tanto invocação explícita (via comandos como /skills ou $skill-name no Codex) quanto ativação implícita (agente decide com base na descrição da task). O comportamento varia por implementação de agente. O agente varre as skills disponíveis no startup, carregando apenas metadados. Quando um request corresponde à descrição de uma skill, o agente carrega as instruções completas.
Na maioria das implementações, a seleção de skill é primariamente guiada pelo texto da descrição e pelo raciocínio do agente, não por matching algorítmico estrito. Porém, algumas ferramentas podem incluir heurísticas ou pré-processamento adicional.
# Funciona: triggers específicos, escopo claro
description: Extract IOCs from malware sandbox reports and correlate with threat
intelligence. Use when processing CrowdStrike, ANY.RUN, or Joe Sandbox outputs,
or when asked to extract indicators from behavioral analysis reports.
# Não funciona: vago, sobrepõe muitos casos
description: Helps analyze security data and find threats.
Descrições vagas causam falhas silenciosas de ativação. Descrições muito amplas causam ativações falsas. Trate a descrição como SEO para o raciocínio do modelo.
Skills na prática: o repositório awesome-dfir-skills
O repositório tsale/awesome-dfir-skills oferece uma coleção comunitária útil focada em DFIR e incident response. Ele próprio descreve os artefatos como workflows para copiar e colar; não é uma implementação pronta do padrão Agent Skills:
A árvore muda conforme a coleção evolui; por isso, é mais seguro descrevê-la como um padrão de categorias e workflows, não como inventário fixo:
awesome-dfir-skills/
├── README.md
├── _templates/
│ └── skill.md # Template específico do repositório
└── <categoria>/
└── <workflow-id>/
└── skill.md # Workflow para copiar e colar
O entrypoint skill.md em minúsculas e vários campos customizados desse repositório não atendem à especificação tal como escrita. Um pacote compatível precisa usar o nome exato SKILL.md e frontmatter válido. Trate o repositório como material-fonte para adaptar e revisar, não como catálogo pronto para instalação.
Ainda vale a pena extrair seus princípios:
Be explicit about assumptions. Se uma fonte de log pode não existir, declare isso. Se você assume formato específico de timestamp, documente.
Declare inputs and outputs. Coloque requisitos estruturados de entrada e entregáveis esperados no corpo Markdown ou em um schema referenciado. inputs e outputs não são campos de frontmatter do padrão Agent Skills; metadados de catálogo customizados não devem ser apresentados como portáveis.
Safety-first. Explicite privacy e evidence handling. Analise anexos em laboratório local isolado ou sandbox privada e aprovada pela organização. Não envie samples, PII, credenciais ou evidências reguladas para API pública por padrão; comece por hashes quando possível e respeite retenção, cadeia de custódia e aprovação de fornecedores.
Tool-agnostic by default. Se incluir exemplos em Splunk/KQL/Elastic, rotule e explique field mapping. Skills portáveis funcionam em mais ambientes.
O insight aqui é que skills bem escritas funcionam como documentação executável. Um analista novo pode ler o SKILL.md para entender o procedimento, enquanto o agente executa automaticamente.
Skill 1: Initial Incident Intake
O workflow de origem identificado como triage.initial-incident-intake padroniza o intake da primeira hora. O exemplo abaixo adapta seus metadados ao padrão aberto sob o caminho initial-incident-intake/SKILL.md.
Metadados
---
name: initial-incident-intake
description: First-hour incident intake and scoping that produces an evidence
plan. Use for new cases, SOC-to-IR handoffs, or incomplete incident reports.
license: Apache-2.0
compatibility: Requires approved access to incident records; performs no production actions.
metadata:
author: awesome-dfir-skills-contributors
version: "0.1.0"
---
Os inputs, as restrições e os outputs apresentados abaixo pertencem às instruções Markdown (ou a um schema referenciado), não a campos YAML de topo fora do padrão.
Regras embutidas
A skill instrui o agente com constraints específicas:
- Se detalhes estão faltando, fazer perguntas direcionadas
- Não assumir que fontes de logs existem, confirmar
- Usar o fuso horário do reporter; se desconhecido, declarar explicitamente
Deliverables esperados
- Incident summary: 2-5 frases acionáveis
- Working hypothesis: o que você acha que está acontecendo + confiança
- Time window: da atividade suspeita mais antiga até a mais recente
- Known / Unknown: bullets separando o que se sabe do que não
- Immediate containment: ações safe e low-regret
- Evidence request: priorizado, com WHY para cada item
- Next 60 minutes plan: checklist executável
Evidence request starter list
A skill inclui uma lista base de artefatos por tipo de incidente:
| Tipo | Artefatos |
|---|---|
| Identity (Entra/AD/Okta) | Sign-in logs, audit logs, MFA events, risky sign-ins |
| Message trace, headers, URL click logs, mailbox audit, rules/forwarding | |
| Endpoints | EDR detections, timeline, process tree, network connections |
| Network | Proxy/DNS logs, firewall flows, VPN logs |
| Cloud | CloudTrail / GCP audit / Azure activity, object storage access |
Por que funciona: padroniza a qualidade do intake e força explicitação de suposições. O próximo analista do turno sabe exatamente onde o caso parou.
Skill 2: Malware Analysis
A skill malware-analysis produz relatórios analyst-grade, não dumps de dados. Cada conclusão deve ser sustentada por evidência e raciocínio.
Princípios centrais
- Evidence-based reasoning: nunca afirme uma conclusão sem explicar POR QUE
- Connect the dots: ligue indicadores a comportamentos a capacidades a impacto
- Assess confidence: declare quão confiante você está e por quê
- Actionable output: relatórios devem habilitar decisões, não apenas informar
Workflow de 3 passos
Passo 1: Collect Data - Execute scripts para coleta determinística:
# Análise estática: hashes, PE info, strings, APIs, entropy
python3 scripts/static_analysis.py /path/to/sample -f json > static.json
# Threat intelligence: reputação em múltiplas fontes
python3 scripts/triage.py -t file /path/to/sample -f json > triage.json
# Extração de IOCs: IPs, domains, URLs, hashes, registry keys
python3 scripts/extract_iocs.py /path/to/sample -f json > iocs.json
Passo 2: Analyze and Reason - O passo crítico:
Threat Intelligence Assessment:
- O que cada fonte realmente reporta, em qual data e para qual hash?
- Trate a razão do VirusTotal como evidência agregada de vendors, não como veredito. Não existe contagem universal que confirme maliciosidade, e falsos positivos ocorrem.
- Trate labels de família como hipóteses até que nomenclatura, configuração, comportamento e outras evidências independentes convirjam.
- Trate
first_seencomo timestamp daquela fonte, não como prova de campanha ativa.
API Analysis - mapeie APIs para comportamentos:
| Padrão de API | Comportamento provável | Raciocínio |
|---|---|---|
| OpenProcess + VirtualAllocEx + WriteProcessMemory + VirtualProtectEx + CreateRemoteThread | Possível process injection remota | A sequência é consistente com alocar, escrever, proteger e iniciar código em outro processo |
| CredEnumerate, CryptUnprotectData | Possível acesso a credenciais | As APIs podem enumerar credenciais ou abrir dados DPAPI, mas contexto e argumentos importam |
| InternetOpen + URLDownloadToFile | Possível downloader | Inicialização de rede e download podem ter usos legítimos ou maliciosos |
| RegSetValueEx + Run key paths | Possível persistência | Escrita em Run key pode configurar startup, mas imports não mostram que ocorreu |
| IsDebuggerPresent, GetTickCount | Possível anti-analysis | Essas APIs têm usos benignos e exigem contexto de call site ou runtime |
O sufixo Ex importa: VirtualAlloc aloca no processo chamador, enquanto VirtualAllocEx e VirtualProtectEx atuam sobre um processo especificado. Mesmo a sequência completa de imports é apenas evidência estática de primitivas disponíveis; comprovar injection exige análise dos call sites ou telemetria de runtime mostrando chamadas com o processo-alvo e buffers relevantes.
Packing indicators:
- Entropia alta (por exemplo, acima de 7,0 em uma medida por byte) é compatível com compressão, criptografia ou packing; não prova nenhuma delas
- Sections UPX0, UPX1 ou
.aspacksão indicadores de packer que ainda exigem validação - Import table pequena centrada em
GetProcAddress/LoadLibraryé compatível com resolução dinâmica de APIs, não prova de comportamento malicioso
Passo 3: Write the Report - Estrutura padronizada:
# Threat Analysis Report: [MALWARE_NAME]
| | |
|---|---|
| Risk Level | CRITICAL/HIGH/MEDIUM/LOW |
| Confidence | High/Medium/Low |
| Analysis Date | DATE |
## Executive Summary
[2-3 frases: O que é isso? É malicioso? O que pode fazer? Como sabemos?]
## Threat Intelligence Assessment
[O que as fontes de threat intelligence dizem? Explique o que cada achado significa]
## Behavioral Analysis
### Identified Capabilities
[Para cada capacidade: confiança + evidência + raciocínio]
## MITRE ATT&CK Mapping
[Apenas técnicas que você pode justificar com evidência]
## Indicators of Compromise
[Indicadores de arquivo, rede e host]
## Risk Assessment
[Risco geral + justificativas + nível de confiança]
## Recommendations
[Ações imediatas + oportunidades de detecção + análises adicionais necessárias]
Exemplo: análise ruim vs boa
Ruim (data dump):
“Found APIs: VirtualAlloc, CreateRemoteThread, RegSetValueEx. Entropy: 7.2. VT: 34/70.”
Boa (analyst reasoning):
“Static analysis found
VirtualAllocEx,WriteProcessMemory,VirtualProtectEx, andCreateRemoteThread, a combination consistent with a remote-injection primitive. Imports alone do not prove those calls executed; confirm with call-site analysis or a runtime trace. Entropy of 7.2 is consistent with compressed or encrypted content but is not proof of packing. A 34/70 VirusTotal ratio is material multi-vendor evidence, not automatic confirmation of maliciousness or an Agent Tesla family label; corroborate attribution with behavior, configuration, and independent sources.”
Por que funciona: combina tooling determinista (scripts) com framework de raciocínio estruturado. Evita conclusões confiantes mas incorretas, e força o analista (humano ou IA) a explicar o “por quê” de cada finding.
Essa skill foi parte da inspiração para a skill de PDF triage apresentada na próxima seção - aplicando o mesmo princípio de raciocínio estruturado para análise de documentos.
Da teoria à prática: uma skill para triagem de documentos
As skills acima demonstram o padrão: inputs declarados, outputs estruturados, raciocínio explícito. Mas teoria é teoria. Vamos para um caso real.
PDFs e documentos são vetores de ataque persistentes. Em 2025, o cenário só piorou:
- Q1 2025: APWG registrou mais de 1 milhão de ataques de phishing - o maior total trimestral desde 2023. PDFs com QR codes maliciosos (quishing) explodiram após a Microsoft bloquear macros por padrão em documentos Office.
- Q4 2025: O malware SORVEPOTEL (da campanha Water Saci) atingiu o Brasil com força. Arquivos simulando comprovantes de pagamento e boletos chegavam via WhatsApp; o SORVEPOTEL em si é primariamente o mecanismo de auto-propagação, espalhando-se para todos os contatos da vítima, enquanto o trojan bancário associado à campanha (Maverick) faz o roubo de credenciais de Bradesco, Itaú, Caixa, Banco do Brasil e corretoras de cripto.
O padrão é claro: documentos são confiáveis por padrão, passam por filtros, e usuários abrem sem pensar duas vezes - especialmente quando vêm de contatos conhecidos no WhatsApp. Atacantes sabem disso.
O problema para analistas N1
Na triagem de primeira linha, o fluxo típico é:
- Alerta chega (email suspeito, anexo reportado)
- Analista consulta o hash e fontes de reputação aprovadas; upload do sample exige aprovação de tratamento de dados
- Analista trata detecções e labels como evidência e as corrobora antes da disposição
O problema: resultado com zero detecções não estabelece que o arquivo é seguro, enquanto uma ou mais detecções podem ser falsos positivos. Analistas N1 também podem não ter tempo, ferramentas ou conhecimento para análise estática manual de PDFs.
Criei a skill pdf-triage-plus para resolver isso (pretendo publicá-la junto com outras skills no GitHub em breve). A ideia é empacotar conhecimento de análise estática em um procedimento repetível, com score de priorização e outputs acionáveis. Esse score é uma heurística interna de triagem, não uma verdade de terreno.
A skill combina ferramentas determinísticas com análise estrutural. Ela revela estruturas e código que exigem contexto; não observa comportamento em runtime.
Caso de triagem estática: score heurístico interno 95/100 vs contagem de detecções do VirusTotal 0/63
Para exercitar o workflow, criei um PDF contendo JavaScript de Acrobat ofuscado e suspeito. A comparação mostra o que o procedimento estático revelou e os vendors do VirusTotal não marcaram naquele scan; não comprova que a cadeia de execução alegada funcionou.
O sample
PDF simples. Título: “System Security Report”. Subtítulo: “Confidential - Security Team”. Uma página. Social engineering direcionado a equipes de segurança - bem irônico.
Primeiro passo: consulte o hash no VirusTotal. Upload do sample exige aprovação de privacidade, tratamento de evidências e fornecedor.
SHA256: 0caff9ea55aa25a6333b6e648838cd0652f50f3fba2784153d11024e68e5e63e
Detections: 0/63

Nenhum dos 63 vendors marcou o arquivo naquele scan. O VirusTotal agrega outputs de vendors e não emite veredito próprio; portanto, 0/63 significa “não detectado”, não “seguro”.
Segundo passo: skill de PDF triage.

Risk Score: 95/100 - CRITICAL PRIORITY
Assessment: SUSPICIOUS - manual and dynamic validation required

A etapa estática extraiu script codificado e IOCs candidatos. O score alto priorizou corretamente a revisão, mas o label original MALICIOUS - Dropper/Downloader era forte demais para a evidência disponível.
O que o VirusTotal viu
O VirusTotal combina outputs de vendors independentes; esses produtos podem usar assinaturas, heurísticas, ML, emulação ou outros métodos. O resultado registra o que cada vendor detectou em determinado momento. Pode conter falsos negativos e falsos positivos, e a contagem de detecções não é um classificador universal.
O pdfid básico mostra:
/JavaScript 0 ← Contador de resumo ausente
/OpenAction 0 ← Nenhuma ação de abertura contada
/Launch 0 ← Nenhuma ação Launch contada
/AA 1 ← Uma entrada de ação adicional presente
/AcroForm 1
O sample construído omitiu flags comuns de topo e colocou uma ação adicional em um form field. Isso explica por que a inspeção profunda foi útil; não estabelece por que cada vendor deixou de detectar.
O que a skill viu
A skill não para nos flags. Ela extrai e analisa o conteúdo dos streams:
Object 6:
/Type /Annot
/Subtype /Widget
/T (sys_field)
/Rect [ 0 0 1 1 ] ← Widget minúsculo de 1×1 unidade no espaço do usuário
/AA <<
/F <<
stream
var parts = 'Ly8gU3l...'
O script suspeito estava em /AA (Additional Actions) dentro de um widget de formulário cujo retângulo mede 1×1 unidade no espaço do usuário do PDF. Essa geometria é minúscula, mas não comprova invisibilidade por si só: a renderização depende da página e do viewer. A decodificação estática remontou texto Base64 fragmentado; nenhum trace de runtime foi publicado.
Não vou colocar o código todo decodificado porque não é o objetivo desse post.
O texto decodificado parecia expressar intenção de aguardar, gravar um .ps1 em %TEMP% e invocar PowerShell. Isso é uma hipótese estática suspeita, não uma cadeia observada. O material publicado não traz sample ou gerador, output bruto, versão/configuração do Acrobat/Reader nem trace dinâmico necessários para reproduzir o comportamento.
O que a triagem estática estabeleceu
A diferença fundamental está na pergunta que cada abordagem faz:
Scan de reputação pergunta: “Algum vendor marcou este artefato neste momento?”
Análise estrutural pergunta: “Isto contém estruturas ou código que merecem investigação?”
A segunda pergunta revelou evidência que merece escalação, mas inspeção estática sozinha não comprova comportamento em runtime.
A triagem estática é útil porque:
- Extrai streams além dos flags de resumo - Contagem
/JavaScriptzerada não encerra a inspeção quando outros objetos contêm dados semelhantes a código - Tenta decodificação em camadas - Registra transformações Base64, hex ou charcode e mantém texto decodificado separado de execução observada
- Confere a semântica das APIs alegadas - a API documentada do Acrobat não possui
util.writeToFile;app.launchURLabre uma URL no navegador e não é primitiva de execução do PowerShell. O Acrobat moderno também restringe URLsfile:ejavascript:a contextos privilegiados - Combina indicadores para priorização - nenhum indicador ou score isolado é definitivo; validação dinâmica é necessária antes de afirmar execução
Lição operacional
Contagem de detecções do VirusTotal = 0 → NÃO significa seguro
Detecções do VirusTotal → evidência, não confirmação automática
Não use somente a razão do VirusTotal para decidir sobre um anexo suspeito. Zero detecções exige análise adicional quando o contexto continua suspeito; resultados positivos também exigem revisão porque vendors podem produzir falsos positivos. Triagem estrutural estática complementa reputação e análise dinâmica, sem substituir nenhuma delas.
Limitações e riscos
Prompt injection via artefatos analisados
Quando a skill processa logs, emails ou relatórios, o conteúdo pode conter instruções que sequestram o agente. Exemplo: hostname malicioso curl-commands.please-run-rm-rf.example.com ou instruções escondidas em PDFs.
Defense in depth:
- Separação e sanitização de conteúdo
- Demarcação explícita de conteúdo não confiável
- Detecção especializada antes da análise
- Laboratório local isolado ou sandbox privada/aprovada, com filesystem e rede restritos
- Aprovação humana para ações de alto risco
- Testes adversariais contínuos
Risco de supply chain de Skills
Skills podem conter código executável. Uma skill maliciosa pode executar comandos, exfiltrar dados ou manipular o workflow. Não presuma signing ou proveniência verificada: confira os controles atuais do host e valide origem, revisão e integridade do pacote.
Controles requeridos:
- Revisão de código para todos os arquivos
- Inventário com versionamento
- Fontes confiáveis apenas
- Monitoramento de alterações não autorizadas
Alucinação em contexto de segurança
LLMs podem inventar IOCs, classificar errado, gerar análise confiante mas incorreta.
Mitigações: use scripts para validação factual, cross-verifique contra fontes autoritativas, mantenha humanos no loop para classificações.
Conclusão
Skills representam uma mudança de prompts ad-hoc para procedimentos versionados e auditáveis. Para operações de segurança: consistência entre turnos, captura de conhecimento institucional, workflows reproduzíveis.
O caso do PDF demonstra um valor mais estreito: em um sample construído pelo autor, a triagem estática revelou estruturas suspeitas que 63 vendors do VirusTotal não marcaram naquele scan. Ela não comprovou a execução alegada do PowerShell. Reputação, análise estrutural, análise dinâmica controlada e revisão humana respondem a perguntas diferentes e devem ser combinadas.
O approach pragmático:
- Comece pequeno: Skills de reporting antes de triagem de produção
- Isole deliberadamente: Use laboratório local isolado ou sandbox privada e aprovada; restrinja filesystem e rede e proteja a confidencialidade de samples/PII
- Humanos no loop: Gates para ações de alto impacto
- Audite evidências verificáveis: Registre tool calls, inputs e outputs, hashes, versões, fontes, aprovações e decisões explícitas do analista; não use reasoning traces ocultos como trilha primária
- Teste adversarialmente: Prompt injection nos testes
- Version control: Skills são código, com reviews e rollback
Meu repositório: CyberSec-Skills
A comunidade está construindo: awesome-dfir-skills oferece material para adaptar. A especificação aberta em agentskills.io melhora o reuso, mas ferramentas e controles específicos de cada host ainda exigem validação.
Referências
Documentação oficial
- OpenAI: Build skills for ChatGPT e Codex
- Claude Code Skills
- Agent Skills Platform Docs
- Anthropic Engineering Blog
- VirusTotal: Falsos positivos e resultados agregados de vendors
- Microsoft: VirtualAlloc e VirtualAllocEx
- Microsoft: VirtualProtectEx
- Referência da API JavaScript do Adobe Acrobat
Especificação open standard
Repositórios de referência
- DFIR Skills Collection
- OpenAI Skills Repository
- Awesome Agent Skills
- CyberSec-Skills (repositório do autor)
Segurança e riscos
Sample do case study
Threat intelligence
- APWG Phishing Activity Trends Report Q1 2025
- Trend Micro - Self-Propagating Malware Spreading Via WhatsApp (Water Saci / SORVEPOTEL)
Esta análise foi revisada contra documentação pública em julho de 2026. Detalhes podem mudar; valide a documentação atual dos vendors antes de deploy em produção.