Discover
Learn trust boundaries and vulnerability patterns as an informal specification.
Learn trust boundaries and vulnerability patterns as an informal specification.
Enact the informal specification as taint rules and dependency models.
Search the whole project with formal program analysis.
Confirm findings and tune away false alarms.
Minimize missed findings and false alarms without making whole-project analysis impractical.
Engine, rules, models, agent skills, CLI, viewer, and CI integrations — all open source and built to work together.
npm install -g @seqra/opentaintnpx skills add https://github.com/seqra/opentaintRun deep security scan and static triage with OpenTaint appsec-agent skillAs AI generates more code, security risk and review cost compound
01 / Generated code
02 / Exploitation
Vulnerability exploitation became the leading breach entry point for the first time in 19 years.
03 / Repeatability
These were reported issues outside the deterministic reference set, not independently confirmed vulnerabilities.
04 / Model cost
01 Agent reviews
// Controller entry point.
77 @PostMapping(produces = TEXT_PLAIN_VALUE)
81 public String startWorkflow(
82 @RequestBody StartWorkflowRequest request) {
83 return workflowService.startWorkflow(request);
84 }
// Trust boundary: request data controls the script.
68 Map<String, Object> taskInput = task.getInputData();
71 scriptExpression = (String) taskInput.get(
72 "scriptExpression");
80 Object result = ScriptEvaluator.eval(
81 scriptExpression, taskInput); // Opaque external method behavior: option() returns this builder.
116 private static Context createNewContext() {
117 return Context.newBuilder("js")
118 .allowHostAccess(HostAccess.ALL)
119 .option("engine.WarnInterpreterOnly", "false")
120 .build();
121 }
// Vulnerability pattern: untrusted script reaches the evaluator.
202 executorService.submit(
203 () -> context.eval("js", script)); 02 Agent enacts
id: graalvm-polyglot-evallanguages: [java]mode: taintpattern-sinks: - patterns: - pattern: (Context $CTX).eval($LANG, $SOURCE) - focus-metavariable: $SOURCE # Only a context with full host access is RCE. - pattern-inside: | Context $CTX = $B .allowAllAccess(true).build(); ...Fires only when the context was built with full host access.
language: javapassThrough: - function: Context$Builder#option copy: - from: this to: result
- function: Source$Builder#cached copy: - from: this to: resultThe builder mutates and returns itself, so taint survives the chain.
03 Formal taint analysis searches
Every finding opens to the flow that produced it.
Reported taint trace
The complete trace spans 182 steps across the codebase.
Comparative results
Compare Semgrep, CodeQL, and OpenTaint across five increasingly difficult Java XSS cases.
Read the comparisonThe agent skills
AppSec Agent builds and scans, writes rules and models, triages findings, and generates proof-of-concept checks.
Read the release postAnalysis coverage