Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scan a source tree for dynamic-code-execution APIs that an attacker can hijack: Python eval / exec / compile, JavaScript eval / Function() / setTimeout(string), Ruby eval / instance_eval / class_eval, Java ScriptEngine, PHP eval / assert($str), .NET Activator.CreateInstance / Reflection.Emit with dynamic input. Use when: pre-commit gate on any application that parses user-uploaded code (rule engines, formula evaluators, plugin systems), or post-bug-report when "we run user-supplied expressions."
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | -16% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-20 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 7% | 0% |
Dynamic-code-execution APIs (CWE-95 Eval Injection) let an application interpret a string as code at runtime. If the string contains anything user-controllable, the application has handed the attacker arbitrary code execution.
The defensive posture: don't use these APIs. The exceptions are narrow: rule engines, formula evaluators (spreadsheet = formulas), plugin systems with explicit sandboxing. For everything else, there's almost always a safer alternative.
| Finding | Severity | Threshold | Affected control | |---|---|---|---| | Python eval(...) with non-literal | CRITICAL | argument contains var ref | CWE-95 | | Python exec(...) with non-literal | CRITICAL | argument contains var ref | CWE-95 | | Python compile(...) with non-literal | HIGH | source string contains var | CWE-95 | | Python __import__(var) | HIGH | dynamic module loading | CWE-95 | | JS eval(...) | CRITICAL | any | CWE-95 | | JS new Function(str) | CRITICAL | any non-literal | CWE-95 | | JS setTimeout/setInterval(string) | HIGH | string instead of function | CWE-95 | | Ruby eval(...)/instance_eval(...)/class_eval(...) | CRITICAL | non-literal | CWE-95 | | PHP eval(...) | CRITICAL | always | CWE-95 | | PHP assert($str) | CRITICAL | (legacy code-eval form) | CWE-95 | | PHP create_function | CRITICAL | deprecated, eval-equivalent | CWE-95 | | Java ScriptEngineManager + eval | HIGH | dynamic script execution | CWE-95 | | C# Activator.CreateInstance(Type.GetType(str)) | HIGH | type loading from string | CWE-95 |
bashpython3 ${CLAUDE_PLUGIN_ROOT}/skills/detecting-eval-exec-usage/scripts/scan_eval.py /path/to/repo
Options: --output FILE, --format json|jsonl|markdown, --min-severity, --include-tests, --languages LIST.
CRITICAL = direct RCE vector. Replace the dynamic execution with explicit logic (lookup table, switch statement) or a sandboxed expression library (Python simpleeval, JavaScript expr-eval, Ruby Dentaku).
See references/PLAYBOOK.md.
bashpython3 ${CLAUDE_PLUGIN_ROOT}/skills/detecting-eval-exec-usage/scripts/scan_eval.py \ --min-severity high $(git diff --name-only main...HEAD | tr '\n' ' ')
yaml- run: | python3 plugins/security/penetration-tester/skills/detecting-eval-exec-usage/scripts/scan_eval.py \ . --min-severity high
JSON / JSONL / Markdown. Exit codes: 0 / 1 / 2.
False positive on eval("'literal'") — the value is a constant string. Verify the regex match by reading the source line.
references/THEORY.md — Why dynamic-code execution is thehighest-impact injection class, sandbox limits, the formula-evaluator design pattern
references/PLAYBOOK.md — Per-language safe alternatives(Python simpleeval / ast.literal_eval, JS expression-eval libraries, Ruby Dentaku, Java scripting sandboxes)
Other measured skills in the registry, with their headline benchmark lift.