The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the FlowSentry listing page.
Security scanner for n8n workflows — 18 rules, zero dependencies, CI-ready.
FlowSentry parses your n8n workflow JSON exports and flags the failures we keep seeing in
the wild: unauthenticated webhooks, hardcoded secrets, SSRF to cloud metadata, shell
injection through Execute Command, eval-style code nodes, SQL built from user input,
over-scoped credentials and more. Output: terminal, JSON, SARIF 2.1.0 (GitHub Code
Scanning) and a self-contained HTML report.
PyPI: https://pypi.org/project/flowsentry/ · or install straight from GitHub:
pip install git+https://github.com/vasilicasijarvis/flowsentry.git
No install at all:
n8n webhooks are unauthenticated by default. Most self-hosted instances sit behind a
single reverse proxy, and one exported workflow is enough to leak a hardcoded API key or
an Execute Command node that interpolates request data straight into a shell.
We scanned 10 real, public n8n workflow files from GitHub with FlowSentry v0.1:
| File (source repo) | Critical | Medium | Notable finding |
|---|---|---|---|
AI_Bot.json (AnaamRasool/WhatsApp-Bot) | 1 | 4 | WhatsApp webhook with authentication: none, replies echo full node output |
00485-library-install.json (DragonJAR/n8n-workflows-esp) | 2 | 1 | Bash script interpolating {{$json.library}} into 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 | Public appointment-booking webhook, no auth |
nl2sql.json (Wilsonoonn/n8n_nl2sql) | 1 | 9 | Natural-language-to-SQL behind an unauthenticated webhook |
api-authentication.json (yorrickjansen/n8n-webhook-security) | 1 | 5 | Demo webhooks themselves accept unauthenticated requests |
AIDA Preisalarm, nl2sql helper, openwebui-pipe (3 more files) | 0 | 7 | code nodes, missing error handling, response modes |
Totals: 11 critical, 39 medium across 10 files. 100% of files had at least one finding.
These are public workflow exports shared by their authors for learning/demo purposes — nothing was exploited and no instance was accessed. FlowSentry is defensive tooling: it reads JSON files, it does not send requests.
1. Shell injection via Execute Command (n8n official test workflow):
2. Unauthenticated webhooks (5 of 10 files):
3. What the other rules catch (crafted example from the test suite):
Rules FS002–FS004, FS011–FS013 and FS015–FS018 (secrets, SSRF/IMDS, SQL injection,
plain http, community nodes, exfil sinks) did not fire on this particular sample but are
fully covered by the 40-test suite in tests/test_rules.py.
Real run, 2026-09-06 — flowsentry scan examples/real on the 10 public workflow
exports (exit code 1 as expected on critical findings):
Full machine-readable results: examples/scan_report.json,
examples/scan_report.sarif and
examples/scan_report.html.
| Rule | Severity | Detects |
|---|---|---|
| FS001 | critical | Webhook endpoint without authentication |
| FS002 | critical | Hardcoded secret in node parameters |
| FS003 | high | Hardcoded secret in HTTP header/query |
| FS004 | critical | SSRF / cloud metadata endpoint access (IMDS 169.254.169.254, GCP, Alibaba) |
| FS005 | critical | Execute Command node without guardrails |
| FS006 | medium | Code node without sandbox hardening (no task runners) |
| FS007 | critical | Dynamic code construction (eval, new Function, child_process, os, subprocess, dynamic $()) |
| FS008 | medium | Credential over-scoping (admin/root/owner names, unusual types) |
| FS009 | critical | Expression-based command injection ({{$json...}} into shell) |
| FS010 | medium | Missing error handling (no errorWorkflow, no Error Trigger) |
| FS011 | high | Raw SQL built from expressions |
| FS012 | high | HTTP node over plain http:// |
| FS013 | medium | Exposed trigger (Form/Telegram/IMAP accepting unauthenticated input) |
| FS014 | medium | Credential reuse across 5+ nodes |
| FS015 | medium | Community/unknown node packages |
| FS016 | medium | Data sent to exfil-style sinks (webhook.site, pastebin, ngrok…) |
| FS017 | medium | Webhook response mode echoing internal data |
| FS018 | medium | Set node storing secrets in plaintext |

Re-fetch the public example workflows used in the README scan:
The hosted, continuous version is in the works — join the early list: flowsentry.vercel.app
Apache-2.0. Scan your own workflows or exports you have permission to analyze.