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

self-scan PyPI Python License

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íticoMédioAchado notável
AI_Bot.json (AnaamRasool/WhatsApp-Bot)14Webhook do WhatsApp com authentication: none, respostas ecoam saída completa do nó
00485-library-install.json (DragonJAR/n8n-workflows-esp)21Script Bash interpolando {{$json.library}} em shell
n8n/w1.json (Finfra/dockers)12Webhook authentication: 'none'
workflows/103.json (n8n-io/test-workflows)42echo 'test' > /tmp/{{$node["Set"].json["filename"]}}
subagente-citas.json (santifer/jacobo-workflows)19Webhook público de agendamento de consultas, sem autenticação
nl2sql.json (Wilsonoonn/n8n_nl2sql)19Linguagem natural para SQL atrás de um webhook não autenticado
api-authentication.json (yorrickjansen/n8n-webhook-security)15Os próprios webhooks de demonstração aceitam requisições não autenticadas
AIDA Preisalarm, nl2sql helper, openwebui-pipe (mais 3 arquivos)07nó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-06flowsentry 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)

RegraSeveridadeDetecta
FS001críticoEndpoint de webhook sem autenticação
FS002críticoSegredo hardcoded em parâmetros de nó
FS003altoSegredo hardcoded em cabeçalho/query HTTP
FS004críticoSSRF / acesso a endpoint de metadados de nuvem (IMDS 169.254.169.254, GCP, Alibaba)
FS005críticoNó Execute Command sem proteções
FS006médioNó de código sem hardening de sandbox (sem task runners)
FS007críticoConstrução dinâmica de código (eval, new Function, child_process, os, subprocess, $() dinâmico)
FS008médioEscopo excessivo de credenciais (nomes admin/root/owner, tipos incomuns)
FS009críticoInjeção de comando baseada em expressões ({{$json...}} em shell)
FS010médioTratamento de erros ausente (sem errorWorkflow, sem Error Trigger)
FS011altoSQL bruto construído a partir de expressões
FS012altoNó HTTP sobre http:// simples
FS013médioTrigger exposto (Form/Telegram/IMAP aceitando entrada não autenticada)
FS014médioReutilização de credenciais em 5+ nós
FS015médioPacotes de nós comunitários/desconhecidos
FS016médioDados enviados a sinks estilo exfiltração (webhook.site, pastebin, ngrok…)
FS017médioModo de resposta de webhook ecoando dados internos
FS018médioNó 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

FlowSentry demo

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.