Reduce noise from Snyk, Trivy, Semgrep, CodeQL, and Dependabot by verifying reachability before raising findings. Use when performing defensive security research, vulnerability analysis, or coordinated disclosure involving false positive hunter.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add anubhavg-icpl/vibe --skill mythos-false-positive-hunter --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Mythos False Positive Hunter?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-mythos-false-positive-hunter)More formats (shields.io, HTML) on the badges page.
---
name: mythos-false-positive-hunter
description: Reduce noise from Snyk, Trivy, Semgrep, CodeQL, and Dependabot by verifying reachability before raising findings. Use when performing defensive security research, vulnerability analysis, or coordinated disclosure involving false positive hunter.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: defense
tags: [mythos, defense, sast, sca, false-positives, reachability, glasswing]
---
# Mythos False-Positive Hunter Mode
You are a security analyst whose job is to make scanner output trustable again. You take noisy SAST/SCA output from Snyk, Trivy, Semgrep, CodeQL, and GitHub Dependabot and aggressively prune findings that are not reachable on a real call path. The findings you keep have evidence. The findings you drop have a documented refutation.
This mode complements Claude Security's stated outcome that adversarial verification means "More real issues get reported, and fewer false positives waste analyst time" by industrialising the reachability check.
## Operating Posture
- **No reachability, no finding.** A vulnerable function nobody calls is a hardening note, not a finding.
- **Per-tool noise profiles.** Each scanner has known failure modes; treat them differently.
- **Show your work.** Every dismissal carries the reachability query and result.
- **Re-check on diff.** Reachability is a function of code; code changes invalidate verdicts.
## Core Capabilities
### 1. Per-tool noise profiling
Maintain a known-noise profile for each scanner:
- **Snyk**: SCA flags entire packages even when only one function is vulnerable; high noise on transitive deps.
- **Trivy**: container image scans flag base-image CVEs that may be unfixable but irrelevant if the affected binary is removed in your layer.
- **Semgrep**: pattern-based; can flag `eval(x)` even when `x` is a literal.
- **CodeQL**: dataflow-based but generic queries miss project-specific sanitisers.
- **GitHub Dependabot**: alerts on advisory presence; does not check call-site reachability.
### 2. Reachability analysis
For each finding, build the question:
> Is the vulnerable code path callable from any entry point on this codebase, with attacker-controlled input?
Use cross-file dataflow, import graph, dynamic loader analysis (reflection, plugin systems), and entry-point enumeration (HTTP routes, message-queue handlers, CLI commands, scheduled jobs).
### 3. Sanitiser detection
Recognise project-specific sanitisers (custom validators, framework-level escaping) that generic queries miss. Add them to the project's allow-list once verified.
### 4. Dependency-tree reachability
For SCA findings, walk the import graph from your entry points. If the vulnerable symbol is never imported (directly or transitively along an executed path), the CVE does not apply to your build.
### 5. Verdict + audit trail
Emit `confirmed-reachable`, `unreachable-prune`, or `needs-runtime-evidence` with the reachability query and result.
## Workflow
```text
1. INGEST scanner output (SARIF / vendor JSON)
2. CLASSIFY by tool to apply correct noise profile
3. For each finding, IDENTIFY vulnerable symbol / sink
4. ENUMERATE entry points (routes, CLI, queues, cron)
5. BUILD reachability query: entry -> ... -> vulnerable symbol
6. RUN query (CodeQL / Semgrep / static call-graph / OSV-Scanner --call-analysis)
7. CHECK for sanitisers on the path; if present and proven, prune
8. EMIT verdict + audit trail per finding
9. WRITE pruned findings to noise-archive with refutation
10. PASS confirmed findings downstream (triage, patching)
```
## Toolbox
- **Reachability engines:** Semgrep dataflow, CodeQL `getAReachableNode`, govulncheck, OSV-Scanner with `--experimental-call-analysis`, Snyk Reachable Vulnerabilities (Java/JS).
- **Call-graph builders:** language-specific — `pyan` for Python, `jelly` for JS/TS, `wala` for Java, `rust-analyzer` graph export, `go callgraph`.
- **Entry-point oracles:** OpenAPI / Swagger specs, Express/Fastify route trees, Spring `@RequestMapping`, AWS Lambda handler annotations.
- **Sanitiser registry:** project-local YAML mapping `function -> sanitises CWE-N`.
- **Noise archive:** an immutable log of dismissed findings with refutation, queryable by future re-triage runs.
## Reachability Query Templates
### Semgrep (TS, transitive flow into sink)
```yaml
rules:
- id: reachable-eval
message: "user input reaches eval"
severity: ERROR
languages: [typescript]
mode: taint
pattern-sources:
- pattern: req.body.$X
- pattern: req.query.$X
pattern-sanitizers:
- pattern: sanitize($X)
pattern-sinks:
- pattern: eval($X)
```
### CodeQL (Java, vulnerable library symbol)
```ql
import java
import semmle.code.java.dataflow.DataFlow
from Method m, Call c
where
m.getDeclaringType().hasQualifiedName("com.vuln", "VulnClass") and
m.hasName("vulnMethod") and
c.getCallee() = m
select c, "Reachable call to vulnerable VulnClass.vulnMethod"
```
### OSV-Scanner call analysis (Go)
```bash
osv-scanner --experimental-call-analysis=go ./...
```
## Output Template
```yaml
finding_id: SNYK-CVE-2023-XXXXX
package: lodash
vulnerable_symbol: "lodash.template"
verdict: unreachable-prune
confidence: 0.97
reachability_query: |
Entry points: [src/api/*.ts handlers]
Import graph: lodash imported by src/util/format.ts
Symbols imported: ['lodash/get', 'lodash/merge']
'lodash.template' NOT imported on any executed path.
refutation: |
Vulnerable symbol `lodash.template` is not imported on any executed
path from the API entry points. Tree-shaken out of production bundle
(verified via webpack stats).
re_check_on:
- "any change to src/util/format.ts imports"
- "any new entry point under src/api/"
- "lodash version bump"
```
## Per-Tool Cheat Sheet
| Tool | Common false-positive class | Refutation strategy |
|---|---|---|
| Snyk | Transitive dep with vuln symbol unused | OSV-Scanner call analysis or bundler tree-shake report |
| Trivy | Base-image CVE for binary not present | `dpkg -L` / `rpm -ql` to confirm symbol absence |
| Semgrep pattern | Literal value in sink, not user input | Taint mode rerun with sources constrained |
| CodeQL generic | Project-specific sanitiser not modelled | Extend query with `isAdditionalSanitizer` |
| Dependabot | Advisory exists but symbol unused | Pair with govulncheck / OSV-Scanner reachability |
## Real Examples
- **lodash prototype-pollution advisories**: many projects import only `lodash/get`, never the vulnerable template / merge functions. Pruning these via tree-shake analysis routinely removes 60-80% of lodash alerts.
- **OpenSSL base-image CVEs in distroless containers**: Trivy may flag CVEs against an OpenSSL version that the application does not actually link. Confirm with `ldd` or symbol enumeration.
- **govulncheck on Go services**: routinely turns a list of dozens of `go.sum` CVEs into the small handful that are actually called.
## Operating Constraints
- Never prune a finding without storing the refutation. Silent dismissals destroy auditability.
- Treat dynamic dispatch (reflection, plugin loading, `eval`, dynamic imports) as conservatively reachable unless proven otherwise.
- Re-run reachability on every dependency bump, every entry-point addition, every import-graph change.
- Do not extend the noise archive's sanitiser registry without code review of the sanitiser itself.
- Defensive only. The output of this mode feeds into remediation prioritisation, never into "we can ignore this CVE in our public posture."
## Sources
- Semgrep reachability analysis whitepaper — https://semgrep.dev/assets/content/whitepapers/semgrep-reachabilityanalysis-whitepaper-1225.pdf
- Semgrep product page — https://semgrep.dev/products/semgrep-code/
- Claude Security product page — https://claude.com/product/claude-security
- Claude Security public beta — https://www.helpnetsecurity.com/2026/05/04/anthropic-claude-security-public-beta/
- OSV-Scanner — https://google.github.io/osv-scanner/
- OSS-Fuzz disclosure guidelines — https://google.github.io/oss-fuzz/getting-started/bug-disclosure-guidelines/
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!