FlowSentry
& injeção de SQL, sinks de exfiltração). Servidor MCP gratuito + API x402 paga, scanner de segurança para exportações de fluxos n8n: 18 regras de análise estática mapeadas para OWASP Agentic AI (autenticação de webhook, segredos codificados, SSRF/IMDS, comando (0,50 USDC/scan, liquidado na Base).
Documentação
FlowSentry
Scanner de segurança para workflows do n8n — 18 regras, zero dependências, pronto para CI.
O FlowSentry analisa seus exports JSON de workflows do n8n e sinaliza as falhas que continuamos vendo na prática: webhooks sem autenticação, segredos hardcoded, SSRF para metadados de nuvem, injeção de shell via Execute Command, nós de código estilo eval, SQL construído a partir de entrada do usuário, credenciais com escopo excessivo e muito mais. Saída: terminal, JSON, SARIF 2.1.0 (GitHub Code Scanning) e um relatório HTML autônomo.
- Zero dependências em tempo de execução (somente stdlib Python pura, Python 3.9+)
- 18 regras mapeadas para o OWASP Agentic Top 10 (2026)
- Saída SARIF → envio direto para o GitHub Code Scanning
- Código de saída 1 em caso de achados → use no CI como gate de qualidade
$ pip install flowsentry
$ flowsentry scan workflows/ --sarif flowsentry.sarif
PyPI: https://pypi.org/project/flowsentry/ · ou instale direto do GitHub:
pip install git+https://github.com/vasilicasijarvis/flowsentry.git
Sem instalação alguma:
git clone https://github.com/vasilicasijarvis/flowsentry
cd flowsentry
python3 flowsentry_cli.py scan ./workflows
Por quê
Webhooks do n8n são não autenticados por padrão. A maioria das instâncias self-hosted fica atrás de um único proxy reverso, e um único workflow exportado é suficiente para vazar uma chave de API hardcoded ou um nó Execute Command que interpola dados de requisição diretamente em um shell.
Escaneamos 10 arquivos reais e públicos de workflows do n8n do GitHub com o FlowSentry v0.1:
| Arquivo (repositório de origem) | Crítico | Médio | Achado notável |
|---|---|---|---|
AI_Bot.json (AnaamRasool/WhatsApp-Bot) | 1 | 4 | Webhook do WhatsApp com authentication: none, respostas ecoam saída completa do nó |
00485-library-install.json (DragonJAR/n8n-workflows-esp) | 2 | 1 | Script Bash interpolando {{$json.library}} em shell |
n8n/w1.json (Finfra/dockers) | 1 | 2 | Webhook authentication: 'none' |
workflows/103.json (n8n-io/test-workflows) | 4 | 2 | echo 'test' > /tmp/{{$node["Set"].json["filename"]}} |
subagente-citas.json (santifer/jacobo-workflows) | 1 | 9 | Webhook público de agendamento de consultas, sem autenticação |
nl2sql.json (Wilsonoonn/n8n_nl2sql) | 1 | 9 | Linguagem natural para SQL atrás de um webhook não autenticado |
api-authentication.json (yorrickjansen/n8n-webhook-security) | 1 | 5 | Os próprios webhooks de demonstração aceitam requisições não autenticadas |
AIDA Preisalarm, nl2sql helper, openwebui-pipe (mais 3 arquivos) | 0 | 7 | nós de código, tratamento de erros ausente, modos de resposta |
Totais: 11 críticos, 39 médios em 10 arquivos. 100% dos arquivos tinham pelo menos um achado.
Estes são exports públicos de workflows compartilhados pelos autores para fins de aprendizado/demonstração — nada foi explorado e nenhuma instância foi acessada. O FlowSentry é uma ferramenta defensiva: ele lê arquivos JSON, não envia requisições.
Achados reais, na íntegra
1. Injeção de shell via Execute Command (workflow de teste oficial do n8n):
[!] CRITICAL FS005 Execute Command node without guardrails
node: Execute Command (n8n-nodes-base.executeCommand)
[!] CRITICAL FS009 Expression-based command injection
node: Execute Command
evidence: echo 'test' > /tmp/{{$node["Set"].json["filename"]}}
fix: Never interpolate data into commands; use argv-style APIs or strict
allowlist validation of the entire command string.
2. Webhooks não autenticados (5 de 10 arquivos):
[!] CRITICAL FS001 Webhook endpoint without authentication
node: HTTP Trigger (n8n-nodes-base.webhook)
Webhook node has authentication set to 'none'. Anyone who can reach the
n8n instance can trigger this workflow and its downstream actions.
fix: Set Webhook > Authentication to Basic/Header/JWT auth, or validate a
shared-secret header in the workflow before doing anything sensitive.
3. O que as outras regras detectam (exemplo elaborado da suíte de testes):
[!] CRITICAL FS002 Hardcoded secret in node parameters
Parameter 'accessToken' looks like it contains a hardcoded secret
(literal value, no expression). Exports of workflows leak like this.
fix: Move the value into an n8n credential and reference it via expressions.
As regras FS002–FS004, FS011–FS013 e FS015–FS018 (segredos, SSRF/IMDS, injeção de SQL, http simples, nós da comunidade, sinks de exfiltração) não dispararam nesta amostra específica, mas estão totalmente cobertas pela suíte de 40 testes em tests/test_rules.py.
Execução real, 2026-09-06 — flowsentry scan examples/real nos 10 exports públicos de workflows (código de saída 1 como esperado em achados críticos):
examples/real/AI_Bot.json (WhatsApp bot) - 5 finding(s)
[!] CRITICAL FS001 Webhook endpoint without authentication
node: HTTP Trigger (n8n-nodes-base.webhook)
[~] MEDIUM FS017 Webhook response mode exposes internals
node: API: JWT auth with auth server validation (n8n-nodes-base.webhook)
Webhook responseMode='responseNode' - the last node's full output (possibly
including credentials, internal IDs, stack traces) is returned to the
unauthenticated caller.
fix: Return an explicit minimal payload via the Respond to Webhook node.
Summary
critical: 11 high: 0 medium: 39 low: 0
Result: FAIL - fix critical/high findings before production.
Resultados completos legíveis por máquina: examples/scan_report.json,
examples/scan_report.sarif e
examples/scan_report.html.
Regras (v0.1)
| Regra | Severidade | Detecta |
|---|---|---|
| FS001 | crítico | Endpoint de webhook sem autenticação |
| FS002 | crítico | Segredo hardcoded em parâmetros de nó |
| FS003 | alto | Segredo hardcoded em cabeçalho/query HTTP |
| FS004 | crítico | SSRF / acesso a endpoint de metadados de nuvem (IMDS 169.254.169.254, GCP, Alibaba) |
| FS005 | crítico | Nó Execute Command sem proteções |
| FS006 | médio | Nó de código sem hardening de sandbox (sem task runners) |
| FS007 | crítico | Construção dinâmica de código (eval, new Function, child_process, os, subprocess, $() dinâmico) |
| FS008 | médio | Escopo excessivo de credenciais (nomes admin/root/owner, tipos incomuns) |
| FS009 | crítico | Injeção de comando baseada em expressões ({{$json...}} em shell) |
| FS010 | médio | Tratamento de erros ausente (sem errorWorkflow, sem Error Trigger) |
| FS011 | alto | SQL bruto construído a partir de expressões |
| FS012 | alto | Nó HTTP sobre http:// simples |
| FS013 | médio | Trigger exposto (Form/Telegram/IMAP aceitando entrada não autenticada) |
| FS014 | médio | Reutilização de credenciais em 5+ nós |
| FS015 | médio | Pacotes de nós comunitários/desconhecidos |
| FS016 | médio | Dados enviados a sinks estilo exfiltração (webhook.site, pastebin, ngrok…) |
| FS017 | médio | Modo de resposta de webhook ecoando dados internos |
| FS018 | médio | Nó Set armazenando segredos em texto puro |
Uso
# Scan files or directories (directories are walked for *.json)
flowsentry scan ./workflows
flowsentry scan export1.json export2.json
# Machine-readable outputs
flowsentry scan ./workflows --json report.json --sarif report.sarif --html report.html
# CI gate: exit 1 when findings at/above severity exist (default: high)
flowsentry scan ./workflows --fail-on critical
flowsentry scan ./workflows --fail-on never # always exit 0
# List rules
flowsentry rules
GitHub Actions
name: flowsentry
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12" }
- run: pip install git+https://github.com/vasilicasijarvis/flowsentry.git
- run: flowsentry scan ./workflows --sarif flowsentry.sarif --fail-on high
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: flowsentry.sarif
Escanear um bundle de export do n8n
# From your n8n UI: Workflows > Export (or via n8n CLI)
n8n export:workflow --all --output=./workflows
flowsentry scan ./workflows --html report.html
Demonstração

Desenvolvimento
git clone https://github.com/vasilicasijarvis/flowsentry
cd flowsentry
python3 tests/run_tests.py # 40 tests, zero dependencies
Buscar novamente os workflows públicos de exemplo usados no scan do README:
python3 scripts/fetch_workflows.py
flowsentry scan examples/real --json examples/scan_report.json
Roadmap
- v0.2 — escaneamento ao vivo via API REST do n8n, detecção de drift (workflow alterado desde o último scan)
- v1.0 — FlowSentry Cloud: monitoramento contínuo, alertas, dashboard multi-instância
- v1.5 — auditoria de configuração de servidores MCP (envenenamento de ferramentas, lacunas de autenticação, versões não fixadas)
- v2.0 — pacotes de evidência de conformidade (OWASP Agentic Top 10, EU AI Act, SOC 2)
A versão hospedada e contínua está em desenvolvimento — entre na lista antecipada: flowsentry.vercel.app
Licença
Apache-2.0. Escaneie seus próprios workflows ou exports que você tenha permissão para analisar.