Documentation
June 28, 2026 · View on GitHub
Contents
- About OpenTaint
- What OpenTaint Catches
- Installation
- Usage
- Configuration
- CI/CD Integration
- Troubleshooting
- Support
- License
Guides
- Installation Guide - Full installation instructions
- Usage Guide - Comprehensive usage reference
- Configuration Guide - All configuration options
- Docker - Run OpenTaint in containers and CI/CD pipelines
- Precompiled Classes and JARs Analysis - Analyze pre-built artifacts when source compilation isn't available
- Spring Boot Endpoint Extraction - Automatic HTTP endpoint mapping for Spring applications
- Troubleshooting Guide - Detailed troubleshooting
- FAQ - Frequently asked questions
About OpenTaint
AI generates production code faster than today's security tooling can keep up with. The code looks production-ready — yet it buries vulnerabilities in data flows that are fundamentally hard to catch. These include untrusted input winding through framework abstractions, cross-controller interactions with persistence layers, and async code. At the rate AI produces it, humans can't review this code at the depth it requires.
The tools meant to help aren't keeping up either — AST-pattern matchers catch surface-level issues but struggle to follow data flow across function and file boundaries, LLM agents burn tokens on every file and still produce inconsistent results, and enterprise analyzers that go further gate their analysis behind a paywall, with rule sets that rarely cover your stack.
The more AI writes code, the more you need formal methods underneath.
Find what AST-pattern matchers miss
The engine runs IFDS-with-abduction — formal inter-procedural dataflow analysis. It tracks untrusted data from HTTP inputs to dangerous APIs across endpoints, persistence layers, object fields, aliased references, and async code. That includes multi-hop attack paths — cross-endpoint flows, stored injections, data through object fields and aliases — at monorepo scale. 100+ rules across 20+ vulnerability classes.
Models Spring data flow and the full Boot ecosystem, analyzing Java and Kotlin at bytecode level. More languages and frameworks ahead.
One finding becomes total coverage
LLM security agents find things — but at token cost per file, with results that shift each run, and no guarantee of complete coverage. AST-pattern rules turn their findings into leverage. For every vulnerability an agent uncovers, it can enact a rule — a source, a sink, and the data flow between them — which the agent can write itself. The engine applies that rule across the entire codebase, deterministically, in minutes of CPU. When a finding is a false positive, a sanitizer can be added to the rule — the refinement propagates to every match, permanently. One discovery compounds across the entire codebase.
The entire system is designed to work with AI agents. Formal analysis produces reproducible results agents can act on without introducing uncertainty. Rules read like code, not a proprietary DSL — so agents write and tune them the same way humans do.
Open source, batteries included
Engine, CLI, GitHub Action, GitLab CI, rules — the entire stack, including the deep analysis, is released under Apache 2.0 and MIT. No paid tier to unlock taint tracking. No vendor lock-in on your rule library. Other tools make you pay for it — Semgrep gates inter-procedural taint tracking behind a paid Pro tier, CodeQL requires GHAS for private repos. OpenTaint doesn't.
What OpenTaint Catches
The engine tracks data from controller parameters through your web application to dangerous sinks.
Consider a search endpoint that concatenates user input into SQL:
// UserController.java
@GetMapping("/users/search")
public List<User> searchUsers(@RequestParam String name) {
String sql = "SELECT * FROM users WHERE name = '" + name + "'";
return jdbcTemplate.query(sql, userRowMapper);
}
OpenTaint reports: sql-injection-in-spring-app at GET /users/search — untrusted input flows to SQL query.
Consider a greeting endpoint that reflects user input without escaping:
// GreetingController.java
@GetMapping("/greet")
@ResponseBody
public String greet(@RequestParam String name) {
return "<h1>Hello, " + name + "!</h1>";
}
OpenTaint reports: xss-in-spring-app at GET /greet — user input returned without HTML escaping.
Consider a proxy endpoint that passes a user-controlled URL directly to an HTTP client:
// ProxyController.java
@GetMapping("/fetch")
public String fetchUrl(@RequestParam String url) {
return restTemplate.getForObject(url, String.class);
}
OpenTaint reports: ssrf-in-spring-app at GET /fetch — user-controlled URL passed to HTTP client.
Each finding includes the HTTP endpoint, making it easy to map your application's attack surface.
Installation
| Method | Command |
|---|---|
| Homebrew (Linux/macOS) | brew install --cask seqra/tap/opentaint |
| npm / npx (Linux/macOS/Windows) | npm install -g @seqra/opentaint — or npx @seqra/opentaint scan to run without installing (needs Node.js) |
| Install script (Linux/macOS) | curl -fsSL https://opentaint.org/install.sh | bash |
| Install script (Windows PowerShell) | irm https://opentaint.org/install.ps1 | iex |
| Install script (Windows CMD) | curl -fsSL https://opentaint.org/install.cmd -o install.cmd && install.cmd && del install.cmd |
| Docker | See Docker docs |
| Binary | Download from releases |
Release archives come in three variants: opentaint-full (binary + JARs + rules + JRE), opentaint (binary + JARs + rules), and opentaint-cli (binary only). Homebrew and install scripts default to full.
For detailed instructions, see Installation Guide.
Usage
opentaint scan # Scan current directory
npx @seqra/opentaint scan # Run without installing (needs Node.js)
opentaint scan --output results.sarif # Scan with explicit output path
opentaint summary --show-findings results.sarif # View results
opentaint summary --show-findings --verbose-flow --show-code-snippets results.sarif # Full detail
| Command | Description |
|---|---|
opentaint scan | Analyze projects (auto-detects Maven/Gradle) |
opentaint compile | Build project model separately |
opentaint project | Create model from precompiled JARs |
opentaint summary | View SARIF results |
opentaint health | Show resolved analyzer, autobuilder, rules, and runtime paths |
opentaint test rule | Scaffold, test, and debug detection rules |
opentaint test approximation | Scaffold and test dataflow approximations |
opentaint pull | Download dependencies |
opentaint update | Update to latest version |
opentaint prune | Remove stale artifacts and cached models |
Options: --max-memory 16G, --timeout 5m, --severity error, --recompile, --config config.yaml
For detailed usage, see Usage Guide.
Configuration
scan:
timeout: 15m
max_memory: 16G
output:
debug: false # true to enable debug output
color: auto # auto, always, never
Or use environment variables: OPENTAINT_SCAN_TIMEOUT=30m, OPENTAINT_SCAN_MAX_MEMORY=16G
For detailed configuration, see Configuration Guide.
CI/CD Integration
- GitHub Actions: seqra/opentaint/github
- GitLab CI: seqra/opentaint/gitlab
Troubleshooting
| Issue | Solution |
|---|---|
| Build fails | Ensure mvn compile or gradle build works; set JAVA_HOME |
| Out of memory | Use --max-memory 16G |
| Timeout | Use --timeout 20m |
| Re-download deps | opentaint prune --yes && opentaint pull |
| Stale cached model | Use --recompile to force recompilation |
| Debug | Use --debug |
For detailed troubleshooting, see Troubleshooting Guide.
Support
- Issues: GitHub Issues
- Community: Discord
- Email: seqradev@gmail.com
- FAQ: FAQ
License
The core analysis engine is released under the Apache 2.0 License. The CLI, GitHub Action, GitLab CI template, and rules are released under the MIT License.