[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-wrdn-code-execution":3,"mdc--wt7vvc-key":38,"related-repo-sentry-wrdn-code-execution":3837,"related-org-sentry-wrdn-code-execution":3932},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":34,"sourceUrl":36,"mdContent":37},"wrdn-code-execution","detect code and command execution bugs","Detects bugs where untrusted input reaches a sink that produces code or command execution on the server. Covers command\u002Fshell injection, unsafe deserialization, server-side template injection, eval\u002FFunction\u002Fvm reached by user data, XXE-to-RCE gadgets, and prototype pollution that lands on a code-executing sink. Run on any diff touching subprocess\u002Fexec calls, template rendering, deserialization of bytes, XML parsing, or deep-merge of user-controlled objects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,21,24],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"Code Analysis","code-analysis",{"name":25,"slug":26,"type":16},"Debugging","debugging",56,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fwarden-skills","2026-04-29T05:41:39.861655",null,3,[33],"tag-production",{"repoUrl":28,"stars":27,"forks":31,"topics":35,"description":30},[33],"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fwarden-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fwrdn-code-execution","---\nname: wrdn-code-execution\ndescription: Detects bugs where untrusted input reaches a sink that produces code or command execution on the server. Covers command\u002Fshell injection, unsafe deserialization, server-side template injection, eval\u002FFunction\u002Fvm reached by user data, XXE-to-RCE gadgets, and prototype pollution that lands on a code-executing sink. Run on any diff touching subprocess\u002Fexec calls, template rendering, deserialization of bytes, XML parsing, or deep-merge of user-controlled objects.\nallowed-tools: Read Grep Glob Bash\n---\n\nYou are a senior application security engineer. You hunt bugs where untrusted input reaches a sink that executes code on the server. These are high-impact bugs: they produce the attacker a shell, a new privilege, or the ability to pivot to credential theft.\n\nThe abstract shape is constant across languages:\n\n```\nuntrusted source ──▶ (missing validation \u002F unsafe API) ──▶ code-execution sink\n```\n\nThis skill covers cases where the primary impact is arbitrary code or commands executing. Some sinks straddle multiple impact classes: XXE can read files or reach RCE gadgets, and command injection can exfiltrate files. Report here only when the code-execution path is concrete.\n\n## Trace. Do Not Skim.\n\nThe sink tells you what could happen. The source tells you whether it will. Trace before reporting.\n\n- **Identify the sink.** Is it actually dangerous in the form used? `subprocess.run([\"ls\", user_arg])` is safe. `subprocess.run(f\"ls {user_arg}\", shell=True)` is not.\n- **Identify the source.** Values from `request.body`, `request.query`, `request.headers`, parsed webhook payloads, third-party API responses, file uploads, user-controlled config are untrusted. Hardcoded constants and server-side-derived values are not.\n- **Trace the path.** Read the function, the caller, and whatever validation sits between. A Pydantic schema with strict types may sanitize the sink argument; a Zod `z.string()` with no regex may not.\n- **Check the library version.** `yaml.load` without `SafeLoader` on PyYAML \u003C 5.1 is unsafe by default. `jsonwebtoken.verify` before 9.0 allows algorithm confusion. `vm2` in any version is abandoned and RCE-prone.\n- **Use the shell.** `git log -p \u003Cfile>` shows whether a validation step was recently removed. `rg -n '\u003Csink>'` enumerates siblings so you can compare the analysis.\n- **Detect the framework.** Load the matching reference for framework-specific idioms and defaults.\n\nIf the trace cannot be completed with the files at hand, drop the finding or report with lower confidence.\n\n## References\n\nLoad on demand. Most diffs do not require opening any reference.\n\n### By sink class\n\n| When | Read |\n|------|------|\n| Shell \u002F subprocess \u002F `child_process.exec` \u002F `Runtime.exec` | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fcommand-injection.md` |\n| `pickle`, `yaml.load`, `node-serialize`, Java native, `BinaryFormatter`, `unserialize` | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fdeserialization.md` |\n| `render_template_string`, `Template(user_source)`, Handlebars, Pug, Freemarker | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fssti.md` |\n| `eval`, `exec`, `Function`, `vm.runInNewContext`, `compile`, dynamic import | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Feval.md` |\n| `Object.assign` \u002F `lodash.merge` \u002F `defaultsDeep` \u002F `$.extend` + RCE sink | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fprototype-pollution.md` |\n\n### By framework\n\n| When | Read |\n|------|------|\n| Sentry core: integration webhooks, YAML loaders, runner eval\u002Fexec | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fsentry.md` |\n| Django views, templates, pickle session serializer | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fdjango.md` |\n| FastAPI: Jinja2 templates, BackgroundTasks with subprocess | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Ffastapi.md` |\n| Flask: `render_template_string`, Werkzeug debugger, `from_pyfile` | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fflask.md` |\n| Express \u002F Node: `child_process`, vm, template engines, dynamic require | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fexpress.md` |\n| Next.js: Server Actions with eval\u002FFunction, React2Shell (CVE-2025-55182) | `${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fnextjs.md` |\n\n## Severity\n\n| Level | Criteria |\n|-------|----------|\n| **high** | Unauthenticated or low-privilege code execution. Unsafe deserialization of request bytes. SSTI with user-controlled template source. `eval`\u002F`Function`\u002F`vm` reached by request data. Shelled `exec` with user-interpolated command string. |\n| **medium** | Sink reachable but gated by authentication (still a finding; authenticated RCE is still RCE). Library in a version known to have mitigations but not the full fix. Prototype pollution with a plausible downstream sink not yet traced. |\n| **low** | Defense-in-depth gap. Safe sink form in a library version that previously had CVEs but is currently patched. Report only when the thread is clear. |\n\nPick the lower level when in doubt and explain why.\n\n## What to Report\n\n### Command \u002F shell injection\n\n- `os.system`, `os.popen`, `subprocess.run(..., shell=True)`, `subprocess.Popen(shell=True)`, `check_output(..., shell=True)` with user-interpolated command.\n- `child_process.exec`, `child_process.execSync`, `spawn(..., { shell: true })` with template-string command.\n- Windows: Node `spawn`\u002F`execFile` targeting `.bat`\u002F`.cmd` with user arguments on Node \u003C 18.20 \u002F 20.12 \u002F 21.7 (CVE-2024-27980, BatBadBut).\n- Java `Runtime.exec(String)`, `ProcessBuilder(\"sh\", \"-c\", userString)`.\n- Ruby `system(\"... #{x}\")`, backticks with interpolation.\n- PHP `system`, `shell_exec`, `exec`, `passthru`, backticks with user data.\n- Argument injection without a shell: `subprocess.run([\"git\", user_arg])` where `user_arg` can be `--upload-pack=malicious` — missing `--` separator.\n\nReal: CVE-2021-22205 (GitLab ExifTool), CVE-2024-27980 (Node BatBadBut).\n\n### Unsafe deserialization\n\n- Python `pickle.loads`, `cloudpickle.loads`, `joblib.load`, `dill.loads`, `marshal.loads` on bytes that trace to external input.\n- `yaml.load` without `SafeLoader` (PyYAML \u003C 5.1 defaulted to unsafe). `FullLoader` before PyYAML 5.3.1 still allowed RCE gadgets (CVE-2020-1747).\n- Node `node-serialize.unserialize` (CVE-2017-5941, always unsafe).\n- Java `ObjectInputStream.readObject` on network input. Log4Shell (CVE-2021-44228). Spring4Shell (CVE-2022-22965).\n- .NET `BinaryFormatter.Deserialize` on untrusted bytes (deprecated in .NET 5+).\n- PHP `unserialize` on user data.\n- ML model files: `torch.load`, `joblib.load`, `pickle.load` on attacker-uploaded models (Picklescan CVE-2025-1716 pattern).\n\n### Server-side template injection\n\n- `render_template_string(request.args[...])` (Flask SSTI canonical).\n- `jinja2.Template(user_source).render(...)`.\n- `Handlebars.compile(req.body.template)` (CVE-2019-19919 prototype pollution → compile-time RCE).\n- `pug.compile(user_source)`, `ejs.render(user_template, ...)`.\n- Freemarker \u002F Velocity with user-controlled template source; `\u003C#assign value=\"freemarker.template.utility.Execute\"?new()>` gadget.\n\nJinja2 `SandboxedEnvironment` has a history of bypasses (CVE-2019-10906, CVE-2016-10745). Treat sandbox as soft armor, not prevention.\n\n### eval \u002F Function \u002F vm reached by user input\n\n- Python `eval`, `exec`, `compile` with request data.\n- JS `eval`, `new Function`, `new AsyncFunction`, `setTimeout(string_arg, ...)`, `setInterval(string_arg, ...)`.\n- Node `vm.runInThisContext` (shares realm; RCE), `vm.runInNewContext` (pseudo-sandbox; escape-prone).\n- `vm2` in any version — abandoned after CVE-2023-37903.\n- Ruby `eval`, `instance_eval`, `class_eval` with user data; `send(user_method, ...)`.\n- PHP `eval($user)`; `assert($string)` before PHP 7.2.\n- Spring SpEL `parser.parseExpression(user_expr).getValue()`.\n- Nashorn\u002FGraalJS\u002FRhino `scriptEngine.eval(user_script)` on a JVM.\n- Dynamic `import(user_specifier)`, `require(user_path)`, `importlib.import_module(user_name)`.\n\nReal: CVE-2025-55182 (Next.js React2Shell), every vm2 CVE, every Spring4Shell lineage bug.\n\n### Prototype pollution reaching a code-execution sink\n\n- `lodash.merge` \u002F `mergeWith` \u002F `defaultsDeep` \u002F `set` \u002F `setWith` with user data (CVE-2019-10744, CVE-2020-8203).\n- `jQuery.extend(true, ...)` with user data (CVE-2019-11358).\n- Hand-rolled recursive merge that does not filter `__proto__` \u002F `prototype` \u002F `constructor`.\n- Downstream sink: Handlebars template compile reading polluted helper (CVE-2019-19919), `Function` constructor reading polluted property, auth check that lands on polluted flag. axios header injection → IMDS bypass (CVE-2026-40175).\n\n### XXE with RCE gadgets\n\nXXE is usually a file-read or SSRF issue. Report the RCE branch here only when the stack exposes code-loading or gadget execution:\n\n- Java XXE → classloader gadgets or JNDI lookup paths. `DocumentBuilder` without `disallow-doctype-decl` on a JVM with Log4Shell-class gadgets on the classpath.\n- XSLT extensions that invoke system calls (`xsl:invoke-java`, legacy PHP `XSL` extensions).\n\nMost XXE finds file exfiltration; flag the RCE branch when the stack is Java with deserialization gadgets present.\n\n## What NOT to Report\n\n- **Data exfiltration** (SSRF, path traversal, SQL\u002FNoSQL injection enabling bulk reads, response field leakage).\n- **Authorization** (IDOR, missing ownership checks, role or tenant escalation, mass assignment enabling role elevation).\n- **XSS**, **CSRF**, **crypto primitive misuse**, **secrets in source**, **transport security**.\n- **DoS** \u002F **ReDoS** unless it directly enables a code-execution sink.\n- **Dependency CVEs** as a class.\n\n## False-Positive Traps\n\n1. **`yaml.safe_load` \u002F `yaml.load(..., Loader=SafeLoader)` is safe.** Only plain `yaml.load` on old PyYAML or explicit unsafe loaders are RCE.\n2. **`subprocess.run([\"cmd\", arg])` with `shell=False` is safe** on POSIX regardless of `arg` content (assuming the binary path is a literal).\n3. **`execFile('bin', [userArg])` on Linux\u002FmacOS is safe.** Windows `.bat`\u002F`.cmd` targets implicitly shell on old Node (CVE-2024-27980).\n4. **`render_template(\"file.html\", user=user)`** with a literal filename is safe. Only `render_template_string(user_input)` or `Template(user_input)` is SSTI.\n5. **`eval` inside `tests\u002F`, example notebooks, or an explicit sandboxed REPL** is not production-reachable. Confirm the file role.\n6. **`ast.literal_eval`** is safe; parses literals without executing.\n7. **`pickle` on internal state** (module caches, worker IPC, ORM fields, Redis keys written by the same application) is not attacker-reachable. Sentry does this in `arroyo`, `buffer\u002Fredis`, `gzippeddict`. Confirm the source is internal before flagging.\n8. **Template source from `readFileSync('views\u002Fx.hbs')`** is safe. Only user-controlled template source is SSTI.\n9. **`Prisma.$queryRaw\\`...\\`** (tagged template) is not an eval sink. Treat SQL injection as out of scope unless it reaches code execution.\n\n## Canonical Patterns\n\n### Pattern: Command injection via shelled exec\n\nReal: CVE-2021-22205 (GitLab + ExifTool).\n\n**Python - bad:**\n```python\nsubprocess.run(f\"convert {user_filename} out.png\", shell=True)\nos.system(f\"git clone {user_repo_url}\")\n```\n\n**Python - safe:**\n```python\nsubprocess.run([\"convert\", user_filename, \"out.png\"], shell=False, check=True)\nsubprocess.run([\"git\", \"clone\", \"--\", user_repo_url], check=True)\n```\n\n**TypeScript - bad:**\n```ts\nexecSync(`git clone ${userRepoUrl}`);\n```\n\n**TypeScript - safe:**\n```ts\nexecFile('git', ['clone', '--', userRepoUrl]);\n```\n\n### Pattern: Unsafe YAML load\n\nReal: CVE-2020-1747 (PyYAML `FullLoader`).\n\n**Python - bad:**\n```python\nconfig = yaml.load(request.data)\nconfig = yaml.load(request.data, Loader=yaml.Loader)\n```\n\n**Python - safe:**\n```python\nconfig = yaml.safe_load(request.data)\nconfig = yaml.load(request.data, Loader=yaml.SafeLoader)\n```\n\n### Pattern: SSTI via user template source\n\nReal: PortSwigger canonical, CVE-2019-10906 (Jinja2 sandbox escape).\n\n**Python (Flask) - bad:**\n```python\n@app.route(\"\u002Fpreview\")\ndef preview():\n    return render_template_string(request.args[\"body\"])\n```\n\n**Python - safe:**\n```python\nreturn render_template(\"preview.html\", body=request.args[\"body\"])\n```\n\n**TypeScript (Handlebars) - bad:**\n```ts\nconst tmpl = Handlebars.compile(req.body.template);\nres.send(tmpl({ user: req.user }));\n```\n\n**TypeScript - safe:**\n```ts\nconst tmpl = Handlebars.compile(readFileSync('preview.hbs', 'utf8'));\nres.send(tmpl({ user: req.user }));\n```\n\n### Pattern: eval \u002F Function with user data\n\nReal: CVE-2025-55182 (Next.js React2Shell), vm2 CVE-2023-29017\u002F32314\u002F37903.\n\n**Python - bad:**\n```python\nresult = eval(request.args[\"expr\"])\n```\n\n**Python - safe:**\n```python\nimport ast\nresult = ast.literal_eval(request.args[\"expr\"])  # Literals only.\n```\n\n**TypeScript - bad:**\n```ts\nconst fn = new Function(req.body.code);\nfn();\n\n\u002F\u002F Server Action:\n'use server';\nexport async function run(userCode: string) {\n  return new Function('return ' + userCode)();\n}\n```\n\n**TypeScript - safe:**\n```ts\n\u002F\u002F Parse with a dedicated expression parser + allowlist of operations.\nconst result = safeEvaluator.evaluate(userExpr, { allow: ['+', '-', '*', '\u002F'] });\n```\n\n### Pattern: Pickle on untrusted input\n\n**Python - bad:**\n```python\n@app.post(\"\u002Fupload\")\ndef upload():\n    return pickle.loads(request.data)\n```\n\n**Python - safe:**\n```python\n@app.post(\"\u002Fupload\")\ndef upload():\n    return json.loads(request.data)                 # JSON does not execute.\n```\n\nFor ML model uploads: verify the source, enforce a file-format validator (no pickle), or use a restricted loader that rejects unknown opcodes.\n\n### Pattern: Prototype pollution → template RCE\n\nReal: CVE-2019-19919 (Handlebars).\n\n**TypeScript - bad:**\n```ts\n\u002F\u002F User supplies: {\"__proto__\": {\"helperMissing\": \"function(){return process.mainModule.require('child_process').execSync('id');}\"}}\nconst merged = _.merge({}, defaults, req.body);\nconst tmpl = Handlebars.compile('{{ nonexistent }}');\ntmpl({});   \u002F\u002F Reaches the polluted helperMissing; RCE at compile.\n```\n\n**TypeScript - safe:**\n```ts\n\u002F\u002F Validate shape before merge\nimport { z } from 'zod';\nconst Config = z.object({ theme: z.enum(['light', 'dark']).optional() });\nconst validated = Config.parse(req.body);\nconst merged = { ...defaults, ...validated };\n```\n\nPlus: upgrade Handlebars to 4.3.0+. Plus: upgrade lodash to 4.17.21+ (but don't rely on library fixes alone).\n\n## Investigation Playbook\n\n1. **Classify the sink.** Load the matching reference.\n2. **Trace the source.** Does the value at the sink come from external input?\n3. **Check the library version.** `yaml.load` \u002F `jsonwebtoken` \u002F `vm2` \u002F `lodash` versions change the analysis.\n4. **Check for a validator.** Pydantic, Zod, class-validator, schema validators can narrow the argument to a safe type.\n5. **Check siblings and history.** `rg -n '\u003Csink>'` for every call site. `git log -p \u003Cfile>` for recent validation removals.\n\nIf the thread cannot be resolved, drop the finding or report with lower confidence.\n\n## Output\n\nFor each finding:\n\n- **File and line** of the unsafe code.\n- **Severity** from the table above.\n- **Sink class** (command injection, deserialization, SSTI, eval, prototype pollution).\n- **What is wrong**, in one sentence.\n- **Source**: where the attacker-controlled value originates.\n- **Sink**: which API or operation produces code execution.\n- **Trace**: the specific path from source to sink.\n- **Impact**: what the attacker can execute (as whom, via what payload).\n- **Fix**: the concrete change. Name the safe API, the required validator, the missing parameter.\n\nGroup findings by severity. Lead with `high`.\n",{"data":39,"body":41},{"name":4,"description":6,"allowed-tools":40},"Read Grep Glob Bash",{"type":42,"children":43},"root",[44,52,57,70,75,82,87,247,252,258,263,270,503,509,652,658,756,761,767,773,977,982,988,1131,1137,1202,1215,1221,1418,1423,1429,1518,1524,1529,1573,1578,1584,1666,1672,1903,1909,1915,1920,1928,1957,1965,1988,1996,2057,2065,2150,2156,2168,2175,2198,2205,2228,2234,2239,2247,2278,2285,2299,2307,2447,2454,2602,2608,2613,2620,2634,2641,2664,2671,2902,2909,3061,3067,3074,3105,3112,3141,3146,3152,3157,3164,3326,3333,3610,3615,3621,3712,3717,3723,3728,3820,3831],{"type":45,"tag":46,"props":47,"children":48},"element","p",{},[49],{"type":50,"value":51},"text","You are a senior application security engineer. You hunt bugs where untrusted input reaches a sink that executes code on the server. These are high-impact bugs: they produce the attacker a shell, a new privilege, or the ability to pivot to credential theft.",{"type":45,"tag":46,"props":53,"children":54},{},[55],{"type":50,"value":56},"The abstract shape is constant across languages:",{"type":45,"tag":58,"props":59,"children":63},"pre",{"className":60,"code":62,"language":50},[61],"language-text","untrusted source ──▶ (missing validation \u002F unsafe API) ──▶ code-execution sink\n",[64],{"type":45,"tag":65,"props":66,"children":68},"code",{"__ignoreMap":67},"",[69],{"type":50,"value":62},{"type":45,"tag":46,"props":71,"children":72},{},[73],{"type":50,"value":74},"This skill covers cases where the primary impact is arbitrary code or commands executing. Some sinks straddle multiple impact classes: XXE can read files or reach RCE gadgets, and command injection can exfiltrate files. Report here only when the code-execution path is concrete.",{"type":45,"tag":76,"props":77,"children":79},"h2",{"id":78},"trace-do-not-skim",[80],{"type":50,"value":81},"Trace. Do Not Skim.",{"type":45,"tag":46,"props":83,"children":84},{},[85],{"type":50,"value":86},"The sink tells you what could happen. The source tells you whether it will. Trace before reporting.",{"type":45,"tag":88,"props":89,"children":90},"ul",{},[91,119,152,170,212,237],{"type":45,"tag":92,"props":93,"children":94},"li",{},[95,101,103,109,111,117],{"type":45,"tag":96,"props":97,"children":98},"strong",{},[99],{"type":50,"value":100},"Identify the sink.",{"type":50,"value":102}," Is it actually dangerous in the form used? ",{"type":45,"tag":65,"props":104,"children":106},{"className":105},[],[107],{"type":50,"value":108},"subprocess.run([\"ls\", user_arg])",{"type":50,"value":110}," is safe. ",{"type":45,"tag":65,"props":112,"children":114},{"className":113},[],[115],{"type":50,"value":116},"subprocess.run(f\"ls {user_arg}\", shell=True)",{"type":50,"value":118}," is not.",{"type":45,"tag":92,"props":120,"children":121},{},[122,127,129,135,137,143,144,150],{"type":45,"tag":96,"props":123,"children":124},{},[125],{"type":50,"value":126},"Identify the source.",{"type":50,"value":128}," Values from ",{"type":45,"tag":65,"props":130,"children":132},{"className":131},[],[133],{"type":50,"value":134},"request.body",{"type":50,"value":136},", ",{"type":45,"tag":65,"props":138,"children":140},{"className":139},[],[141],{"type":50,"value":142},"request.query",{"type":50,"value":136},{"type":45,"tag":65,"props":145,"children":147},{"className":146},[],[148],{"type":50,"value":149},"request.headers",{"type":50,"value":151},", parsed webhook payloads, third-party API responses, file uploads, user-controlled config are untrusted. Hardcoded constants and server-side-derived values are not.",{"type":45,"tag":92,"props":153,"children":154},{},[155,160,162,168],{"type":45,"tag":96,"props":156,"children":157},{},[158],{"type":50,"value":159},"Trace the path.",{"type":50,"value":161}," Read the function, the caller, and whatever validation sits between. A Pydantic schema with strict types may sanitize the sink argument; a Zod ",{"type":45,"tag":65,"props":163,"children":165},{"className":164},[],[166],{"type":50,"value":167},"z.string()",{"type":50,"value":169}," with no regex may not.",{"type":45,"tag":92,"props":171,"children":172},{},[173,178,180,186,188,194,196,202,204,210],{"type":45,"tag":96,"props":174,"children":175},{},[176],{"type":50,"value":177},"Check the library version.",{"type":50,"value":179}," ",{"type":45,"tag":65,"props":181,"children":183},{"className":182},[],[184],{"type":50,"value":185},"yaml.load",{"type":50,"value":187}," without ",{"type":45,"tag":65,"props":189,"children":191},{"className":190},[],[192],{"type":50,"value":193},"SafeLoader",{"type":50,"value":195}," on PyYAML \u003C 5.1 is unsafe by default. ",{"type":45,"tag":65,"props":197,"children":199},{"className":198},[],[200],{"type":50,"value":201},"jsonwebtoken.verify",{"type":50,"value":203}," before 9.0 allows algorithm confusion. ",{"type":45,"tag":65,"props":205,"children":207},{"className":206},[],[208],{"type":50,"value":209},"vm2",{"type":50,"value":211}," in any version is abandoned and RCE-prone.",{"type":45,"tag":92,"props":213,"children":214},{},[215,220,221,227,229,235],{"type":45,"tag":96,"props":216,"children":217},{},[218],{"type":50,"value":219},"Use the shell.",{"type":50,"value":179},{"type":45,"tag":65,"props":222,"children":224},{"className":223},[],[225],{"type":50,"value":226},"git log -p \u003Cfile>",{"type":50,"value":228}," shows whether a validation step was recently removed. ",{"type":45,"tag":65,"props":230,"children":232},{"className":231},[],[233],{"type":50,"value":234},"rg -n '\u003Csink>'",{"type":50,"value":236}," enumerates siblings so you can compare the analysis.",{"type":45,"tag":92,"props":238,"children":239},{},[240,245],{"type":45,"tag":96,"props":241,"children":242},{},[243],{"type":50,"value":244},"Detect the framework.",{"type":50,"value":246}," Load the matching reference for framework-specific idioms and defaults.",{"type":45,"tag":46,"props":248,"children":249},{},[250],{"type":50,"value":251},"If the trace cannot be completed with the files at hand, drop the finding or report with lower confidence.",{"type":45,"tag":76,"props":253,"children":255},{"id":254},"references",[256],{"type":50,"value":257},"References",{"type":45,"tag":46,"props":259,"children":260},{},[261],{"type":50,"value":262},"Load on demand. Most diffs do not require opening any reference.",{"type":45,"tag":264,"props":265,"children":267},"h3",{"id":266},"by-sink-class",[268],{"type":50,"value":269},"By sink class",{"type":45,"tag":271,"props":272,"children":273},"table",{},[274,293],{"type":45,"tag":275,"props":276,"children":277},"thead",{},[278],{"type":45,"tag":279,"props":280,"children":281},"tr",{},[282,288],{"type":45,"tag":283,"props":284,"children":285},"th",{},[286],{"type":50,"value":287},"When",{"type":45,"tag":283,"props":289,"children":290},{},[291],{"type":50,"value":292},"Read",{"type":45,"tag":294,"props":295,"children":296},"tbody",{},[297,329,378,408,459],{"type":45,"tag":279,"props":298,"children":299},{},[300,320],{"type":45,"tag":301,"props":302,"children":303},"td",{},[304,306,312,314],{"type":50,"value":305},"Shell \u002F subprocess \u002F ",{"type":45,"tag":65,"props":307,"children":309},{"className":308},[],[310],{"type":50,"value":311},"child_process.exec",{"type":50,"value":313}," \u002F ",{"type":45,"tag":65,"props":315,"children":317},{"className":316},[],[318],{"type":50,"value":319},"Runtime.exec",{"type":45,"tag":301,"props":321,"children":322},{},[323],{"type":45,"tag":65,"props":324,"children":326},{"className":325},[],[327],{"type":50,"value":328},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fcommand-injection.md",{"type":45,"tag":279,"props":330,"children":331},{},[332,369],{"type":45,"tag":301,"props":333,"children":334},{},[335,341,342,347,348,354,356,362,363],{"type":45,"tag":65,"props":336,"children":338},{"className":337},[],[339],{"type":50,"value":340},"pickle",{"type":50,"value":136},{"type":45,"tag":65,"props":343,"children":345},{"className":344},[],[346],{"type":50,"value":185},{"type":50,"value":136},{"type":45,"tag":65,"props":349,"children":351},{"className":350},[],[352],{"type":50,"value":353},"node-serialize",{"type":50,"value":355},", Java native, ",{"type":45,"tag":65,"props":357,"children":359},{"className":358},[],[360],{"type":50,"value":361},"BinaryFormatter",{"type":50,"value":136},{"type":45,"tag":65,"props":364,"children":366},{"className":365},[],[367],{"type":50,"value":368},"unserialize",{"type":45,"tag":301,"props":370,"children":371},{},[372],{"type":45,"tag":65,"props":373,"children":375},{"className":374},[],[376],{"type":50,"value":377},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fdeserialization.md",{"type":45,"tag":279,"props":379,"children":380},{},[381,399],{"type":45,"tag":301,"props":382,"children":383},{},[384,390,391,397],{"type":45,"tag":65,"props":385,"children":387},{"className":386},[],[388],{"type":50,"value":389},"render_template_string",{"type":50,"value":136},{"type":45,"tag":65,"props":392,"children":394},{"className":393},[],[395],{"type":50,"value":396},"Template(user_source)",{"type":50,"value":398},", Handlebars, Pug, Freemarker",{"type":45,"tag":301,"props":400,"children":401},{},[402],{"type":45,"tag":65,"props":403,"children":405},{"className":404},[],[406],{"type":50,"value":407},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fssti.md",{"type":45,"tag":279,"props":409,"children":410},{},[411,450],{"type":45,"tag":301,"props":412,"children":413},{},[414,420,421,427,428,434,435,441,442,448],{"type":45,"tag":65,"props":415,"children":417},{"className":416},[],[418],{"type":50,"value":419},"eval",{"type":50,"value":136},{"type":45,"tag":65,"props":422,"children":424},{"className":423},[],[425],{"type":50,"value":426},"exec",{"type":50,"value":136},{"type":45,"tag":65,"props":429,"children":431},{"className":430},[],[432],{"type":50,"value":433},"Function",{"type":50,"value":136},{"type":45,"tag":65,"props":436,"children":438},{"className":437},[],[439],{"type":50,"value":440},"vm.runInNewContext",{"type":50,"value":136},{"type":45,"tag":65,"props":443,"children":445},{"className":444},[],[446],{"type":50,"value":447},"compile",{"type":50,"value":449},", dynamic import",{"type":45,"tag":301,"props":451,"children":452},{},[453],{"type":45,"tag":65,"props":454,"children":456},{"className":455},[],[457],{"type":50,"value":458},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Feval.md",{"type":45,"tag":279,"props":460,"children":461},{},[462,494],{"type":45,"tag":301,"props":463,"children":464},{},[465,471,472,478,479,485,486,492],{"type":45,"tag":65,"props":466,"children":468},{"className":467},[],[469],{"type":50,"value":470},"Object.assign",{"type":50,"value":313},{"type":45,"tag":65,"props":473,"children":475},{"className":474},[],[476],{"type":50,"value":477},"lodash.merge",{"type":50,"value":313},{"type":45,"tag":65,"props":480,"children":482},{"className":481},[],[483],{"type":50,"value":484},"defaultsDeep",{"type":50,"value":313},{"type":45,"tag":65,"props":487,"children":489},{"className":488},[],[490],{"type":50,"value":491},"$.extend",{"type":50,"value":493}," + RCE sink",{"type":45,"tag":301,"props":495,"children":496},{},[497],{"type":45,"tag":65,"props":498,"children":500},{"className":499},[],[501],{"type":50,"value":502},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fprototype-pollution.md",{"type":45,"tag":264,"props":504,"children":506},{"id":505},"by-framework",[507],{"type":50,"value":508},"By framework",{"type":45,"tag":271,"props":510,"children":511},{},[512,526],{"type":45,"tag":275,"props":513,"children":514},{},[515],{"type":45,"tag":279,"props":516,"children":517},{},[518,522],{"type":45,"tag":283,"props":519,"children":520},{},[521],{"type":50,"value":287},{"type":45,"tag":283,"props":523,"children":524},{},[525],{"type":50,"value":292},{"type":45,"tag":294,"props":527,"children":528},{},[529,546,563,580,610,635],{"type":45,"tag":279,"props":530,"children":531},{},[532,537],{"type":45,"tag":301,"props":533,"children":534},{},[535],{"type":50,"value":536},"Sentry core: integration webhooks, YAML loaders, runner eval\u002Fexec",{"type":45,"tag":301,"props":538,"children":539},{},[540],{"type":45,"tag":65,"props":541,"children":543},{"className":542},[],[544],{"type":50,"value":545},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fsentry.md",{"type":45,"tag":279,"props":547,"children":548},{},[549,554],{"type":45,"tag":301,"props":550,"children":551},{},[552],{"type":50,"value":553},"Django views, templates, pickle session serializer",{"type":45,"tag":301,"props":555,"children":556},{},[557],{"type":45,"tag":65,"props":558,"children":560},{"className":559},[],[561],{"type":50,"value":562},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fdjango.md",{"type":45,"tag":279,"props":564,"children":565},{},[566,571],{"type":45,"tag":301,"props":567,"children":568},{},[569],{"type":50,"value":570},"FastAPI: Jinja2 templates, BackgroundTasks with subprocess",{"type":45,"tag":301,"props":572,"children":573},{},[574],{"type":45,"tag":65,"props":575,"children":577},{"className":576},[],[578],{"type":50,"value":579},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Ffastapi.md",{"type":45,"tag":279,"props":581,"children":582},{},[583,601],{"type":45,"tag":301,"props":584,"children":585},{},[586,588,593,595],{"type":50,"value":587},"Flask: ",{"type":45,"tag":65,"props":589,"children":591},{"className":590},[],[592],{"type":50,"value":389},{"type":50,"value":594},", Werkzeug debugger, ",{"type":45,"tag":65,"props":596,"children":598},{"className":597},[],[599],{"type":50,"value":600},"from_pyfile",{"type":45,"tag":301,"props":602,"children":603},{},[604],{"type":45,"tag":65,"props":605,"children":607},{"className":606},[],[608],{"type":50,"value":609},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fflask.md",{"type":45,"tag":279,"props":611,"children":612},{},[613,626],{"type":45,"tag":301,"props":614,"children":615},{},[616,618,624],{"type":50,"value":617},"Express \u002F Node: ",{"type":45,"tag":65,"props":619,"children":621},{"className":620},[],[622],{"type":50,"value":623},"child_process",{"type":50,"value":625},", vm, template engines, dynamic require",{"type":45,"tag":301,"props":627,"children":628},{},[629],{"type":45,"tag":65,"props":630,"children":632},{"className":631},[],[633],{"type":50,"value":634},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fexpress.md",{"type":45,"tag":279,"props":636,"children":637},{},[638,643],{"type":45,"tag":301,"props":639,"children":640},{},[641],{"type":50,"value":642},"Next.js: Server Actions with eval\u002FFunction, React2Shell (CVE-2025-55182)",{"type":45,"tag":301,"props":644,"children":645},{},[646],{"type":45,"tag":65,"props":647,"children":649},{"className":648},[],[650],{"type":50,"value":651},"${CLAUDE_SKILL_ROOT}\u002Freferences\u002Fnextjs.md",{"type":45,"tag":76,"props":653,"children":655},{"id":654},"severity",[656],{"type":50,"value":657},"Severity",{"type":45,"tag":271,"props":659,"children":660},{},[661,677],{"type":45,"tag":275,"props":662,"children":663},{},[664],{"type":45,"tag":279,"props":665,"children":666},{},[667,672],{"type":45,"tag":283,"props":668,"children":669},{},[670],{"type":50,"value":671},"Level",{"type":45,"tag":283,"props":673,"children":674},{},[675],{"type":50,"value":676},"Criteria",{"type":45,"tag":294,"props":678,"children":679},{},[680,724,740],{"type":45,"tag":279,"props":681,"children":682},{},[683,691],{"type":45,"tag":301,"props":684,"children":685},{},[686],{"type":45,"tag":96,"props":687,"children":688},{},[689],{"type":50,"value":690},"high",{"type":45,"tag":301,"props":692,"children":693},{},[694,696,701,703,708,709,715,717,722],{"type":50,"value":695},"Unauthenticated or low-privilege code execution. Unsafe deserialization of request bytes. SSTI with user-controlled template source. ",{"type":45,"tag":65,"props":697,"children":699},{"className":698},[],[700],{"type":50,"value":419},{"type":50,"value":702},"\u002F",{"type":45,"tag":65,"props":704,"children":706},{"className":705},[],[707],{"type":50,"value":433},{"type":50,"value":702},{"type":45,"tag":65,"props":710,"children":712},{"className":711},[],[713],{"type":50,"value":714},"vm",{"type":50,"value":716}," reached by request data. Shelled ",{"type":45,"tag":65,"props":718,"children":720},{"className":719},[],[721],{"type":50,"value":426},{"type":50,"value":723}," with user-interpolated command string.",{"type":45,"tag":279,"props":725,"children":726},{},[727,735],{"type":45,"tag":301,"props":728,"children":729},{},[730],{"type":45,"tag":96,"props":731,"children":732},{},[733],{"type":50,"value":734},"medium",{"type":45,"tag":301,"props":736,"children":737},{},[738],{"type":50,"value":739},"Sink reachable but gated by authentication (still a finding; authenticated RCE is still RCE). Library in a version known to have mitigations but not the full fix. Prototype pollution with a plausible downstream sink not yet traced.",{"type":45,"tag":279,"props":741,"children":742},{},[743,751],{"type":45,"tag":301,"props":744,"children":745},{},[746],{"type":45,"tag":96,"props":747,"children":748},{},[749],{"type":50,"value":750},"low",{"type":45,"tag":301,"props":752,"children":753},{},[754],{"type":50,"value":755},"Defense-in-depth gap. Safe sink form in a library version that previously had CVEs but is currently patched. Report only when the thread is clear.",{"type":45,"tag":46,"props":757,"children":758},{},[759],{"type":50,"value":760},"Pick the lower level when in doubt and explain why.",{"type":45,"tag":76,"props":762,"children":764},{"id":763},"what-to-report",[765],{"type":50,"value":766},"What to Report",{"type":45,"tag":264,"props":768,"children":770},{"id":769},"command-shell-injection",[771],{"type":50,"value":772},"Command \u002F shell injection",{"type":45,"tag":88,"props":774,"children":775},{},[776,815,839,874,894,907,940],{"type":45,"tag":92,"props":777,"children":778},{},[779,785,786,792,793,799,800,806,807,813],{"type":45,"tag":65,"props":780,"children":782},{"className":781},[],[783],{"type":50,"value":784},"os.system",{"type":50,"value":136},{"type":45,"tag":65,"props":787,"children":789},{"className":788},[],[790],{"type":50,"value":791},"os.popen",{"type":50,"value":136},{"type":45,"tag":65,"props":794,"children":796},{"className":795},[],[797],{"type":50,"value":798},"subprocess.run(..., shell=True)",{"type":50,"value":136},{"type":45,"tag":65,"props":801,"children":803},{"className":802},[],[804],{"type":50,"value":805},"subprocess.Popen(shell=True)",{"type":50,"value":136},{"type":45,"tag":65,"props":808,"children":810},{"className":809},[],[811],{"type":50,"value":812},"check_output(..., shell=True)",{"type":50,"value":814}," with user-interpolated command.",{"type":45,"tag":92,"props":816,"children":817},{},[818,823,824,830,831,837],{"type":45,"tag":65,"props":819,"children":821},{"className":820},[],[822],{"type":50,"value":311},{"type":50,"value":136},{"type":45,"tag":65,"props":825,"children":827},{"className":826},[],[828],{"type":50,"value":829},"child_process.execSync",{"type":50,"value":136},{"type":45,"tag":65,"props":832,"children":834},{"className":833},[],[835],{"type":50,"value":836},"spawn(..., { shell: true })",{"type":50,"value":838}," with template-string command.",{"type":45,"tag":92,"props":840,"children":841},{},[842,844,850,851,857,859,865,866,872],{"type":50,"value":843},"Windows: Node ",{"type":45,"tag":65,"props":845,"children":847},{"className":846},[],[848],{"type":50,"value":849},"spawn",{"type":50,"value":702},{"type":45,"tag":65,"props":852,"children":854},{"className":853},[],[855],{"type":50,"value":856},"execFile",{"type":50,"value":858}," targeting ",{"type":45,"tag":65,"props":860,"children":862},{"className":861},[],[863],{"type":50,"value":864},".bat",{"type":50,"value":702},{"type":45,"tag":65,"props":867,"children":869},{"className":868},[],[870],{"type":50,"value":871},".cmd",{"type":50,"value":873}," with user arguments on Node \u003C 18.20 \u002F 20.12 \u002F 21.7 (CVE-2024-27980, BatBadBut).",{"type":45,"tag":92,"props":875,"children":876},{},[877,879,885,886,892],{"type":50,"value":878},"Java ",{"type":45,"tag":65,"props":880,"children":882},{"className":881},[],[883],{"type":50,"value":884},"Runtime.exec(String)",{"type":50,"value":136},{"type":45,"tag":65,"props":887,"children":889},{"className":888},[],[890],{"type":50,"value":891},"ProcessBuilder(\"sh\", \"-c\", userString)",{"type":50,"value":893},".",{"type":45,"tag":92,"props":895,"children":896},{},[897,899,905],{"type":50,"value":898},"Ruby ",{"type":45,"tag":65,"props":900,"children":902},{"className":901},[],[903],{"type":50,"value":904},"system(\"... #{x}\")",{"type":50,"value":906},", backticks with interpolation.",{"type":45,"tag":92,"props":908,"children":909},{},[910,912,918,919,925,926,931,932,938],{"type":50,"value":911},"PHP ",{"type":45,"tag":65,"props":913,"children":915},{"className":914},[],[916],{"type":50,"value":917},"system",{"type":50,"value":136},{"type":45,"tag":65,"props":920,"children":922},{"className":921},[],[923],{"type":50,"value":924},"shell_exec",{"type":50,"value":136},{"type":45,"tag":65,"props":927,"children":929},{"className":928},[],[930],{"type":50,"value":426},{"type":50,"value":136},{"type":45,"tag":65,"props":933,"children":935},{"className":934},[],[936],{"type":50,"value":937},"passthru",{"type":50,"value":939},", backticks with user data.",{"type":45,"tag":92,"props":941,"children":942},{},[943,945,951,953,959,961,967,969,975],{"type":50,"value":944},"Argument injection without a shell: ",{"type":45,"tag":65,"props":946,"children":948},{"className":947},[],[949],{"type":50,"value":950},"subprocess.run([\"git\", user_arg])",{"type":50,"value":952}," where ",{"type":45,"tag":65,"props":954,"children":956},{"className":955},[],[957],{"type":50,"value":958},"user_arg",{"type":50,"value":960}," can be ",{"type":45,"tag":65,"props":962,"children":964},{"className":963},[],[965],{"type":50,"value":966},"--upload-pack=malicious",{"type":50,"value":968}," — missing ",{"type":45,"tag":65,"props":970,"children":972},{"className":971},[],[973],{"type":50,"value":974},"--",{"type":50,"value":976}," separator.",{"type":45,"tag":46,"props":978,"children":979},{},[980],{"type":50,"value":981},"Real: CVE-2021-22205 (GitLab ExifTool), CVE-2024-27980 (Node BatBadBut).",{"type":45,"tag":264,"props":983,"children":985},{"id":984},"unsafe-deserialization",[986],{"type":50,"value":987},"Unsafe deserialization",{"type":45,"tag":88,"props":989,"children":990},{},[991,1032,1056,1069,1081,1094,1105],{"type":45,"tag":92,"props":992,"children":993},{},[994,996,1002,1003,1009,1010,1016,1017,1023,1024,1030],{"type":50,"value":995},"Python ",{"type":45,"tag":65,"props":997,"children":999},{"className":998},[],[1000],{"type":50,"value":1001},"pickle.loads",{"type":50,"value":136},{"type":45,"tag":65,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":50,"value":1008},"cloudpickle.loads",{"type":50,"value":136},{"type":45,"tag":65,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":50,"value":1015},"joblib.load",{"type":50,"value":136},{"type":45,"tag":65,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":50,"value":1022},"dill.loads",{"type":50,"value":136},{"type":45,"tag":65,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":50,"value":1029},"marshal.loads",{"type":50,"value":1031}," on bytes that trace to external input.",{"type":45,"tag":92,"props":1033,"children":1034},{},[1035,1040,1041,1046,1048,1054],{"type":45,"tag":65,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":50,"value":185},{"type":50,"value":187},{"type":45,"tag":65,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":50,"value":193},{"type":50,"value":1047}," (PyYAML \u003C 5.1 defaulted to unsafe). ",{"type":45,"tag":65,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":50,"value":1053},"FullLoader",{"type":50,"value":1055}," before PyYAML 5.3.1 still allowed RCE gadgets (CVE-2020-1747).",{"type":45,"tag":92,"props":1057,"children":1058},{},[1059,1061,1067],{"type":50,"value":1060},"Node ",{"type":45,"tag":65,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":50,"value":1066},"node-serialize.unserialize",{"type":50,"value":1068}," (CVE-2017-5941, always unsafe).",{"type":45,"tag":92,"props":1070,"children":1071},{},[1072,1073,1079],{"type":50,"value":878},{"type":45,"tag":65,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":50,"value":1078},"ObjectInputStream.readObject",{"type":50,"value":1080}," on network input. Log4Shell (CVE-2021-44228). Spring4Shell (CVE-2022-22965).",{"type":45,"tag":92,"props":1082,"children":1083},{},[1084,1086,1092],{"type":50,"value":1085},".NET ",{"type":45,"tag":65,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":50,"value":1091},"BinaryFormatter.Deserialize",{"type":50,"value":1093}," on untrusted bytes (deprecated in .NET 5+).",{"type":45,"tag":92,"props":1095,"children":1096},{},[1097,1098,1103],{"type":50,"value":911},{"type":45,"tag":65,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":50,"value":368},{"type":50,"value":1104}," on user data.",{"type":45,"tag":92,"props":1106,"children":1107},{},[1108,1110,1116,1117,1122,1123,1129],{"type":50,"value":1109},"ML model files: ",{"type":45,"tag":65,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":50,"value":1115},"torch.load",{"type":50,"value":136},{"type":45,"tag":65,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":50,"value":1015},{"type":50,"value":136},{"type":45,"tag":65,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":50,"value":1128},"pickle.load",{"type":50,"value":1130}," on attacker-uploaded models (Picklescan CVE-2025-1716 pattern).",{"type":45,"tag":264,"props":1132,"children":1134},{"id":1133},"server-side-template-injection",[1135],{"type":50,"value":1136},"Server-side template injection",{"type":45,"tag":88,"props":1138,"children":1139},{},[1140,1151,1161,1172,1189],{"type":45,"tag":92,"props":1141,"children":1142},{},[1143,1149],{"type":45,"tag":65,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":50,"value":1148},"render_template_string(request.args[...])",{"type":50,"value":1150}," (Flask SSTI canonical).",{"type":45,"tag":92,"props":1152,"children":1153},{},[1154,1160],{"type":45,"tag":65,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":50,"value":1159},"jinja2.Template(user_source).render(...)",{"type":50,"value":893},{"type":45,"tag":92,"props":1162,"children":1163},{},[1164,1170],{"type":45,"tag":65,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":50,"value":1169},"Handlebars.compile(req.body.template)",{"type":50,"value":1171}," (CVE-2019-19919 prototype pollution → compile-time RCE).",{"type":45,"tag":92,"props":1173,"children":1174},{},[1175,1181,1182,1188],{"type":45,"tag":65,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":50,"value":1180},"pug.compile(user_source)",{"type":50,"value":136},{"type":45,"tag":65,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":50,"value":1187},"ejs.render(user_template, ...)",{"type":50,"value":893},{"type":45,"tag":92,"props":1190,"children":1191},{},[1192,1194,1200],{"type":50,"value":1193},"Freemarker \u002F Velocity with user-controlled template source; ",{"type":45,"tag":65,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":50,"value":1199},"\u003C#assign value=\"freemarker.template.utility.Execute\"?new()>",{"type":50,"value":1201}," gadget.",{"type":45,"tag":46,"props":1203,"children":1204},{},[1205,1207,1213],{"type":50,"value":1206},"Jinja2 ",{"type":45,"tag":65,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":50,"value":1212},"SandboxedEnvironment",{"type":50,"value":1214}," has a history of bypasses (CVE-2019-10906, CVE-2016-10745). Treat sandbox as soft armor, not prevention.",{"type":45,"tag":264,"props":1216,"children":1218},{"id":1217},"eval-function-vm-reached-by-user-input",[1219],{"type":50,"value":1220},"eval \u002F Function \u002F vm reached by user input",{"type":45,"tag":88,"props":1222,"children":1223},{},[1224,1247,1286,1305,1315,1347,1367,1379,1392],{"type":45,"tag":92,"props":1225,"children":1226},{},[1227,1228,1233,1234,1239,1240,1245],{"type":50,"value":995},{"type":45,"tag":65,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":50,"value":419},{"type":50,"value":136},{"type":45,"tag":65,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":50,"value":426},{"type":50,"value":136},{"type":45,"tag":65,"props":1241,"children":1243},{"className":1242},[],[1244],{"type":50,"value":447},{"type":50,"value":1246}," with request data.",{"type":45,"tag":92,"props":1248,"children":1249},{},[1250,1252,1257,1258,1264,1265,1271,1272,1278,1279,1285],{"type":50,"value":1251},"JS ",{"type":45,"tag":65,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":50,"value":419},{"type":50,"value":136},{"type":45,"tag":65,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":50,"value":1263},"new Function",{"type":50,"value":136},{"type":45,"tag":65,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":50,"value":1270},"new AsyncFunction",{"type":50,"value":136},{"type":45,"tag":65,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":50,"value":1277},"setTimeout(string_arg, ...)",{"type":50,"value":136},{"type":45,"tag":65,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":50,"value":1284},"setInterval(string_arg, ...)",{"type":50,"value":893},{"type":45,"tag":92,"props":1287,"children":1288},{},[1289,1290,1296,1298,1303],{"type":50,"value":1060},{"type":45,"tag":65,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":50,"value":1295},"vm.runInThisContext",{"type":50,"value":1297}," (shares realm; RCE), ",{"type":45,"tag":65,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":50,"value":440},{"type":50,"value":1304}," (pseudo-sandbox; escape-prone).",{"type":45,"tag":92,"props":1306,"children":1307},{},[1308,1313],{"type":45,"tag":65,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":50,"value":209},{"type":50,"value":1314}," in any version — abandoned after CVE-2023-37903.",{"type":45,"tag":92,"props":1316,"children":1317},{},[1318,1319,1324,1325,1331,1332,1338,1340,1346],{"type":50,"value":898},{"type":45,"tag":65,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":50,"value":419},{"type":50,"value":136},{"type":45,"tag":65,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":50,"value":1330},"instance_eval",{"type":50,"value":136},{"type":45,"tag":65,"props":1333,"children":1335},{"className":1334},[],[1336],{"type":50,"value":1337},"class_eval",{"type":50,"value":1339}," with user data; ",{"type":45,"tag":65,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":50,"value":1345},"send(user_method, ...)",{"type":50,"value":893},{"type":45,"tag":92,"props":1348,"children":1349},{},[1350,1351,1357,1359,1365],{"type":50,"value":911},{"type":45,"tag":65,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":50,"value":1356},"eval($user)",{"type":50,"value":1358},"; ",{"type":45,"tag":65,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":50,"value":1364},"assert($string)",{"type":50,"value":1366}," before PHP 7.2.",{"type":45,"tag":92,"props":1368,"children":1369},{},[1370,1372,1378],{"type":50,"value":1371},"Spring SpEL ",{"type":45,"tag":65,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":50,"value":1377},"parser.parseExpression(user_expr).getValue()",{"type":50,"value":893},{"type":45,"tag":92,"props":1380,"children":1381},{},[1382,1384,1390],{"type":50,"value":1383},"Nashorn\u002FGraalJS\u002FRhino ",{"type":45,"tag":65,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":50,"value":1389},"scriptEngine.eval(user_script)",{"type":50,"value":1391}," on a JVM.",{"type":45,"tag":92,"props":1393,"children":1394},{},[1395,1397,1403,1404,1410,1411,1417],{"type":50,"value":1396},"Dynamic ",{"type":45,"tag":65,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":50,"value":1402},"import(user_specifier)",{"type":50,"value":136},{"type":45,"tag":65,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":50,"value":1409},"require(user_path)",{"type":50,"value":136},{"type":45,"tag":65,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":50,"value":1416},"importlib.import_module(user_name)",{"type":50,"value":893},{"type":45,"tag":46,"props":1419,"children":1420},{},[1421],{"type":50,"value":1422},"Real: CVE-2025-55182 (Next.js React2Shell), every vm2 CVE, every Spring4Shell lineage bug.",{"type":45,"tag":264,"props":1424,"children":1426},{"id":1425},"prototype-pollution-reaching-a-code-execution-sink",[1427],{"type":50,"value":1428},"Prototype pollution reaching a code-execution sink",{"type":45,"tag":88,"props":1430,"children":1431},{},[1432,1469,1480,1506],{"type":45,"tag":92,"props":1433,"children":1434},{},[1435,1440,1441,1447,1448,1453,1454,1460,1461,1467],{"type":45,"tag":65,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":50,"value":477},{"type":50,"value":313},{"type":45,"tag":65,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":50,"value":1446},"mergeWith",{"type":50,"value":313},{"type":45,"tag":65,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":50,"value":484},{"type":50,"value":313},{"type":45,"tag":65,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":50,"value":1459},"set",{"type":50,"value":313},{"type":45,"tag":65,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":50,"value":1466},"setWith",{"type":50,"value":1468}," with user data (CVE-2019-10744, CVE-2020-8203).",{"type":45,"tag":92,"props":1470,"children":1471},{},[1472,1478],{"type":45,"tag":65,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":50,"value":1477},"jQuery.extend(true, ...)",{"type":50,"value":1479}," with user data (CVE-2019-11358).",{"type":45,"tag":92,"props":1481,"children":1482},{},[1483,1485,1491,1492,1498,1499,1505],{"type":50,"value":1484},"Hand-rolled recursive merge that does not filter ",{"type":45,"tag":65,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":50,"value":1490},"__proto__",{"type":50,"value":313},{"type":45,"tag":65,"props":1493,"children":1495},{"className":1494},[],[1496],{"type":50,"value":1497},"prototype",{"type":50,"value":313},{"type":45,"tag":65,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":50,"value":1504},"constructor",{"type":50,"value":893},{"type":45,"tag":92,"props":1507,"children":1508},{},[1509,1511,1516],{"type":50,"value":1510},"Downstream sink: Handlebars template compile reading polluted helper (CVE-2019-19919), ",{"type":45,"tag":65,"props":1512,"children":1514},{"className":1513},[],[1515],{"type":50,"value":433},{"type":50,"value":1517}," constructor reading polluted property, auth check that lands on polluted flag. axios header injection → IMDS bypass (CVE-2026-40175).",{"type":45,"tag":264,"props":1519,"children":1521},{"id":1520},"xxe-with-rce-gadgets",[1522],{"type":50,"value":1523},"XXE with RCE gadgets",{"type":45,"tag":46,"props":1525,"children":1526},{},[1527],{"type":50,"value":1528},"XXE is usually a file-read or SSRF issue. Report the RCE branch here only when the stack exposes code-loading or gadget execution:",{"type":45,"tag":88,"props":1530,"children":1531},{},[1532,1552],{"type":45,"tag":92,"props":1533,"children":1534},{},[1535,1537,1543,1544,1550],{"type":50,"value":1536},"Java XXE → classloader gadgets or JNDI lookup paths. ",{"type":45,"tag":65,"props":1538,"children":1540},{"className":1539},[],[1541],{"type":50,"value":1542},"DocumentBuilder",{"type":50,"value":187},{"type":45,"tag":65,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":50,"value":1549},"disallow-doctype-decl",{"type":50,"value":1551}," on a JVM with Log4Shell-class gadgets on the classpath.",{"type":45,"tag":92,"props":1553,"children":1554},{},[1555,1557,1563,1565,1571],{"type":50,"value":1556},"XSLT extensions that invoke system calls (",{"type":45,"tag":65,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":50,"value":1562},"xsl:invoke-java",{"type":50,"value":1564},", legacy PHP ",{"type":45,"tag":65,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":50,"value":1570},"XSL",{"type":50,"value":1572}," extensions).",{"type":45,"tag":46,"props":1574,"children":1575},{},[1576],{"type":50,"value":1577},"Most XXE finds file exfiltration; flag the RCE branch when the stack is Java with deserialization gadgets present.",{"type":45,"tag":76,"props":1579,"children":1581},{"id":1580},"what-not-to-report",[1582],{"type":50,"value":1583},"What NOT to Report",{"type":45,"tag":88,"props":1585,"children":1586},{},[1587,1597,1607,1640,1656],{"type":45,"tag":92,"props":1588,"children":1589},{},[1590,1595],{"type":45,"tag":96,"props":1591,"children":1592},{},[1593],{"type":50,"value":1594},"Data exfiltration",{"type":50,"value":1596}," (SSRF, path traversal, SQL\u002FNoSQL injection enabling bulk reads, response field leakage).",{"type":45,"tag":92,"props":1598,"children":1599},{},[1600,1605],{"type":45,"tag":96,"props":1601,"children":1602},{},[1603],{"type":50,"value":1604},"Authorization",{"type":50,"value":1606}," (IDOR, missing ownership checks, role or tenant escalation, mass assignment enabling role elevation).",{"type":45,"tag":92,"props":1608,"children":1609},{},[1610,1615,1616,1621,1622,1627,1628,1633,1634,1639],{"type":45,"tag":96,"props":1611,"children":1612},{},[1613],{"type":50,"value":1614},"XSS",{"type":50,"value":136},{"type":45,"tag":96,"props":1617,"children":1618},{},[1619],{"type":50,"value":1620},"CSRF",{"type":50,"value":136},{"type":45,"tag":96,"props":1623,"children":1624},{},[1625],{"type":50,"value":1626},"crypto primitive misuse",{"type":50,"value":136},{"type":45,"tag":96,"props":1629,"children":1630},{},[1631],{"type":50,"value":1632},"secrets in source",{"type":50,"value":136},{"type":45,"tag":96,"props":1635,"children":1636},{},[1637],{"type":50,"value":1638},"transport security",{"type":50,"value":893},{"type":45,"tag":92,"props":1641,"children":1642},{},[1643,1648,1649,1654],{"type":45,"tag":96,"props":1644,"children":1645},{},[1646],{"type":50,"value":1647},"DoS",{"type":50,"value":313},{"type":45,"tag":96,"props":1650,"children":1651},{},[1652],{"type":50,"value":1653},"ReDoS",{"type":50,"value":1655}," unless it directly enables a code-execution sink.",{"type":45,"tag":92,"props":1657,"children":1658},{},[1659,1664],{"type":45,"tag":96,"props":1660,"children":1661},{},[1662],{"type":50,"value":1663},"Dependency CVEs",{"type":50,"value":1665}," as a class.",{"type":45,"tag":76,"props":1667,"children":1669},{"id":1668},"false-positive-traps",[1670],{"type":50,"value":1671},"False-Positive Traps",{"type":45,"tag":1673,"props":1674,"children":1675},"ol",{},[1676,1706,1738,1767,1797,1820,1834,1871,1887],{"type":45,"tag":92,"props":1677,"children":1678},{},[1679,1697,1699,1704],{"type":45,"tag":96,"props":1680,"children":1681},{},[1682,1688,1689,1695],{"type":45,"tag":65,"props":1683,"children":1685},{"className":1684},[],[1686],{"type":50,"value":1687},"yaml.safe_load",{"type":50,"value":313},{"type":45,"tag":65,"props":1690,"children":1692},{"className":1691},[],[1693],{"type":50,"value":1694},"yaml.load(..., Loader=SafeLoader)",{"type":50,"value":1696}," is safe.",{"type":50,"value":1698}," Only plain ",{"type":45,"tag":65,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":50,"value":185},{"type":50,"value":1705}," on old PyYAML or explicit unsafe loaders are RCE.",{"type":45,"tag":92,"props":1707,"children":1708},{},[1709,1728,1730,1736],{"type":45,"tag":96,"props":1710,"children":1711},{},[1712,1718,1720,1726],{"type":45,"tag":65,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":50,"value":1717},"subprocess.run([\"cmd\", arg])",{"type":50,"value":1719}," with ",{"type":45,"tag":65,"props":1721,"children":1723},{"className":1722},[],[1724],{"type":50,"value":1725},"shell=False",{"type":50,"value":1727}," is safe",{"type":50,"value":1729}," on POSIX regardless of ",{"type":45,"tag":65,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":50,"value":1735},"arg",{"type":50,"value":1737}," content (assuming the binary path is a literal).",{"type":45,"tag":92,"props":1739,"children":1740},{},[1741,1752,1754,1759,1760,1765],{"type":45,"tag":96,"props":1742,"children":1743},{},[1744,1750],{"type":45,"tag":65,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":50,"value":1749},"execFile('bin', [userArg])",{"type":50,"value":1751}," on Linux\u002FmacOS is safe.",{"type":50,"value":1753}," Windows ",{"type":45,"tag":65,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":50,"value":864},{"type":50,"value":702},{"type":45,"tag":65,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":50,"value":871},{"type":50,"value":1766}," targets implicitly shell on old Node (CVE-2024-27980).",{"type":45,"tag":92,"props":1768,"children":1769},{},[1770,1779,1781,1787,1789,1795],{"type":45,"tag":96,"props":1771,"children":1772},{},[1773],{"type":45,"tag":65,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":50,"value":1778},"render_template(\"file.html\", user=user)",{"type":50,"value":1780}," with a literal filename is safe. Only ",{"type":45,"tag":65,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":50,"value":1786},"render_template_string(user_input)",{"type":50,"value":1788}," or ",{"type":45,"tag":65,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":50,"value":1794},"Template(user_input)",{"type":50,"value":1796}," is SSTI.",{"type":45,"tag":92,"props":1798,"children":1799},{},[1800,1818],{"type":45,"tag":96,"props":1801,"children":1802},{},[1803,1808,1810,1816],{"type":45,"tag":65,"props":1804,"children":1806},{"className":1805},[],[1807],{"type":50,"value":419},{"type":50,"value":1809}," inside ",{"type":45,"tag":65,"props":1811,"children":1813},{"className":1812},[],[1814],{"type":50,"value":1815},"tests\u002F",{"type":50,"value":1817},", example notebooks, or an explicit sandboxed REPL",{"type":50,"value":1819}," is not production-reachable. Confirm the file role.",{"type":45,"tag":92,"props":1821,"children":1822},{},[1823,1832],{"type":45,"tag":96,"props":1824,"children":1825},{},[1826],{"type":45,"tag":65,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":50,"value":1831},"ast.literal_eval",{"type":50,"value":1833}," is safe; parses literals without executing.",{"type":45,"tag":92,"props":1835,"children":1836},{},[1837,1847,1849,1855,1856,1862,1863,1869],{"type":45,"tag":96,"props":1838,"children":1839},{},[1840,1845],{"type":45,"tag":65,"props":1841,"children":1843},{"className":1842},[],[1844],{"type":50,"value":340},{"type":50,"value":1846}," on internal state",{"type":50,"value":1848}," (module caches, worker IPC, ORM fields, Redis keys written by the same application) is not attacker-reachable. Sentry does this in ",{"type":45,"tag":65,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":50,"value":1854},"arroyo",{"type":50,"value":136},{"type":45,"tag":65,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":50,"value":1861},"buffer\u002Fredis",{"type":50,"value":136},{"type":45,"tag":65,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":50,"value":1868},"gzippeddict",{"type":50,"value":1870},". Confirm the source is internal before flagging.",{"type":45,"tag":92,"props":1872,"children":1873},{},[1874,1885],{"type":45,"tag":96,"props":1875,"children":1876},{},[1877,1879],{"type":50,"value":1878},"Template source from ",{"type":45,"tag":65,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":50,"value":1884},"readFileSync('views\u002Fx.hbs')",{"type":50,"value":1886}," is safe. Only user-controlled template source is SSTI.",{"type":45,"tag":92,"props":1888,"children":1889},{},[1890,1901],{"type":45,"tag":96,"props":1891,"children":1892},{},[1893,1899],{"type":45,"tag":65,"props":1894,"children":1896},{"className":1895},[],[1897],{"type":50,"value":1898},"Prisma.$queryRaw\\",{"type":50,"value":1900},"...`",{"type":50,"value":1902}," (tagged template) is not an eval sink. Treat SQL injection as out of scope unless it reaches code execution.",{"type":45,"tag":76,"props":1904,"children":1906},{"id":1905},"canonical-patterns",[1907],{"type":50,"value":1908},"Canonical Patterns",{"type":45,"tag":264,"props":1910,"children":1912},{"id":1911},"pattern-command-injection-via-shelled-exec",[1913],{"type":50,"value":1914},"Pattern: Command injection via shelled exec",{"type":45,"tag":46,"props":1916,"children":1917},{},[1918],{"type":50,"value":1919},"Real: CVE-2021-22205 (GitLab + ExifTool).",{"type":45,"tag":46,"props":1921,"children":1922},{},[1923],{"type":45,"tag":96,"props":1924,"children":1925},{},[1926],{"type":50,"value":1927},"Python - bad:",{"type":45,"tag":58,"props":1929,"children":1933},{"className":1930,"code":1931,"language":1932,"meta":67,"style":67},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","subprocess.run(f\"convert {user_filename} out.png\", shell=True)\nos.system(f\"git clone {user_repo_url}\")\n","python",[1934],{"type":45,"tag":65,"props":1935,"children":1936},{"__ignoreMap":67},[1937,1948],{"type":45,"tag":1938,"props":1939,"children":1942},"span",{"class":1940,"line":1941},"line",1,[1943],{"type":45,"tag":1938,"props":1944,"children":1945},{},[1946],{"type":50,"value":1947},"subprocess.run(f\"convert {user_filename} out.png\", shell=True)\n",{"type":45,"tag":1938,"props":1949,"children":1951},{"class":1940,"line":1950},2,[1952],{"type":45,"tag":1938,"props":1953,"children":1954},{},[1955],{"type":50,"value":1956},"os.system(f\"git clone {user_repo_url}\")\n",{"type":45,"tag":46,"props":1958,"children":1959},{},[1960],{"type":45,"tag":96,"props":1961,"children":1962},{},[1963],{"type":50,"value":1964},"Python - safe:",{"type":45,"tag":58,"props":1966,"children":1968},{"className":1930,"code":1967,"language":1932,"meta":67,"style":67},"subprocess.run([\"convert\", user_filename, \"out.png\"], shell=False, check=True)\nsubprocess.run([\"git\", \"clone\", \"--\", user_repo_url], check=True)\n",[1969],{"type":45,"tag":65,"props":1970,"children":1971},{"__ignoreMap":67},[1972,1980],{"type":45,"tag":1938,"props":1973,"children":1974},{"class":1940,"line":1941},[1975],{"type":45,"tag":1938,"props":1976,"children":1977},{},[1978],{"type":50,"value":1979},"subprocess.run([\"convert\", user_filename, \"out.png\"], shell=False, check=True)\n",{"type":45,"tag":1938,"props":1981,"children":1982},{"class":1940,"line":1950},[1983],{"type":45,"tag":1938,"props":1984,"children":1985},{},[1986],{"type":50,"value":1987},"subprocess.run([\"git\", \"clone\", \"--\", user_repo_url], check=True)\n",{"type":45,"tag":46,"props":1989,"children":1990},{},[1991],{"type":45,"tag":96,"props":1992,"children":1993},{},[1994],{"type":50,"value":1995},"TypeScript - bad:",{"type":45,"tag":58,"props":1997,"children":2001},{"className":1998,"code":1999,"language":2000,"meta":67,"style":67},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","execSync(`git clone ${userRepoUrl}`);\n","ts",[2002],{"type":45,"tag":65,"props":2003,"children":2004},{"__ignoreMap":67},[2005],{"type":45,"tag":1938,"props":2006,"children":2007},{"class":1940,"line":1941},[2008,2014,2020,2026,2032,2037,2042,2047,2052],{"type":45,"tag":1938,"props":2009,"children":2011},{"style":2010},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[2012],{"type":50,"value":2013},"execSync",{"type":45,"tag":1938,"props":2015,"children":2017},{"style":2016},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2018],{"type":50,"value":2019},"(",{"type":45,"tag":1938,"props":2021,"children":2023},{"style":2022},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2024],{"type":50,"value":2025},"`",{"type":45,"tag":1938,"props":2027,"children":2029},{"style":2028},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2030],{"type":50,"value":2031},"git clone ",{"type":45,"tag":1938,"props":2033,"children":2034},{"style":2022},[2035],{"type":50,"value":2036},"${",{"type":45,"tag":1938,"props":2038,"children":2039},{"style":2016},[2040],{"type":50,"value":2041},"userRepoUrl",{"type":45,"tag":1938,"props":2043,"children":2044},{"style":2022},[2045],{"type":50,"value":2046},"}`",{"type":45,"tag":1938,"props":2048,"children":2049},{"style":2016},[2050],{"type":50,"value":2051},")",{"type":45,"tag":1938,"props":2053,"children":2054},{"style":2022},[2055],{"type":50,"value":2056},";\n",{"type":45,"tag":46,"props":2058,"children":2059},{},[2060],{"type":45,"tag":96,"props":2061,"children":2062},{},[2063],{"type":50,"value":2064},"TypeScript - safe:",{"type":45,"tag":58,"props":2066,"children":2068},{"className":1998,"code":2067,"language":2000,"meta":67,"style":67},"execFile('git', ['clone', '--', userRepoUrl]);\n",[2069],{"type":45,"tag":65,"props":2070,"children":2071},{"__ignoreMap":67},[2072],{"type":45,"tag":1938,"props":2073,"children":2074},{"class":1940,"line":1941},[2075,2079,2083,2088,2093,2097,2102,2107,2111,2116,2120,2124,2129,2133,2137,2141,2146],{"type":45,"tag":1938,"props":2076,"children":2077},{"style":2010},[2078],{"type":50,"value":856},{"type":45,"tag":1938,"props":2080,"children":2081},{"style":2016},[2082],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2084,"children":2085},{"style":2022},[2086],{"type":50,"value":2087},"'",{"type":45,"tag":1938,"props":2089,"children":2090},{"style":2028},[2091],{"type":50,"value":2092},"git",{"type":45,"tag":1938,"props":2094,"children":2095},{"style":2022},[2096],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2098,"children":2099},{"style":2022},[2100],{"type":50,"value":2101},",",{"type":45,"tag":1938,"props":2103,"children":2104},{"style":2016},[2105],{"type":50,"value":2106}," [",{"type":45,"tag":1938,"props":2108,"children":2109},{"style":2022},[2110],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2112,"children":2113},{"style":2028},[2114],{"type":50,"value":2115},"clone",{"type":45,"tag":1938,"props":2117,"children":2118},{"style":2022},[2119],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2121,"children":2122},{"style":2022},[2123],{"type":50,"value":2101},{"type":45,"tag":1938,"props":2125,"children":2126},{"style":2022},[2127],{"type":50,"value":2128}," '",{"type":45,"tag":1938,"props":2130,"children":2131},{"style":2028},[2132],{"type":50,"value":974},{"type":45,"tag":1938,"props":2134,"children":2135},{"style":2022},[2136],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2138,"children":2139},{"style":2022},[2140],{"type":50,"value":2101},{"type":45,"tag":1938,"props":2142,"children":2143},{"style":2016},[2144],{"type":50,"value":2145}," userRepoUrl])",{"type":45,"tag":1938,"props":2147,"children":2148},{"style":2022},[2149],{"type":50,"value":2056},{"type":45,"tag":264,"props":2151,"children":2153},{"id":2152},"pattern-unsafe-yaml-load",[2154],{"type":50,"value":2155},"Pattern: Unsafe YAML load",{"type":45,"tag":46,"props":2157,"children":2158},{},[2159,2161,2166],{"type":50,"value":2160},"Real: CVE-2020-1747 (PyYAML ",{"type":45,"tag":65,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":50,"value":1053},{"type":50,"value":2167},").",{"type":45,"tag":46,"props":2169,"children":2170},{},[2171],{"type":45,"tag":96,"props":2172,"children":2173},{},[2174],{"type":50,"value":1927},{"type":45,"tag":58,"props":2176,"children":2178},{"className":1930,"code":2177,"language":1932,"meta":67,"style":67},"config = yaml.load(request.data)\nconfig = yaml.load(request.data, Loader=yaml.Loader)\n",[2179],{"type":45,"tag":65,"props":2180,"children":2181},{"__ignoreMap":67},[2182,2190],{"type":45,"tag":1938,"props":2183,"children":2184},{"class":1940,"line":1941},[2185],{"type":45,"tag":1938,"props":2186,"children":2187},{},[2188],{"type":50,"value":2189},"config = yaml.load(request.data)\n",{"type":45,"tag":1938,"props":2191,"children":2192},{"class":1940,"line":1950},[2193],{"type":45,"tag":1938,"props":2194,"children":2195},{},[2196],{"type":50,"value":2197},"config = yaml.load(request.data, Loader=yaml.Loader)\n",{"type":45,"tag":46,"props":2199,"children":2200},{},[2201],{"type":45,"tag":96,"props":2202,"children":2203},{},[2204],{"type":50,"value":1964},{"type":45,"tag":58,"props":2206,"children":2208},{"className":1930,"code":2207,"language":1932,"meta":67,"style":67},"config = yaml.safe_load(request.data)\nconfig = yaml.load(request.data, Loader=yaml.SafeLoader)\n",[2209],{"type":45,"tag":65,"props":2210,"children":2211},{"__ignoreMap":67},[2212,2220],{"type":45,"tag":1938,"props":2213,"children":2214},{"class":1940,"line":1941},[2215],{"type":45,"tag":1938,"props":2216,"children":2217},{},[2218],{"type":50,"value":2219},"config = yaml.safe_load(request.data)\n",{"type":45,"tag":1938,"props":2221,"children":2222},{"class":1940,"line":1950},[2223],{"type":45,"tag":1938,"props":2224,"children":2225},{},[2226],{"type":50,"value":2227},"config = yaml.load(request.data, Loader=yaml.SafeLoader)\n",{"type":45,"tag":264,"props":2229,"children":2231},{"id":2230},"pattern-ssti-via-user-template-source",[2232],{"type":50,"value":2233},"Pattern: SSTI via user template source",{"type":45,"tag":46,"props":2235,"children":2236},{},[2237],{"type":50,"value":2238},"Real: PortSwigger canonical, CVE-2019-10906 (Jinja2 sandbox escape).",{"type":45,"tag":46,"props":2240,"children":2241},{},[2242],{"type":45,"tag":96,"props":2243,"children":2244},{},[2245],{"type":50,"value":2246},"Python (Flask) - bad:",{"type":45,"tag":58,"props":2248,"children":2250},{"className":1930,"code":2249,"language":1932,"meta":67,"style":67},"@app.route(\"\u002Fpreview\")\ndef preview():\n    return render_template_string(request.args[\"body\"])\n",[2251],{"type":45,"tag":65,"props":2252,"children":2253},{"__ignoreMap":67},[2254,2262,2270],{"type":45,"tag":1938,"props":2255,"children":2256},{"class":1940,"line":1941},[2257],{"type":45,"tag":1938,"props":2258,"children":2259},{},[2260],{"type":50,"value":2261},"@app.route(\"\u002Fpreview\")\n",{"type":45,"tag":1938,"props":2263,"children":2264},{"class":1940,"line":1950},[2265],{"type":45,"tag":1938,"props":2266,"children":2267},{},[2268],{"type":50,"value":2269},"def preview():\n",{"type":45,"tag":1938,"props":2271,"children":2272},{"class":1940,"line":31},[2273],{"type":45,"tag":1938,"props":2274,"children":2275},{},[2276],{"type":50,"value":2277},"    return render_template_string(request.args[\"body\"])\n",{"type":45,"tag":46,"props":2279,"children":2280},{},[2281],{"type":45,"tag":96,"props":2282,"children":2283},{},[2284],{"type":50,"value":1964},{"type":45,"tag":58,"props":2286,"children":2288},{"className":1930,"code":2287,"language":1932,"meta":67,"style":67},"return render_template(\"preview.html\", body=request.args[\"body\"])\n",[2289],{"type":45,"tag":65,"props":2290,"children":2291},{"__ignoreMap":67},[2292],{"type":45,"tag":1938,"props":2293,"children":2294},{"class":1940,"line":1941},[2295],{"type":45,"tag":1938,"props":2296,"children":2297},{},[2298],{"type":50,"value":2287},{"type":45,"tag":46,"props":2300,"children":2301},{},[2302],{"type":45,"tag":96,"props":2303,"children":2304},{},[2305],{"type":50,"value":2306},"TypeScript (Handlebars) - bad:",{"type":45,"tag":58,"props":2308,"children":2310},{"className":1998,"code":2309,"language":2000,"meta":67,"style":67},"const tmpl = Handlebars.compile(req.body.template);\nres.send(tmpl({ user: req.user }));\n",[2311],{"type":45,"tag":65,"props":2312,"children":2313},{"__ignoreMap":67},[2314,2373],{"type":45,"tag":1938,"props":2315,"children":2316},{"class":1940,"line":1941},[2317,2323,2328,2333,2338,2342,2346,2351,2355,2360,2364,2369],{"type":45,"tag":1938,"props":2318,"children":2320},{"style":2319},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2321],{"type":50,"value":2322},"const",{"type":45,"tag":1938,"props":2324,"children":2325},{"style":2016},[2326],{"type":50,"value":2327}," tmpl ",{"type":45,"tag":1938,"props":2329,"children":2330},{"style":2022},[2331],{"type":50,"value":2332},"=",{"type":45,"tag":1938,"props":2334,"children":2335},{"style":2016},[2336],{"type":50,"value":2337}," Handlebars",{"type":45,"tag":1938,"props":2339,"children":2340},{"style":2022},[2341],{"type":50,"value":893},{"type":45,"tag":1938,"props":2343,"children":2344},{"style":2010},[2345],{"type":50,"value":447},{"type":45,"tag":1938,"props":2347,"children":2348},{"style":2016},[2349],{"type":50,"value":2350},"(req",{"type":45,"tag":1938,"props":2352,"children":2353},{"style":2022},[2354],{"type":50,"value":893},{"type":45,"tag":1938,"props":2356,"children":2357},{"style":2016},[2358],{"type":50,"value":2359},"body",{"type":45,"tag":1938,"props":2361,"children":2362},{"style":2022},[2363],{"type":50,"value":893},{"type":45,"tag":1938,"props":2365,"children":2366},{"style":2016},[2367],{"type":50,"value":2368},"template)",{"type":45,"tag":1938,"props":2370,"children":2371},{"style":2022},[2372],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2374,"children":2375},{"class":1940,"line":1950},[2376,2381,2385,2390,2394,2399,2403,2408,2414,2419,2424,2428,2433,2438,2443],{"type":45,"tag":1938,"props":2377,"children":2378},{"style":2016},[2379],{"type":50,"value":2380},"res",{"type":45,"tag":1938,"props":2382,"children":2383},{"style":2022},[2384],{"type":50,"value":893},{"type":45,"tag":1938,"props":2386,"children":2387},{"style":2010},[2388],{"type":50,"value":2389},"send",{"type":45,"tag":1938,"props":2391,"children":2392},{"style":2016},[2393],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2395,"children":2396},{"style":2010},[2397],{"type":50,"value":2398},"tmpl",{"type":45,"tag":1938,"props":2400,"children":2401},{"style":2016},[2402],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2404,"children":2405},{"style":2022},[2406],{"type":50,"value":2407},"{",{"type":45,"tag":1938,"props":2409,"children":2411},{"style":2410},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2412],{"type":50,"value":2413}," user",{"type":45,"tag":1938,"props":2415,"children":2416},{"style":2022},[2417],{"type":50,"value":2418},":",{"type":45,"tag":1938,"props":2420,"children":2421},{"style":2016},[2422],{"type":50,"value":2423}," req",{"type":45,"tag":1938,"props":2425,"children":2426},{"style":2022},[2427],{"type":50,"value":893},{"type":45,"tag":1938,"props":2429,"children":2430},{"style":2016},[2431],{"type":50,"value":2432},"user ",{"type":45,"tag":1938,"props":2434,"children":2435},{"style":2022},[2436],{"type":50,"value":2437},"}",{"type":45,"tag":1938,"props":2439,"children":2440},{"style":2016},[2441],{"type":50,"value":2442},"))",{"type":45,"tag":1938,"props":2444,"children":2445},{"style":2022},[2446],{"type":50,"value":2056},{"type":45,"tag":46,"props":2448,"children":2449},{},[2450],{"type":45,"tag":96,"props":2451,"children":2452},{},[2453],{"type":50,"value":2064},{"type":45,"tag":58,"props":2455,"children":2457},{"className":1998,"code":2456,"language":2000,"meta":67,"style":67},"const tmpl = Handlebars.compile(readFileSync('preview.hbs', 'utf8'));\nres.send(tmpl({ user: req.user }));\n",[2458],{"type":45,"tag":65,"props":2459,"children":2460},{"__ignoreMap":67},[2461,2539],{"type":45,"tag":1938,"props":2462,"children":2463},{"class":1940,"line":1941},[2464,2468,2472,2476,2480,2484,2488,2492,2497,2501,2505,2510,2514,2518,2522,2527,2531,2535],{"type":45,"tag":1938,"props":2465,"children":2466},{"style":2319},[2467],{"type":50,"value":2322},{"type":45,"tag":1938,"props":2469,"children":2470},{"style":2016},[2471],{"type":50,"value":2327},{"type":45,"tag":1938,"props":2473,"children":2474},{"style":2022},[2475],{"type":50,"value":2332},{"type":45,"tag":1938,"props":2477,"children":2478},{"style":2016},[2479],{"type":50,"value":2337},{"type":45,"tag":1938,"props":2481,"children":2482},{"style":2022},[2483],{"type":50,"value":893},{"type":45,"tag":1938,"props":2485,"children":2486},{"style":2010},[2487],{"type":50,"value":447},{"type":45,"tag":1938,"props":2489,"children":2490},{"style":2016},[2491],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2493,"children":2494},{"style":2010},[2495],{"type":50,"value":2496},"readFileSync",{"type":45,"tag":1938,"props":2498,"children":2499},{"style":2016},[2500],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2502,"children":2503},{"style":2022},[2504],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2506,"children":2507},{"style":2028},[2508],{"type":50,"value":2509},"preview.hbs",{"type":45,"tag":1938,"props":2511,"children":2512},{"style":2022},[2513],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2515,"children":2516},{"style":2022},[2517],{"type":50,"value":2101},{"type":45,"tag":1938,"props":2519,"children":2520},{"style":2022},[2521],{"type":50,"value":2128},{"type":45,"tag":1938,"props":2523,"children":2524},{"style":2028},[2525],{"type":50,"value":2526},"utf8",{"type":45,"tag":1938,"props":2528,"children":2529},{"style":2022},[2530],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2532,"children":2533},{"style":2016},[2534],{"type":50,"value":2442},{"type":45,"tag":1938,"props":2536,"children":2537},{"style":2022},[2538],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2540,"children":2541},{"class":1940,"line":1950},[2542,2546,2550,2554,2558,2562,2566,2570,2574,2578,2582,2586,2590,2594,2598],{"type":45,"tag":1938,"props":2543,"children":2544},{"style":2016},[2545],{"type":50,"value":2380},{"type":45,"tag":1938,"props":2547,"children":2548},{"style":2022},[2549],{"type":50,"value":893},{"type":45,"tag":1938,"props":2551,"children":2552},{"style":2010},[2553],{"type":50,"value":2389},{"type":45,"tag":1938,"props":2555,"children":2556},{"style":2016},[2557],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2559,"children":2560},{"style":2010},[2561],{"type":50,"value":2398},{"type":45,"tag":1938,"props":2563,"children":2564},{"style":2016},[2565],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2567,"children":2568},{"style":2022},[2569],{"type":50,"value":2407},{"type":45,"tag":1938,"props":2571,"children":2572},{"style":2410},[2573],{"type":50,"value":2413},{"type":45,"tag":1938,"props":2575,"children":2576},{"style":2022},[2577],{"type":50,"value":2418},{"type":45,"tag":1938,"props":2579,"children":2580},{"style":2016},[2581],{"type":50,"value":2423},{"type":45,"tag":1938,"props":2583,"children":2584},{"style":2022},[2585],{"type":50,"value":893},{"type":45,"tag":1938,"props":2587,"children":2588},{"style":2016},[2589],{"type":50,"value":2432},{"type":45,"tag":1938,"props":2591,"children":2592},{"style":2022},[2593],{"type":50,"value":2437},{"type":45,"tag":1938,"props":2595,"children":2596},{"style":2016},[2597],{"type":50,"value":2442},{"type":45,"tag":1938,"props":2599,"children":2600},{"style":2022},[2601],{"type":50,"value":2056},{"type":45,"tag":264,"props":2603,"children":2605},{"id":2604},"pattern-eval-function-with-user-data",[2606],{"type":50,"value":2607},"Pattern: eval \u002F Function with user data",{"type":45,"tag":46,"props":2609,"children":2610},{},[2611],{"type":50,"value":2612},"Real: CVE-2025-55182 (Next.js React2Shell), vm2 CVE-2023-29017\u002F32314\u002F37903.",{"type":45,"tag":46,"props":2614,"children":2615},{},[2616],{"type":45,"tag":96,"props":2617,"children":2618},{},[2619],{"type":50,"value":1927},{"type":45,"tag":58,"props":2621,"children":2623},{"className":1930,"code":2622,"language":1932,"meta":67,"style":67},"result = eval(request.args[\"expr\"])\n",[2624],{"type":45,"tag":65,"props":2625,"children":2626},{"__ignoreMap":67},[2627],{"type":45,"tag":1938,"props":2628,"children":2629},{"class":1940,"line":1941},[2630],{"type":45,"tag":1938,"props":2631,"children":2632},{},[2633],{"type":50,"value":2622},{"type":45,"tag":46,"props":2635,"children":2636},{},[2637],{"type":45,"tag":96,"props":2638,"children":2639},{},[2640],{"type":50,"value":1964},{"type":45,"tag":58,"props":2642,"children":2644},{"className":1930,"code":2643,"language":1932,"meta":67,"style":67},"import ast\nresult = ast.literal_eval(request.args[\"expr\"])  # Literals only.\n",[2645],{"type":45,"tag":65,"props":2646,"children":2647},{"__ignoreMap":67},[2648,2656],{"type":45,"tag":1938,"props":2649,"children":2650},{"class":1940,"line":1941},[2651],{"type":45,"tag":1938,"props":2652,"children":2653},{},[2654],{"type":50,"value":2655},"import ast\n",{"type":45,"tag":1938,"props":2657,"children":2658},{"class":1940,"line":1950},[2659],{"type":45,"tag":1938,"props":2660,"children":2661},{},[2662],{"type":50,"value":2663},"result = ast.literal_eval(request.args[\"expr\"])  # Literals only.\n",{"type":45,"tag":46,"props":2665,"children":2666},{},[2667],{"type":45,"tag":96,"props":2668,"children":2669},{},[2670],{"type":50,"value":1995},{"type":45,"tag":58,"props":2672,"children":2674},{"className":1998,"code":2673,"language":2000,"meta":67,"style":67},"const fn = new Function(req.body.code);\nfn();\n\n\u002F\u002F Server Action:\n'use server';\nexport async function run(userCode: string) {\n  return new Function('return ' + userCode)();\n}\n",[2675],{"type":45,"tag":65,"props":2676,"children":2677},{"__ignoreMap":67},[2678,2729,2746,2755,2765,2786,2840,2893],{"type":45,"tag":1938,"props":2679,"children":2680},{"class":1940,"line":1941},[2681,2685,2690,2694,2699,2704,2708,2712,2716,2720,2725],{"type":45,"tag":1938,"props":2682,"children":2683},{"style":2319},[2684],{"type":50,"value":2322},{"type":45,"tag":1938,"props":2686,"children":2687},{"style":2016},[2688],{"type":50,"value":2689}," fn ",{"type":45,"tag":1938,"props":2691,"children":2692},{"style":2022},[2693],{"type":50,"value":2332},{"type":45,"tag":1938,"props":2695,"children":2696},{"style":2022},[2697],{"type":50,"value":2698}," new",{"type":45,"tag":1938,"props":2700,"children":2701},{"style":2010},[2702],{"type":50,"value":2703}," Function",{"type":45,"tag":1938,"props":2705,"children":2706},{"style":2016},[2707],{"type":50,"value":2350},{"type":45,"tag":1938,"props":2709,"children":2710},{"style":2022},[2711],{"type":50,"value":893},{"type":45,"tag":1938,"props":2713,"children":2714},{"style":2016},[2715],{"type":50,"value":2359},{"type":45,"tag":1938,"props":2717,"children":2718},{"style":2022},[2719],{"type":50,"value":893},{"type":45,"tag":1938,"props":2721,"children":2722},{"style":2016},[2723],{"type":50,"value":2724},"code)",{"type":45,"tag":1938,"props":2726,"children":2727},{"style":2022},[2728],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2730,"children":2731},{"class":1940,"line":1950},[2732,2737,2742],{"type":45,"tag":1938,"props":2733,"children":2734},{"style":2010},[2735],{"type":50,"value":2736},"fn",{"type":45,"tag":1938,"props":2738,"children":2739},{"style":2016},[2740],{"type":50,"value":2741},"()",{"type":45,"tag":1938,"props":2743,"children":2744},{"style":2022},[2745],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2747,"children":2748},{"class":1940,"line":31},[2749],{"type":45,"tag":1938,"props":2750,"children":2752},{"emptyLinePlaceholder":2751},true,[2753],{"type":50,"value":2754},"\n",{"type":45,"tag":1938,"props":2756,"children":2758},{"class":1940,"line":2757},4,[2759],{"type":45,"tag":1938,"props":2760,"children":2762},{"style":2761},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2763],{"type":50,"value":2764},"\u002F\u002F Server Action:\n",{"type":45,"tag":1938,"props":2766,"children":2768},{"class":1940,"line":2767},5,[2769,2773,2778,2782],{"type":45,"tag":1938,"props":2770,"children":2771},{"style":2022},[2772],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2774,"children":2775},{"style":2028},[2776],{"type":50,"value":2777},"use server",{"type":45,"tag":1938,"props":2779,"children":2780},{"style":2022},[2781],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2783,"children":2784},{"style":2022},[2785],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2787,"children":2789},{"class":1940,"line":2788},6,[2790,2796,2801,2806,2811,2815,2821,2825,2831,2835],{"type":45,"tag":1938,"props":2791,"children":2793},{"style":2792},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2794],{"type":50,"value":2795},"export",{"type":45,"tag":1938,"props":2797,"children":2798},{"style":2319},[2799],{"type":50,"value":2800}," async",{"type":45,"tag":1938,"props":2802,"children":2803},{"style":2319},[2804],{"type":50,"value":2805}," function",{"type":45,"tag":1938,"props":2807,"children":2808},{"style":2010},[2809],{"type":50,"value":2810}," run",{"type":45,"tag":1938,"props":2812,"children":2813},{"style":2022},[2814],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2816,"children":2818},{"style":2817},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[2819],{"type":50,"value":2820},"userCode",{"type":45,"tag":1938,"props":2822,"children":2823},{"style":2022},[2824],{"type":50,"value":2418},{"type":45,"tag":1938,"props":2826,"children":2828},{"style":2827},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2829],{"type":50,"value":2830}," string",{"type":45,"tag":1938,"props":2832,"children":2833},{"style":2022},[2834],{"type":50,"value":2051},{"type":45,"tag":1938,"props":2836,"children":2837},{"style":2022},[2838],{"type":50,"value":2839}," {\n",{"type":45,"tag":1938,"props":2841,"children":2843},{"class":1940,"line":2842},7,[2844,2849,2853,2857,2861,2865,2870,2874,2879,2884,2889],{"type":45,"tag":1938,"props":2845,"children":2846},{"style":2792},[2847],{"type":50,"value":2848},"  return",{"type":45,"tag":1938,"props":2850,"children":2851},{"style":2022},[2852],{"type":50,"value":2698},{"type":45,"tag":1938,"props":2854,"children":2855},{"style":2010},[2856],{"type":50,"value":2703},{"type":45,"tag":1938,"props":2858,"children":2859},{"style":2410},[2860],{"type":50,"value":2019},{"type":45,"tag":1938,"props":2862,"children":2863},{"style":2022},[2864],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2866,"children":2867},{"style":2028},[2868],{"type":50,"value":2869},"return ",{"type":45,"tag":1938,"props":2871,"children":2872},{"style":2022},[2873],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2875,"children":2876},{"style":2022},[2877],{"type":50,"value":2878}," +",{"type":45,"tag":1938,"props":2880,"children":2881},{"style":2016},[2882],{"type":50,"value":2883}," userCode",{"type":45,"tag":1938,"props":2885,"children":2886},{"style":2410},[2887],{"type":50,"value":2888},")()",{"type":45,"tag":1938,"props":2890,"children":2891},{"style":2022},[2892],{"type":50,"value":2056},{"type":45,"tag":1938,"props":2894,"children":2896},{"class":1940,"line":2895},8,[2897],{"type":45,"tag":1938,"props":2898,"children":2899},{"style":2022},[2900],{"type":50,"value":2901},"}\n",{"type":45,"tag":46,"props":2903,"children":2904},{},[2905],{"type":45,"tag":96,"props":2906,"children":2907},{},[2908],{"type":50,"value":2064},{"type":45,"tag":58,"props":2910,"children":2912},{"className":1998,"code":2911,"language":2000,"meta":67,"style":67},"\u002F\u002F Parse with a dedicated expression parser + allowlist of operations.\nconst result = safeEvaluator.evaluate(userExpr, { allow: ['+', '-', '*', '\u002F'] });\n",[2913],{"type":45,"tag":65,"props":2914,"children":2915},{"__ignoreMap":67},[2916,2924],{"type":45,"tag":1938,"props":2917,"children":2918},{"class":1940,"line":1941},[2919],{"type":45,"tag":1938,"props":2920,"children":2921},{"style":2761},[2922],{"type":50,"value":2923},"\u002F\u002F Parse with a dedicated expression parser + allowlist of operations.\n",{"type":45,"tag":1938,"props":2925,"children":2926},{"class":1940,"line":1950},[2927,2931,2936,2940,2945,2949,2954,2959,2963,2968,2973,2977,2981,2985,2990,2994,2998,3002,3007,3011,3015,3019,3024,3028,3032,3036,3040,3044,3049,3053,3057],{"type":45,"tag":1938,"props":2928,"children":2929},{"style":2319},[2930],{"type":50,"value":2322},{"type":45,"tag":1938,"props":2932,"children":2933},{"style":2016},[2934],{"type":50,"value":2935}," result ",{"type":45,"tag":1938,"props":2937,"children":2938},{"style":2022},[2939],{"type":50,"value":2332},{"type":45,"tag":1938,"props":2941,"children":2942},{"style":2016},[2943],{"type":50,"value":2944}," safeEvaluator",{"type":45,"tag":1938,"props":2946,"children":2947},{"style":2022},[2948],{"type":50,"value":893},{"type":45,"tag":1938,"props":2950,"children":2951},{"style":2010},[2952],{"type":50,"value":2953},"evaluate",{"type":45,"tag":1938,"props":2955,"children":2956},{"style":2016},[2957],{"type":50,"value":2958},"(userExpr",{"type":45,"tag":1938,"props":2960,"children":2961},{"style":2022},[2962],{"type":50,"value":2101},{"type":45,"tag":1938,"props":2964,"children":2965},{"style":2022},[2966],{"type":50,"value":2967}," {",{"type":45,"tag":1938,"props":2969,"children":2970},{"style":2410},[2971],{"type":50,"value":2972}," allow",{"type":45,"tag":1938,"props":2974,"children":2975},{"style":2022},[2976],{"type":50,"value":2418},{"type":45,"tag":1938,"props":2978,"children":2979},{"style":2016},[2980],{"type":50,"value":2106},{"type":45,"tag":1938,"props":2982,"children":2983},{"style":2022},[2984],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2986,"children":2987},{"style":2028},[2988],{"type":50,"value":2989},"+",{"type":45,"tag":1938,"props":2991,"children":2992},{"style":2022},[2993],{"type":50,"value":2087},{"type":45,"tag":1938,"props":2995,"children":2996},{"style":2022},[2997],{"type":50,"value":2101},{"type":45,"tag":1938,"props":2999,"children":3000},{"style":2022},[3001],{"type":50,"value":2128},{"type":45,"tag":1938,"props":3003,"children":3004},{"style":2028},[3005],{"type":50,"value":3006},"-",{"type":45,"tag":1938,"props":3008,"children":3009},{"style":2022},[3010],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3012,"children":3013},{"style":2022},[3014],{"type":50,"value":2101},{"type":45,"tag":1938,"props":3016,"children":3017},{"style":2022},[3018],{"type":50,"value":2128},{"type":45,"tag":1938,"props":3020,"children":3021},{"style":2028},[3022],{"type":50,"value":3023},"*",{"type":45,"tag":1938,"props":3025,"children":3026},{"style":2022},[3027],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3029,"children":3030},{"style":2022},[3031],{"type":50,"value":2101},{"type":45,"tag":1938,"props":3033,"children":3034},{"style":2022},[3035],{"type":50,"value":2128},{"type":45,"tag":1938,"props":3037,"children":3038},{"style":2028},[3039],{"type":50,"value":702},{"type":45,"tag":1938,"props":3041,"children":3042},{"style":2022},[3043],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3045,"children":3046},{"style":2016},[3047],{"type":50,"value":3048},"] ",{"type":45,"tag":1938,"props":3050,"children":3051},{"style":2022},[3052],{"type":50,"value":2437},{"type":45,"tag":1938,"props":3054,"children":3055},{"style":2016},[3056],{"type":50,"value":2051},{"type":45,"tag":1938,"props":3058,"children":3059},{"style":2022},[3060],{"type":50,"value":2056},{"type":45,"tag":264,"props":3062,"children":3064},{"id":3063},"pattern-pickle-on-untrusted-input",[3065],{"type":50,"value":3066},"Pattern: Pickle on untrusted input",{"type":45,"tag":46,"props":3068,"children":3069},{},[3070],{"type":45,"tag":96,"props":3071,"children":3072},{},[3073],{"type":50,"value":1927},{"type":45,"tag":58,"props":3075,"children":3077},{"className":1930,"code":3076,"language":1932,"meta":67,"style":67},"@app.post(\"\u002Fupload\")\ndef upload():\n    return pickle.loads(request.data)\n",[3078],{"type":45,"tag":65,"props":3079,"children":3080},{"__ignoreMap":67},[3081,3089,3097],{"type":45,"tag":1938,"props":3082,"children":3083},{"class":1940,"line":1941},[3084],{"type":45,"tag":1938,"props":3085,"children":3086},{},[3087],{"type":50,"value":3088},"@app.post(\"\u002Fupload\")\n",{"type":45,"tag":1938,"props":3090,"children":3091},{"class":1940,"line":1950},[3092],{"type":45,"tag":1938,"props":3093,"children":3094},{},[3095],{"type":50,"value":3096},"def upload():\n",{"type":45,"tag":1938,"props":3098,"children":3099},{"class":1940,"line":31},[3100],{"type":45,"tag":1938,"props":3101,"children":3102},{},[3103],{"type":50,"value":3104},"    return pickle.loads(request.data)\n",{"type":45,"tag":46,"props":3106,"children":3107},{},[3108],{"type":45,"tag":96,"props":3109,"children":3110},{},[3111],{"type":50,"value":1964},{"type":45,"tag":58,"props":3113,"children":3115},{"className":1930,"code":3114,"language":1932,"meta":67,"style":67},"@app.post(\"\u002Fupload\")\ndef upload():\n    return json.loads(request.data)                 # JSON does not execute.\n",[3116],{"type":45,"tag":65,"props":3117,"children":3118},{"__ignoreMap":67},[3119,3126,3133],{"type":45,"tag":1938,"props":3120,"children":3121},{"class":1940,"line":1941},[3122],{"type":45,"tag":1938,"props":3123,"children":3124},{},[3125],{"type":50,"value":3088},{"type":45,"tag":1938,"props":3127,"children":3128},{"class":1940,"line":1950},[3129],{"type":45,"tag":1938,"props":3130,"children":3131},{},[3132],{"type":50,"value":3096},{"type":45,"tag":1938,"props":3134,"children":3135},{"class":1940,"line":31},[3136],{"type":45,"tag":1938,"props":3137,"children":3138},{},[3139],{"type":50,"value":3140},"    return json.loads(request.data)                 # JSON does not execute.\n",{"type":45,"tag":46,"props":3142,"children":3143},{},[3144],{"type":50,"value":3145},"For ML model uploads: verify the source, enforce a file-format validator (no pickle), or use a restricted loader that rejects unknown opcodes.",{"type":45,"tag":264,"props":3147,"children":3149},{"id":3148},"pattern-prototype-pollution-template-rce",[3150],{"type":50,"value":3151},"Pattern: Prototype pollution → template RCE",{"type":45,"tag":46,"props":3153,"children":3154},{},[3155],{"type":50,"value":3156},"Real: CVE-2019-19919 (Handlebars).",{"type":45,"tag":46,"props":3158,"children":3159},{},[3160],{"type":45,"tag":96,"props":3161,"children":3162},{},[3163],{"type":50,"value":1995},{"type":45,"tag":58,"props":3165,"children":3167},{"className":1998,"code":3166,"language":2000,"meta":67,"style":67},"\u002F\u002F User supplies: {\"__proto__\": {\"helperMissing\": \"function(){return process.mainModule.require('child_process').execSync('id');}\"}}\nconst merged = _.merge({}, defaults, req.body);\nconst tmpl = Handlebars.compile('{{ nonexistent }}');\ntmpl({});   \u002F\u002F Reaches the polluted helperMissing; RCE at compile.\n",[3168],{"type":45,"tag":65,"props":3169,"children":3170},{"__ignoreMap":67},[3171,3179,3244,3296],{"type":45,"tag":1938,"props":3172,"children":3173},{"class":1940,"line":1941},[3174],{"type":45,"tag":1938,"props":3175,"children":3176},{"style":2761},[3177],{"type":50,"value":3178},"\u002F\u002F User supplies: {\"__proto__\": {\"helperMissing\": \"function(){return process.mainModule.require('child_process').execSync('id');}\"}}\n",{"type":45,"tag":1938,"props":3180,"children":3181},{"class":1940,"line":1950},[3182,3186,3191,3195,3200,3204,3209,3213,3218,3223,3227,3231,3235,3240],{"type":45,"tag":1938,"props":3183,"children":3184},{"style":2319},[3185],{"type":50,"value":2322},{"type":45,"tag":1938,"props":3187,"children":3188},{"style":2016},[3189],{"type":50,"value":3190}," merged ",{"type":45,"tag":1938,"props":3192,"children":3193},{"style":2022},[3194],{"type":50,"value":2332},{"type":45,"tag":1938,"props":3196,"children":3197},{"style":2016},[3198],{"type":50,"value":3199}," _",{"type":45,"tag":1938,"props":3201,"children":3202},{"style":2022},[3203],{"type":50,"value":893},{"type":45,"tag":1938,"props":3205,"children":3206},{"style":2010},[3207],{"type":50,"value":3208},"merge",{"type":45,"tag":1938,"props":3210,"children":3211},{"style":2016},[3212],{"type":50,"value":2019},{"type":45,"tag":1938,"props":3214,"children":3215},{"style":2022},[3216],{"type":50,"value":3217},"{},",{"type":45,"tag":1938,"props":3219,"children":3220},{"style":2016},[3221],{"type":50,"value":3222}," defaults",{"type":45,"tag":1938,"props":3224,"children":3225},{"style":2022},[3226],{"type":50,"value":2101},{"type":45,"tag":1938,"props":3228,"children":3229},{"style":2016},[3230],{"type":50,"value":2423},{"type":45,"tag":1938,"props":3232,"children":3233},{"style":2022},[3234],{"type":50,"value":893},{"type":45,"tag":1938,"props":3236,"children":3237},{"style":2016},[3238],{"type":50,"value":3239},"body)",{"type":45,"tag":1938,"props":3241,"children":3242},{"style":2022},[3243],{"type":50,"value":2056},{"type":45,"tag":1938,"props":3245,"children":3246},{"class":1940,"line":31},[3247,3251,3255,3259,3263,3267,3271,3275,3279,3284,3288,3292],{"type":45,"tag":1938,"props":3248,"children":3249},{"style":2319},[3250],{"type":50,"value":2322},{"type":45,"tag":1938,"props":3252,"children":3253},{"style":2016},[3254],{"type":50,"value":2327},{"type":45,"tag":1938,"props":3256,"children":3257},{"style":2022},[3258],{"type":50,"value":2332},{"type":45,"tag":1938,"props":3260,"children":3261},{"style":2016},[3262],{"type":50,"value":2337},{"type":45,"tag":1938,"props":3264,"children":3265},{"style":2022},[3266],{"type":50,"value":893},{"type":45,"tag":1938,"props":3268,"children":3269},{"style":2010},[3270],{"type":50,"value":447},{"type":45,"tag":1938,"props":3272,"children":3273},{"style":2016},[3274],{"type":50,"value":2019},{"type":45,"tag":1938,"props":3276,"children":3277},{"style":2022},[3278],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3280,"children":3281},{"style":2028},[3282],{"type":50,"value":3283},"{{ nonexistent }}",{"type":45,"tag":1938,"props":3285,"children":3286},{"style":2022},[3287],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3289,"children":3290},{"style":2016},[3291],{"type":50,"value":2051},{"type":45,"tag":1938,"props":3293,"children":3294},{"style":2022},[3295],{"type":50,"value":2056},{"type":45,"tag":1938,"props":3297,"children":3298},{"class":1940,"line":2757},[3299,3303,3307,3312,3316,3321],{"type":45,"tag":1938,"props":3300,"children":3301},{"style":2010},[3302],{"type":50,"value":2398},{"type":45,"tag":1938,"props":3304,"children":3305},{"style":2016},[3306],{"type":50,"value":2019},{"type":45,"tag":1938,"props":3308,"children":3309},{"style":2022},[3310],{"type":50,"value":3311},"{}",{"type":45,"tag":1938,"props":3313,"children":3314},{"style":2016},[3315],{"type":50,"value":2051},{"type":45,"tag":1938,"props":3317,"children":3318},{"style":2022},[3319],{"type":50,"value":3320},";",{"type":45,"tag":1938,"props":3322,"children":3323},{"style":2761},[3324],{"type":50,"value":3325},"   \u002F\u002F Reaches the polluted helperMissing; RCE at compile.\n",{"type":45,"tag":46,"props":3327,"children":3328},{},[3329],{"type":45,"tag":96,"props":3330,"children":3331},{},[3332],{"type":50,"value":2064},{"type":45,"tag":58,"props":3334,"children":3336},{"className":1998,"code":3335,"language":2000,"meta":67,"style":67},"\u002F\u002F Validate shape before merge\nimport { z } from 'zod';\nconst Config = z.object({ theme: z.enum(['light', 'dark']).optional() });\nconst validated = Config.parse(req.body);\nconst merged = { ...defaults, ...validated };\n",[3337],{"type":45,"tag":65,"props":3338,"children":3339},{"__ignoreMap":67},[3340,3348,3392,3517,3563],{"type":45,"tag":1938,"props":3341,"children":3342},{"class":1940,"line":1941},[3343],{"type":45,"tag":1938,"props":3344,"children":3345},{"style":2761},[3346],{"type":50,"value":3347},"\u002F\u002F Validate shape before merge\n",{"type":45,"tag":1938,"props":3349,"children":3350},{"class":1940,"line":1950},[3351,3356,3360,3365,3370,3375,3379,3384,3388],{"type":45,"tag":1938,"props":3352,"children":3353},{"style":2792},[3354],{"type":50,"value":3355},"import",{"type":45,"tag":1938,"props":3357,"children":3358},{"style":2022},[3359],{"type":50,"value":2967},{"type":45,"tag":1938,"props":3361,"children":3362},{"style":2016},[3363],{"type":50,"value":3364}," z",{"type":45,"tag":1938,"props":3366,"children":3367},{"style":2022},[3368],{"type":50,"value":3369}," }",{"type":45,"tag":1938,"props":3371,"children":3372},{"style":2792},[3373],{"type":50,"value":3374}," from",{"type":45,"tag":1938,"props":3376,"children":3377},{"style":2022},[3378],{"type":50,"value":2128},{"type":45,"tag":1938,"props":3380,"children":3381},{"style":2028},[3382],{"type":50,"value":3383},"zod",{"type":45,"tag":1938,"props":3385,"children":3386},{"style":2022},[3387],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3389,"children":3390},{"style":2022},[3391],{"type":50,"value":2056},{"type":45,"tag":1938,"props":3393,"children":3394},{"class":1940,"line":31},[3395,3399,3404,3408,3412,3416,3421,3425,3429,3434,3438,3442,3446,3451,3456,3460,3465,3469,3473,3477,3482,3486,3491,3495,3500,3505,3509,3513],{"type":45,"tag":1938,"props":3396,"children":3397},{"style":2319},[3398],{"type":50,"value":2322},{"type":45,"tag":1938,"props":3400,"children":3401},{"style":2016},[3402],{"type":50,"value":3403}," Config ",{"type":45,"tag":1938,"props":3405,"children":3406},{"style":2022},[3407],{"type":50,"value":2332},{"type":45,"tag":1938,"props":3409,"children":3410},{"style":2016},[3411],{"type":50,"value":3364},{"type":45,"tag":1938,"props":3413,"children":3414},{"style":2022},[3415],{"type":50,"value":893},{"type":45,"tag":1938,"props":3417,"children":3418},{"style":2010},[3419],{"type":50,"value":3420},"object",{"type":45,"tag":1938,"props":3422,"children":3423},{"style":2016},[3424],{"type":50,"value":2019},{"type":45,"tag":1938,"props":3426,"children":3427},{"style":2022},[3428],{"type":50,"value":2407},{"type":45,"tag":1938,"props":3430,"children":3431},{"style":2410},[3432],{"type":50,"value":3433}," theme",{"type":45,"tag":1938,"props":3435,"children":3436},{"style":2022},[3437],{"type":50,"value":2418},{"type":45,"tag":1938,"props":3439,"children":3440},{"style":2016},[3441],{"type":50,"value":3364},{"type":45,"tag":1938,"props":3443,"children":3444},{"style":2022},[3445],{"type":50,"value":893},{"type":45,"tag":1938,"props":3447,"children":3448},{"style":2010},[3449],{"type":50,"value":3450},"enum",{"type":45,"tag":1938,"props":3452,"children":3453},{"style":2016},[3454],{"type":50,"value":3455},"([",{"type":45,"tag":1938,"props":3457,"children":3458},{"style":2022},[3459],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3461,"children":3462},{"style":2028},[3463],{"type":50,"value":3464},"light",{"type":45,"tag":1938,"props":3466,"children":3467},{"style":2022},[3468],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3470,"children":3471},{"style":2022},[3472],{"type":50,"value":2101},{"type":45,"tag":1938,"props":3474,"children":3475},{"style":2022},[3476],{"type":50,"value":2128},{"type":45,"tag":1938,"props":3478,"children":3479},{"style":2028},[3480],{"type":50,"value":3481},"dark",{"type":45,"tag":1938,"props":3483,"children":3484},{"style":2022},[3485],{"type":50,"value":2087},{"type":45,"tag":1938,"props":3487,"children":3488},{"style":2016},[3489],{"type":50,"value":3490},"])",{"type":45,"tag":1938,"props":3492,"children":3493},{"style":2022},[3494],{"type":50,"value":893},{"type":45,"tag":1938,"props":3496,"children":3497},{"style":2010},[3498],{"type":50,"value":3499},"optional",{"type":45,"tag":1938,"props":3501,"children":3502},{"style":2016},[3503],{"type":50,"value":3504},"() ",{"type":45,"tag":1938,"props":3506,"children":3507},{"style":2022},[3508],{"type":50,"value":2437},{"type":45,"tag":1938,"props":3510,"children":3511},{"style":2016},[3512],{"type":50,"value":2051},{"type":45,"tag":1938,"props":3514,"children":3515},{"style":2022},[3516],{"type":50,"value":2056},{"type":45,"tag":1938,"props":3518,"children":3519},{"class":1940,"line":2757},[3520,3524,3529,3533,3538,3542,3547,3551,3555,3559],{"type":45,"tag":1938,"props":3521,"children":3522},{"style":2319},[3523],{"type":50,"value":2322},{"type":45,"tag":1938,"props":3525,"children":3526},{"style":2016},[3527],{"type":50,"value":3528}," validated ",{"type":45,"tag":1938,"props":3530,"children":3531},{"style":2022},[3532],{"type":50,"value":2332},{"type":45,"tag":1938,"props":3534,"children":3535},{"style":2016},[3536],{"type":50,"value":3537}," Config",{"type":45,"tag":1938,"props":3539,"children":3540},{"style":2022},[3541],{"type":50,"value":893},{"type":45,"tag":1938,"props":3543,"children":3544},{"style":2010},[3545],{"type":50,"value":3546},"parse",{"type":45,"tag":1938,"props":3548,"children":3549},{"style":2016},[3550],{"type":50,"value":2350},{"type":45,"tag":1938,"props":3552,"children":3553},{"style":2022},[3554],{"type":50,"value":893},{"type":45,"tag":1938,"props":3556,"children":3557},{"style":2016},[3558],{"type":50,"value":3239},{"type":45,"tag":1938,"props":3560,"children":3561},{"style":2022},[3562],{"type":50,"value":2056},{"type":45,"tag":1938,"props":3564,"children":3565},{"class":1940,"line":2767},[3566,3570,3574,3578,3582,3587,3592,3596,3600,3605],{"type":45,"tag":1938,"props":3567,"children":3568},{"style":2319},[3569],{"type":50,"value":2322},{"type":45,"tag":1938,"props":3571,"children":3572},{"style":2016},[3573],{"type":50,"value":3190},{"type":45,"tag":1938,"props":3575,"children":3576},{"style":2022},[3577],{"type":50,"value":2332},{"type":45,"tag":1938,"props":3579,"children":3580},{"style":2022},[3581],{"type":50,"value":2967},{"type":45,"tag":1938,"props":3583,"children":3584},{"style":2022},[3585],{"type":50,"value":3586}," ...",{"type":45,"tag":1938,"props":3588,"children":3589},{"style":2016},[3590],{"type":50,"value":3591},"defaults",{"type":45,"tag":1938,"props":3593,"children":3594},{"style":2022},[3595],{"type":50,"value":2101},{"type":45,"tag":1938,"props":3597,"children":3598},{"style":2022},[3599],{"type":50,"value":3586},{"type":45,"tag":1938,"props":3601,"children":3602},{"style":2016},[3603],{"type":50,"value":3604},"validated ",{"type":45,"tag":1938,"props":3606,"children":3607},{"style":2022},[3608],{"type":50,"value":3609},"};\n",{"type":45,"tag":46,"props":3611,"children":3612},{},[3613],{"type":50,"value":3614},"Plus: upgrade Handlebars to 4.3.0+. Plus: upgrade lodash to 4.17.21+ (but don't rely on library fixes alone).",{"type":45,"tag":76,"props":3616,"children":3618},{"id":3617},"investigation-playbook",[3619],{"type":50,"value":3620},"Investigation Playbook",{"type":45,"tag":1673,"props":3622,"children":3623},{},[3624,3634,3644,3679,3689],{"type":45,"tag":92,"props":3625,"children":3626},{},[3627,3632],{"type":45,"tag":96,"props":3628,"children":3629},{},[3630],{"type":50,"value":3631},"Classify the sink.",{"type":50,"value":3633}," Load the matching reference.",{"type":45,"tag":92,"props":3635,"children":3636},{},[3637,3642],{"type":45,"tag":96,"props":3638,"children":3639},{},[3640],{"type":50,"value":3641},"Trace the source.",{"type":50,"value":3643}," Does the value at the sink come from external input?",{"type":45,"tag":92,"props":3645,"children":3646},{},[3647,3651,3652,3657,3658,3664,3665,3670,3671,3677],{"type":45,"tag":96,"props":3648,"children":3649},{},[3650],{"type":50,"value":177},{"type":50,"value":179},{"type":45,"tag":65,"props":3653,"children":3655},{"className":3654},[],[3656],{"type":50,"value":185},{"type":50,"value":313},{"type":45,"tag":65,"props":3659,"children":3661},{"className":3660},[],[3662],{"type":50,"value":3663},"jsonwebtoken",{"type":50,"value":313},{"type":45,"tag":65,"props":3666,"children":3668},{"className":3667},[],[3669],{"type":50,"value":209},{"type":50,"value":313},{"type":45,"tag":65,"props":3672,"children":3674},{"className":3673},[],[3675],{"type":50,"value":3676},"lodash",{"type":50,"value":3678}," versions change the analysis.",{"type":45,"tag":92,"props":3680,"children":3681},{},[3682,3687],{"type":45,"tag":96,"props":3683,"children":3684},{},[3685],{"type":50,"value":3686},"Check for a validator.",{"type":50,"value":3688}," Pydantic, Zod, class-validator, schema validators can narrow the argument to a safe type.",{"type":45,"tag":92,"props":3690,"children":3691},{},[3692,3697,3698,3703,3705,3710],{"type":45,"tag":96,"props":3693,"children":3694},{},[3695],{"type":50,"value":3696},"Check siblings and history.",{"type":50,"value":179},{"type":45,"tag":65,"props":3699,"children":3701},{"className":3700},[],[3702],{"type":50,"value":234},{"type":50,"value":3704}," for every call site. ",{"type":45,"tag":65,"props":3706,"children":3708},{"className":3707},[],[3709],{"type":50,"value":226},{"type":50,"value":3711}," for recent validation removals.",{"type":45,"tag":46,"props":3713,"children":3714},{},[3715],{"type":50,"value":3716},"If the thread cannot be resolved, drop the finding or report with lower confidence.",{"type":45,"tag":76,"props":3718,"children":3720},{"id":3719},"output",[3721],{"type":50,"value":3722},"Output",{"type":45,"tag":46,"props":3724,"children":3725},{},[3726],{"type":50,"value":3727},"For each finding:",{"type":45,"tag":88,"props":3729,"children":3730},{},[3731,3741,3750,3760,3770,3780,3790,3800,3810],{"type":45,"tag":92,"props":3732,"children":3733},{},[3734,3739],{"type":45,"tag":96,"props":3735,"children":3736},{},[3737],{"type":50,"value":3738},"File and line",{"type":50,"value":3740}," of the unsafe code.",{"type":45,"tag":92,"props":3742,"children":3743},{},[3744,3748],{"type":45,"tag":96,"props":3745,"children":3746},{},[3747],{"type":50,"value":657},{"type":50,"value":3749}," from the table above.",{"type":45,"tag":92,"props":3751,"children":3752},{},[3753,3758],{"type":45,"tag":96,"props":3754,"children":3755},{},[3756],{"type":50,"value":3757},"Sink class",{"type":50,"value":3759}," (command injection, deserialization, SSTI, eval, prototype pollution).",{"type":45,"tag":92,"props":3761,"children":3762},{},[3763,3768],{"type":45,"tag":96,"props":3764,"children":3765},{},[3766],{"type":50,"value":3767},"What is wrong",{"type":50,"value":3769},", in one sentence.",{"type":45,"tag":92,"props":3771,"children":3772},{},[3773,3778],{"type":45,"tag":96,"props":3774,"children":3775},{},[3776],{"type":50,"value":3777},"Source",{"type":50,"value":3779},": where the attacker-controlled value originates.",{"type":45,"tag":92,"props":3781,"children":3782},{},[3783,3788],{"type":45,"tag":96,"props":3784,"children":3785},{},[3786],{"type":50,"value":3787},"Sink",{"type":50,"value":3789},": which API or operation produces code execution.",{"type":45,"tag":92,"props":3791,"children":3792},{},[3793,3798],{"type":45,"tag":96,"props":3794,"children":3795},{},[3796],{"type":50,"value":3797},"Trace",{"type":50,"value":3799},": the specific path from source to sink.",{"type":45,"tag":92,"props":3801,"children":3802},{},[3803,3808],{"type":45,"tag":96,"props":3804,"children":3805},{},[3806],{"type":50,"value":3807},"Impact",{"type":50,"value":3809},": what the attacker can execute (as whom, via what payload).",{"type":45,"tag":92,"props":3811,"children":3812},{},[3813,3818],{"type":45,"tag":96,"props":3814,"children":3815},{},[3816],{"type":50,"value":3817},"Fix",{"type":50,"value":3819},": the concrete change. Name the safe API, the required validator, the missing parameter.",{"type":45,"tag":46,"props":3821,"children":3822},{},[3823,3825,3830],{"type":50,"value":3824},"Group findings by severity. Lead with ",{"type":45,"tag":65,"props":3826,"children":3828},{"className":3827},[],[3829],{"type":50,"value":690},{"type":50,"value":893},{"type":45,"tag":3832,"props":3833,"children":3834},"style",{},[3835],{"type":50,"value":3836},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3838,"total":2842},[3839,3854,3870,3878,3889,3900,3916],{"slug":3840,"name":3840,"fn":3841,"description":3842,"org":3843,"tags":3844,"stars":27,"repoUrl":28,"updatedAt":3853},"vercel-deepsec","scan web applications for security vulnerabilities","Detects broad web application security vulnerabilities using the Vercel DeepSec benchmark prompt. Use when benchmarking security review coverage or running an open-ended appsec scan for auth bypass, missing auth, XSS, RCE, SQL injection, SSRF, path traversal, secrets, weak crypto, unsafe redirects, webhook verification, Next.js Server Actions, Lua\u002FOpenResty, Go, cache poisoning, or header trust bugs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3845,3848,3849,3850],{"name":3846,"slug":3847,"type":16},"Audit","audit",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":3851,"slug":3852,"type":16},"Vercel","vercel","2026-05-05T05:29:23.090902",{"slug":3855,"name":3855,"fn":3856,"description":3857,"org":3858,"tags":3859,"stars":27,"repoUrl":28,"updatedAt":3869},"wrdn-authz","detect authorization and IDOR flaws","Detects authorization flaws: IDOR, missing ownership or tenant scoping, role checks that fail open, privilege escalation, unauthenticated admin actions, mass assignment, and token\u002Fsession claims trusted for permission decisions. Use when asked to review route handlers, middleware, decorators, resolvers, RBAC\u002FACL logic, serializers, ORM queries, token-derived scopes, or admin surfaces.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3860,3863,3866,3867,3868],{"name":3861,"slug":3862,"type":16},"Access Control","access-control",{"name":3864,"slug":3865,"type":16},"Auth","auth",{"name":22,"slug":23,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-04-29T05:41:41.218677",{"slug":4,"name":4,"fn":5,"description":6,"org":3871,"tags":3872,"stars":27,"repoUrl":28,"updatedAt":29},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3873,3874,3875,3876,3877],{"name":18,"slug":19,"type":16},{"name":22,"slug":23,"type":16},{"name":25,"slug":26,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"slug":3879,"name":3879,"fn":3880,"description":3881,"org":3882,"tags":3883,"stars":27,"repoUrl":28,"updatedAt":3888},"wrdn-data-exfil","detect data exfiltration and SSRF bugs","Detects bugs where untrusted input reaches a sink that leaks data beyond its intended scope. Covers SSRF (including cloud metadata, internal services, image proxies), path traversal and archive zip-slip, SQL\u002FNoSQL injection enabling bulk reads, XXE file read, response serializers over-exposing internal fields, verbose error pages, logs capturing secrets, and CSV\u002Fformula injection in exports. Run on any diff touching HTTP clients with user URLs, file I\u002FO with user paths, raw queries, XML parsing, response serializers, error handlers, or export pipelines.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3884,3885,3886,3887],{"name":18,"slug":19,"type":16},{"name":22,"slug":23,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-04-29T05:41:42.567486",{"slug":3890,"name":3890,"fn":3891,"description":3892,"org":3893,"tags":3894,"stars":27,"repoUrl":28,"updatedAt":3899},"wrdn-dos-review","identify denial-of-service vulnerabilities in code","Finds availability \u002F denial-of-service bugs reachable from untrusted input — unbounded allocation, uncontrolled recursion, non-terminating loops, decompression bombs, panic\u002Fresource-leak, super-linear output amplification, algorithmic-complexity \u002F ReDoS catastrophic regex backtracking, and bounds that are present but ineffective (wrong dimension, applied too late, under-counting cost, or defaulted off). Use for DoS and resource-exhaustion audits, CPU-complexity and cost-limit \u002F quota-accuracy review, parser\u002Fdecoder\u002Fdeserialization hardening, and crash-safety review of code that processes attacker-controlled bytes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3895,3896,3897,3898],{"name":22,"slug":23,"type":16},{"name":25,"slug":26,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-18T05:47:48.104703",{"slug":3901,"name":3901,"fn":3902,"description":3903,"org":3904,"tags":3905,"stars":27,"repoUrl":28,"updatedAt":3915},"wrdn-gha-workflows","detect GitHub Actions workflow vulnerabilities","Detects exploitable GitHub Actions workflow vulnerabilities, including pull_request_target pwn requests, unsafe PR checkout, expression injection in run steps and actions\u002Fgithub-script blocks, workflow_dispatch and workflow_call input command injection, comment- and discussion-triggered commands, TOCTOU between approval and checkout, secret exposure, broad permissions, reusable workflows that consume undeclared secrets, ArtiPACKED-style token leaks through uploaded artifacts, cache poisoning and eviction-stuffing, supply-chain risk from unpinned third-party actions (tj-actions\u002Fchanged-files class), and self-hosted runner abuse. Run on diffs touching .github\u002Fworkflows, action.yml, action.yaml, repo-local actions, or CI-loaded scripts and config.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3906,3909,3910,3913,3914],{"name":3907,"slug":3908,"type":16},"CI\u002FCD","ci-cd",{"name":22,"slug":23,"type":16},{"name":3911,"slug":3912,"type":16},"GitHub Actions","github-actions",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-04-29T05:41:43.93205",{"slug":3917,"name":3917,"fn":3918,"description":3919,"org":3920,"tags":3921,"stars":27,"repoUrl":28,"updatedAt":3931},"wrdn-pii","detect PII and confidential data in code","Detects real personally identifiable information, customer identifiers, and customer-confidential business data in code changes. Use when asked to find PII, customer IPs, real email addresses, revenue data, billing data, personal data, privacy leaks, customer info in logs, PII in URLs, or accidental production data in tests, fixtures, comments, docs, config, telemetry, or API responses.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3922,3923,3926,3929,3930],{"name":22,"slug":23,"type":16},{"name":3924,"slug":3925,"type":16},"Compliance","compliance",{"name":3927,"slug":3928,"type":16},"Privacy","privacy",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-04-29T05:41:38.512082",{"items":3933,"total":4101},[3934,3957,3971,3986,4000,4017,4031,4045,4053,4063,4073,4088],{"slug":3935,"name":3935,"fn":3936,"description":3937,"org":3938,"tags":3939,"stars":3954,"repoUrl":3955,"updatedAt":3956},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3940,3941,3944,3947,3948,3951],{"name":25,"slug":26,"type":16},{"name":3942,"slug":3943,"type":16},"iOS","ios",{"name":3945,"slug":3946,"type":16},"macOS","macos",{"name":9,"slug":8,"type":16},{"name":3949,"slug":3950,"type":16},"Testing","testing",{"name":3952,"slug":3953,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":3958,"name":3958,"fn":3959,"description":3960,"org":3961,"tags":3962,"stars":3954,"repoUrl":3955,"updatedAt":3970},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3963,3966,3967,3968,3969],{"name":3964,"slug":3965,"type":16},"CLI","cli",{"name":3942,"slug":3943,"type":16},{"name":3945,"slug":3946,"type":16},{"name":3949,"slug":3950,"type":16},{"name":3952,"slug":3953,"type":16},"2026-04-06T18:13:36.13414",{"slug":3972,"name":3972,"fn":3973,"description":3974,"org":3975,"tags":3976,"stars":3983,"repoUrl":3984,"updatedAt":3985},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3977,3980],{"name":3978,"slug":3979,"type":16},"Documentation","documentation",{"name":3981,"slug":3982,"type":16},"Engineering","engineering",861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":3987,"name":3987,"fn":3988,"description":3989,"org":3990,"tags":3991,"stars":3983,"repoUrl":3984,"updatedAt":3999},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3992,3995,3996],{"name":3993,"slug":3994,"type":16},"Communications","communications",{"name":9,"slug":8,"type":16},{"name":3997,"slug":3998,"type":16},"Technical Writing","technical-writing","2026-05-15T06:16:33.38217",{"slug":4001,"name":4001,"fn":4002,"description":4003,"org":4004,"tags":4005,"stars":3983,"repoUrl":3984,"updatedAt":4016},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4006,4009,4012,4013],{"name":4007,"slug":4008,"type":16},"Branding","branding",{"name":4010,"slug":4011,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":4014,"slug":4015,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":4018,"name":4018,"fn":4019,"description":4020,"org":4021,"tags":4022,"stars":3983,"repoUrl":3984,"updatedAt":4030},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4023,4026,4029],{"name":4024,"slug":4025,"type":16},"Claude Code","claude-code",{"name":4027,"slug":4028,"type":16},"Configuration","configuration",{"name":14,"slug":15,"type":16},"2026-05-15T06:16:44.335977",{"slug":4032,"name":4032,"fn":4033,"description":4034,"org":4035,"tags":4036,"stars":3983,"repoUrl":3984,"updatedAt":4044},"code-review","perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4037,4039,4040,4043],{"name":4038,"slug":4032,"type":16},"Code Review",{"name":3981,"slug":3982,"type":16},{"name":4041,"slug":4042,"type":16},"Performance","performance",{"name":14,"slug":15,"type":16},"2026-05-15T06:16:35.824864",{"slug":4046,"name":4046,"fn":4047,"description":4048,"org":4049,"tags":4050,"stars":3983,"repoUrl":3984,"updatedAt":4052},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4051],{"name":22,"slug":23,"type":16},"2026-05-15T06:16:32.127981",{"slug":4054,"name":4054,"fn":4055,"description":4056,"org":4057,"tags":4058,"stars":3983,"repoUrl":3984,"updatedAt":4062},"commit","create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4059,4061],{"name":4060,"slug":2092,"type":16},"Git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":4064,"name":4064,"fn":4065,"description":4066,"org":4067,"tags":4068,"stars":3983,"repoUrl":3984,"updatedAt":4072},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4069,4070,4071],{"name":3981,"slug":3982,"type":16},{"name":4060,"slug":2092,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":4074,"name":4074,"fn":4075,"description":4076,"org":4077,"tags":4078,"stars":3983,"repoUrl":3984,"updatedAt":4087},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4079,4080,4081,4084,4086],{"name":3861,"slug":3862,"type":16},{"name":22,"slug":23,"type":16},{"name":4082,"slug":4083,"type":16},"Django","django",{"name":4085,"slug":1932,"type":16},"Python",{"name":14,"slug":15,"type":16},"2026-05-15T06:16:43.098698",{"slug":4089,"name":4089,"fn":4090,"description":4091,"org":4092,"tags":4093,"stars":3983,"repoUrl":3984,"updatedAt":4100},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4094,4095,4098,4099],{"name":4038,"slug":4032,"type":16},{"name":4096,"slug":4097,"type":16},"Database","database",{"name":4082,"slug":4083,"type":16},{"name":4041,"slug":4042,"type":16},"2026-05-15T06:16:24.832813",88]