advisory-mining
Mine GitHub Security Advisories and CVE databases for incomplete fixes, finding variant vulnerabilities in patched code or…
Detect Regular Expression Denial of Service (ReDoS) where crafted input causes catastrophic backtracking in regex patterns applied to user-controlled strings.
Claude Code
$ npx -y skills add ByamB4/find-cve-agent --skill redos --agent claude-code
Codex
$ npx skills add ByamB4/find-cve-agent --skill redos -a codex -y
Cursor
$ npx skills add ByamB4/find-cve-agent --skill redos -a cursor -y
Gemini CLI
$ npx skills add ByamB4/find-cve-agent --skill redos -a gemini-cli -y
GitHub Copilot
$ npx skills add ByamB4/find-cve-agent --skill redos -a github-copilot -y
OpenCode
$ npx skills add ByamB4/find-cve-agent --skill redos -a opencode -y
Windsurf
$ npx skills add ByamB4/find-cve-agent --skill redos -a windsurf -y
name: redos
description: "Detect Regular Expression Denial of Service (ReDoS) where crafted input causes catastrophic backtracking in regex patterns applied to user-controlled strings."
metadata:
filePattern:
- "**/*.js"
- "**/*.ts"
- "**/*.py"
- "**/*.rb"
- "**/*.php"
- "**/*.java"
bashPattern:
- "grep.*(RegExp|regex|pattern|match)"
- "semgrep.*redos"
priority: 70Audit input validation libraries, URL/email/date parsers, sanitization utilities, template engines, and any package that applies regular expressions to user-controlled strings.
**MUST measure actual backtracking growth rate.** Do not report based on pattern structure alone. The validator.js lesson: assumed ReDoS from pattern complexity but could not confirm exponential growth. Always TIME IT.
(a+)+$ # Nested plus -- classic ReDoS
(a*)*$ # Nested star
(a+)*$ # Star of plus
(a*)+$ # Plus of star
(a{1,}){1,}$ # Nested bounded quantifiers(a|a)+$ # Identical alternatives (a|ab)+$ # Prefix overlap (a|b|ab)+$ # Partial overlap (\w|\d)+$ # \d is subset of \w -- overlap
(a+b?)+$ # Optional between repeated groups (\s*,\s*)+$ # Common in CSV/list parsing ([^"]*"[^"]*")*[^"]*$ # Quote matching
^([a-zA-Z0-9])(([\-.]|[_]+)?([a-zA-Z0-9]+))*$ # Email local part
^((https?|ftp):\/\/)?([\w.-]+)\.([a-z.]{2,6}).*$ # URL validation
^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ # IP (safe but often combined)| Pattern | Evil String | Growth | |---------|-------------|--------| | `(a+)+$` | `"a" * N + "!"` | O(2^N) | | `(a+b?)+$` | `"a" * N + "!"` | O(2^N) | | `(a\|aa)+$` | `"a" * N + "!"` | O(2^N) | | `([a-zA-Z]+)*$` | `"a" * N + "1"` | O(2^N) | | `(\s+$)` | `" " * N + "x"` | O(N^2) quadratic | | `(.*a){10}$` | `"a" * N + "!"` | O(N^10) polynomial |
**Key insight:** The evil string is N copies of a character the pattern CAN match, followed by one character it CANNOT. This forces the engine to try every possible split of the N characters across the quantifiers.
# JavaScript/TypeScript
grep -rn "new RegExp\|RegExp(" . --include="*.js" --include="*.ts"
grep -rn "\.match(\|\.test(\|\.replace(\|\.search(\|\.split(" . --include="*.js" --include="*.ts"
grep -rn "/[^/]*[+*][^/]*[+*][^/]*/" . --include="*.js" --include="*.ts"
# Python
grep -rn "re\.compile\|re\.match\|re\.search\|re\.findall\|re\.sub" . --include="*.py"
grep -rn "re\.DOTALL\|re\.MULTILINE\|re\.VERBOSE" . --include="*.py"
# Ruby
grep -rn "Regexp\.new\|=~\|\.match\|\.scan\|\.gsub" . --include="*.rb"
# PHP
grep -rn "preg_match\|preg_replace\|preg_split" . --include="*.php"
# Java
grep -rn "Pattern\.compile\|\.matches(\|\.replaceAll(" . --include="*.java"Look for these red flags: 1. **Nested quantifiers:** `(X+)+`, `(X*)*`, `(X+)*`, `(X*)+` 2. **Overlapping alternation:** `(a|a)+`, `(a|ab)+` 3. **Quantified group with internal repetition:** `(\s*,\s*)+` 4. **Unbounded repetition with anchor failure:** Pattern ends with `$` and input doesn't match 5. **User-controlled regex:** `new RegExp(userInput)` -- always exploitable
// Node.js timing test -- REQUIRED before reporting
const regex = /VULNERABLE_PATTERN/;
console.log('Length | Time (ms) | Ratio');
let prevTime = 0;
for (let len = 15; len <= 35; len++) {
const evil = 'a'.repeat(len) + '!';
const start = performance.now();
regex.test(evil);
const elapsed = performance.now() - start;
const ratio = prevTime > 0 ? (elapsed / prevTime).toFixed(1) : '-';
console.log(`${String(len).padStart(6)} | ${elapsed.toFixed(2).padStart(9)} | ${ratio}`);
prevTime = elapsed;
}**Interpretation:**
| Growth Rate | Ratio Pattern | Input for 1s Hang | Severity | |-------------|---------------|-------------------|----------| | O(2^N) exponential | ~2x per char | 25-30 chars | HIGH 7.5 | | O(N^3+) polynomial | grows with input | 10K-100K chars | MEDIUM 5.3-6.5 | | O(N^2) quadratic | grows slowly | 100K+ chars | LOW-MEDIUM | | O(N) linear | constant ratio | never | NOT ReDoS |
The regex MUST be applied to user-controlled input. Check the full call chain: 1. Where does input enter? (HTTP param, form field, file content) 2. Is input truncated before regex? (length limit < 100 chars = likely safe) 3. Is there a regex timeout? (some libraries implement circuit breakers) 4. Is the regex applied in a worker/child process? (reduces impact to DoS of worker only)
Open Source CVE Hunting Harness for Claude Code A Claude Code plugin that systematically finds real CVEs in open source packages through coordinated multi-agent security research.
Mine GitHub Security Advisories and CVE databases for incomplete fixes, finding variant vulnerabilities in patched code or…
Detect authentication and authorization bypass vulnerabilities including missing auth middleware, JWT algorithm confusion, IDOR,…
Detect code injection vulnerabilities in packages that dynamically generate or evaluate code via new Function(), eval(), vm.run*,…
Detect OS command injection via shell execution sinks where user-controlled input reaches system commands without proper…
Cross-pollination multiplier technique: find a vulnerability in one package, then search for the same pattern across all similar…
Detect decompression bomb vulnerabilities where compressed input can expand to exhaust memory, targeting buffer-based…
Use for authorized security assessment of REST, GraphQL, WebSocket, or SOAP APIs, including discovery, authentication,…
Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys)…
Clean and finalize authorized natural-language text intended for readers by auditing suspicious invisible Unicode and rewriting…