Source analysis
Rowan builds a call graph across your entire codebase and follows tainted data from source to sink, across imports, modules, and async boundaries. A three-hop taint path across different files is invisible to pattern matching. That’s where the real findings are.
In the wild
A vulnerable dependency only matters if your code can actually reach it. Rowan traces the call graph to tell the difference, surfacing real, reachable issues in the frameworks production AI applications depend on.
The limitation
An SSRF that crosses two files and an async boundary won’t show up in a single-file scan. Rowan follows the full path and shows you exactly where it breaks.
Coverage
HTTP params, CLI args, env vars: tracked to dangerous sinks across files, imports, and async function boundaries.
torch.load(), trust_remote_code=True, apply_chat_template(): each has dedicated rules that understand what these do in an AI context. A general-purpose scanner doesn’t know what they mean.
Static analysis of binary model files (pickle checkpoint formats, GGUF metadata, and Keras layers) before they are loaded into memory.
Only surfaces CVEs your code can actually reach. Most SCA tools report vulnerabilities in functions you never call. This doesn’t.
Taint flows into LLM system prompts, RAG contexts, and Jinja2 template rendering. The full attack chain, not just the sink.
Named rules for LangChain, Keras, OmegaConf, ONNX Hub, Gradio, and other AI infrastructure libraries. These aren’t in general-purpose scanner rule sets.
Architecture
Each engine covers a different class of vulnerability. Results are combined, deduplicated, and ranked before output, so you see one prioritised finding list, not four separate reports.
Follows user-controlled data from HTTP handlers and CLI args across file and function boundaries to dangerous sinks. The finding includes every hop: source, intermediate calls, and sink.
AST-based rules written specifically for AI frameworks: unsafe model loading, missing auth on inference endpoints, misconfigurations in LangChain, Keras, OmegaConf, and similar. These aren’t in general-purpose rule sets.
Checks your dependencies against the CVE database, then traces whether the vulnerable function is reachable from your entry points. If there’s no call path, it’s suppressed. In practice this cuts most of the noise conventional SCA surfaces.
An agentic pipeline that forms hypotheses about where vulnerabilities exist, traces potential exploit paths, and tries to confirm them. Not a CI tool. Use it for research and deep audits.
Output
Every finding gets a confidence score based on source clarity, taint path length, and whether sanitizers appear in the path. High-confidence findings are direct exploit paths. Lower ones are patterns worth a look. Filter to the top tier if you want a short list.
| SARIF 2.1 | IDE and GitHub Advanced Security |
| JSON | Programmatic integration |
| HTML | Shareable report |
| CSV | Ticket import |
| CycloneDX AI-BOM | Supply chain attestation |
Setup
Runs locally with no infrastructure required. Also available as a FastAPI web service with project management, triage dashboard, and REST endpoints for CI integration.
Changed-file scanning, PR security gates, and a GitHub Actions template are included. The free Gemini API tier is sufficient for most repositories.