@vigolium/piolium 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/agents/access-auditor.md +300 -0
  4. package/agents/assumption-breaker.md +154 -0
  5. package/agents/attack-designer.md +116 -0
  6. package/agents/code-scanner.md +139 -0
  7. package/agents/concurrency-auditor.md +238 -0
  8. package/agents/confirm-writer.md +257 -0
  9. package/agents/context-reviewer.md +274 -0
  10. package/agents/cross-verifier.md +165 -0
  11. package/agents/cve-scout.md +381 -0
  12. package/agents/env-builder.md +282 -0
  13. package/agents/env-profiler.md +205 -0
  14. package/agents/evidence-collector.md +140 -0
  15. package/agents/finding-grader.md +142 -0
  16. package/agents/finding-writer.md +148 -0
  17. package/agents/flow-tracer.md +106 -0
  18. package/agents/goal-backtracer.md +146 -0
  19. package/agents/history-miner.md +467 -0
  20. package/agents/independent-verifier.md +118 -0
  21. package/agents/intent-mapper.md +183 -0
  22. package/agents/longshot-collector.md +128 -0
  23. package/agents/longshot-prober.md +126 -0
  24. package/agents/patch-auditor.md +73 -0
  25. package/agents/poc-author.md +124 -0
  26. package/agents/poc-runner.md +194 -0
  27. package/agents/probe-lead.md +269 -0
  28. package/agents/red-challenger.md +101 -0
  29. package/agents/report-composer.md +208 -0
  30. package/agents/review-adjudicator.md +216 -0
  31. package/agents/spec-auditor.md +155 -0
  32. package/agents/taint-tracer.md +265 -0
  33. package/agents/test-locator.md +209 -0
  34. package/agents/threat-modeler.md +132 -0
  35. package/agents/variant-scanner.md +108 -0
  36. package/agents/variant-spotter.md +110 -0
  37. package/bin/piolium.mjs +376 -0
  38. package/extensions/piolium/_vendor/yaml.bundle.d.mts +6 -0
  39. package/extensions/piolium/_vendor/yaml.bundle.mjs +139 -0
  40. package/extensions/piolium/agent-runner.ts +322 -0
  41. package/extensions/piolium/agents.ts +266 -0
  42. package/extensions/piolium/audit-state.ts +522 -0
  43. package/extensions/piolium/bundled-resources.ts +97 -0
  44. package/extensions/piolium/candidate-scan.ts +966 -0
  45. package/extensions/piolium/command-target.ts +177 -0
  46. package/extensions/piolium/console-stream.ts +57 -0
  47. package/extensions/piolium/export-results.ts +380 -0
  48. package/extensions/piolium/findings.ts +448 -0
  49. package/extensions/piolium/heartbeat.ts +182 -0
  50. package/extensions/piolium/help.ts +234 -0
  51. package/extensions/piolium/index.ts +1865 -0
  52. package/extensions/piolium/longshot.ts +530 -0
  53. package/extensions/piolium/matcher-suggestions.ts +196 -0
  54. package/extensions/piolium/matcher-utils.ts +83 -0
  55. package/extensions/piolium/modes/balanced.ts +750 -0
  56. package/extensions/piolium/modes/confirm-bootstrap.ts +186 -0
  57. package/extensions/piolium/modes/confirm.ts +697 -0
  58. package/extensions/piolium/modes/deep.ts +917 -0
  59. package/extensions/piolium/modes/diff.ts +177 -0
  60. package/extensions/piolium/modes/lite.ts +540 -0
  61. package/extensions/piolium/modes/longshot.ts +595 -0
  62. package/extensions/piolium/modes/merge.ts +204 -0
  63. package/extensions/piolium/modes/phase-runner.ts +267 -0
  64. package/extensions/piolium/modes/reinvest.ts +546 -0
  65. package/extensions/piolium/modes/revisit.ts +279 -0
  66. package/extensions/piolium/modes.ts +48 -0
  67. package/extensions/piolium/phase-labels.ts +123 -0
  68. package/extensions/piolium/phase-status-strip.ts +92 -0
  69. package/extensions/piolium/prompt-prefix-editor.ts +39 -0
  70. package/extensions/piolium/providers/anthropic-vertex.ts +836 -0
  71. package/extensions/piolium/recon.ts +409 -0
  72. package/extensions/piolium/result-stats.ts +105 -0
  73. package/extensions/piolium/retry.ts +120 -0
  74. package/extensions/piolium/scheduler.ts +212 -0
  75. package/extensions/piolium/secrets.ts +368 -0
  76. package/extensions/piolium/tools/web-tools.ts +148 -0
  77. package/package.json +77 -0
  78. package/skills/agentic-actions-auditor/SKILL.md +327 -0
  79. package/skills/agentic-actions-auditor/references/action-profiles.md +186 -0
  80. package/skills/agentic-actions-auditor/references/cross-file-resolution.md +209 -0
  81. package/skills/agentic-actions-auditor/references/foundations.md +94 -0
  82. package/skills/agentic-actions-auditor/references/vector-a-env-var-intermediary.md +77 -0
  83. package/skills/agentic-actions-auditor/references/vector-b-direct-expression-injection.md +83 -0
  84. package/skills/agentic-actions-auditor/references/vector-c-cli-data-fetch.md +83 -0
  85. package/skills/agentic-actions-auditor/references/vector-d-pr-target-checkout.md +88 -0
  86. package/skills/agentic-actions-auditor/references/vector-e-error-log-injection.md +88 -0
  87. package/skills/agentic-actions-auditor/references/vector-f-subshell-expansion.md +82 -0
  88. package/skills/agentic-actions-auditor/references/vector-g-eval-of-ai-output.md +91 -0
  89. package/skills/agentic-actions-auditor/references/vector-h-dangerous-sandbox-configs.md +102 -0
  90. package/skills/agentic-actions-auditor/references/vector-i-wildcard-allowlists.md +88 -0
  91. package/skills/audit/SKILL.md +562 -0
  92. package/skills/audit/assets/icon.svg +7 -0
  93. package/skills/audit/hooks/scripts/validate_phase_output.py +550 -0
  94. package/skills/audit/references/adversarial-review.md +148 -0
  95. package/skills/audit/references/architecture-aware-sast.md +306 -0
  96. package/skills/audit/references/audit-workflow.md +737 -0
  97. package/skills/audit/references/chamber-protocol.md +384 -0
  98. package/skills/audit/references/creative-attack-modes.md +221 -0
  99. package/skills/audit/references/deep-analysis.md +273 -0
  100. package/skills/audit/references/domain-attack-playbooks.md +1129 -0
  101. package/skills/audit/references/knowledge-base-template.md +513 -0
  102. package/skills/audit/references/real-env-validation.md +191 -0
  103. package/skills/audit/references/report-templates.md +417 -0
  104. package/skills/audit/references/triage-and-prereqs.md +134 -0
  105. package/skills/audit/scripts/consolidate_drafts.py +554 -0
  106. package/skills/audit/scripts/partition_findings.py +152 -0
  107. package/skills/audit/scripts/rg-hotspots.sh +121 -0
  108. package/skills/audit/scripts/stamp_file_state.py +349 -0
  109. package/skills/code-reviewer/SKILL.md +65 -0
  110. package/skills/codeql/SKILL.md +281 -0
  111. package/skills/codeql/references/build-fixes.md +90 -0
  112. package/skills/codeql/references/diagnostic-query-templates.md +339 -0
  113. package/skills/codeql/references/extension-yaml-format.md +209 -0
  114. package/skills/codeql/references/important-only-suite.md +153 -0
  115. package/skills/codeql/references/language-details.md +207 -0
  116. package/skills/codeql/references/macos-arm64e-workaround.md +179 -0
  117. package/skills/codeql/references/performance-tuning.md +111 -0
  118. package/skills/codeql/references/quality-assessment.md +172 -0
  119. package/skills/codeql/references/ruleset-catalog.md +63 -0
  120. package/skills/codeql/references/run-all-suite.md +92 -0
  121. package/skills/codeql/references/sarif-processing.md +79 -0
  122. package/skills/codeql/references/threat-models.md +51 -0
  123. package/skills/codeql/workflows/build-database.md +280 -0
  124. package/skills/codeql/workflows/create-data-extensions.md +261 -0
  125. package/skills/codeql/workflows/run-analysis.md +301 -0
  126. package/skills/differential-review/SKILL.md +220 -0
  127. package/skills/differential-review/adversarial.md +203 -0
  128. package/skills/differential-review/methodology.md +234 -0
  129. package/skills/differential-review/patterns.md +300 -0
  130. package/skills/differential-review/reporting.md +369 -0
  131. package/skills/fp-check/SKILL.md +125 -0
  132. package/skills/fp-check/references/bug-class-verification.md +114 -0
  133. package/skills/fp-check/references/deep-verification.md +143 -0
  134. package/skills/fp-check/references/evidence-templates.md +91 -0
  135. package/skills/fp-check/references/false-positive-patterns.md +115 -0
  136. package/skills/fp-check/references/gate-reviews.md +27 -0
  137. package/skills/fp-check/references/standard-verification.md +78 -0
  138. package/skills/insecure-defaults/SKILL.md +117 -0
  139. package/skills/insecure-defaults/references/examples.md +409 -0
  140. package/skills/last30days/SKILL.md +444 -0
  141. package/skills/sarif-parsing/SKILL.md +483 -0
  142. package/skills/sarif-parsing/resources/jq-queries.md +162 -0
  143. package/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
  144. package/skills/security-threat-model/LICENSE.txt +201 -0
  145. package/skills/security-threat-model/SKILL.md +81 -0
  146. package/skills/security-threat-model/agents/openai.yaml +4 -0
  147. package/skills/security-threat-model/references/prompt-template.md +255 -0
  148. package/skills/security-threat-model/references/security-controls-and-assets.md +32 -0
  149. package/skills/semgrep/SKILL.md +212 -0
  150. package/skills/semgrep/references/rulesets.md +162 -0
  151. package/skills/semgrep/references/scan-modes.md +110 -0
  152. package/skills/semgrep/references/scanner-task-prompt.md +140 -0
  153. package/skills/semgrep/scripts/merge_sarif.py +203 -0
  154. package/skills/semgrep/workflows/scan-workflow.md +311 -0
  155. package/skills/semgrep-rule-creator/SKILL.md +168 -0
  156. package/skills/semgrep-rule-creator/references/quick-reference.md +202 -0
  157. package/skills/semgrep-rule-creator/references/workflow.md +240 -0
  158. package/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
  159. package/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
  160. package/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
  161. package/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
  162. package/skills/sharp-edges/SKILL.md +292 -0
  163. package/skills/sharp-edges/references/auth-patterns.md +252 -0
  164. package/skills/sharp-edges/references/case-studies.md +274 -0
  165. package/skills/sharp-edges/references/config-patterns.md +333 -0
  166. package/skills/sharp-edges/references/crypto-apis.md +190 -0
  167. package/skills/sharp-edges/references/lang-c.md +205 -0
  168. package/skills/sharp-edges/references/lang-csharp.md +285 -0
  169. package/skills/sharp-edges/references/lang-go.md +270 -0
  170. package/skills/sharp-edges/references/lang-java.md +263 -0
  171. package/skills/sharp-edges/references/lang-javascript.md +269 -0
  172. package/skills/sharp-edges/references/lang-kotlin.md +265 -0
  173. package/skills/sharp-edges/references/lang-php.md +245 -0
  174. package/skills/sharp-edges/references/lang-python.md +274 -0
  175. package/skills/sharp-edges/references/lang-ruby.md +273 -0
  176. package/skills/sharp-edges/references/lang-rust.md +272 -0
  177. package/skills/sharp-edges/references/lang-swift.md +287 -0
  178. package/skills/sharp-edges/references/language-specific.md +588 -0
  179. package/skills/spec-to-code-compliance/SKILL.md +357 -0
  180. package/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
  181. package/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
  182. package/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
  183. package/skills/supply-chain-risk-auditor/SKILL.md +67 -0
  184. package/skills/supply-chain-risk-auditor/resources/results-template.md +41 -0
  185. package/skills/variant-analysis/METHODOLOGY.md +327 -0
  186. package/skills/variant-analysis/SKILL.md +142 -0
  187. package/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
  188. package/skills/variant-analysis/resources/codeql/go.ql +69 -0
  189. package/skills/variant-analysis/resources/codeql/java.ql +71 -0
  190. package/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
  191. package/skills/variant-analysis/resources/codeql/python.ql +80 -0
  192. package/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
  193. package/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
  194. package/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
  195. package/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
  196. package/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
  197. package/skills/variant-analysis/resources/variant-report-template.md +75 -0
  198. package/skills/vuln-report/SKILL.md +137 -0
  199. package/skills/vuln-report/agents/openai.yaml +4 -0
  200. package/skills/vuln-report/references/report-template.md +135 -0
  201. package/skills/wooyun-legacy/SKILL.md +367 -0
  202. package/skills/wooyun-legacy/references/bank-penetration.md +222 -0
  203. package/skills/wooyun-legacy/references/checklists/command-execution-checklist.md +119 -0
  204. package/skills/wooyun-legacy/references/checklists/csrf-checklist.md +74 -0
  205. package/skills/wooyun-legacy/references/checklists/file-upload-checklist.md +108 -0
  206. package/skills/wooyun-legacy/references/checklists/info-disclosure-checklist.md +114 -0
  207. package/skills/wooyun-legacy/references/checklists/logic-flaws-checklist.md +95 -0
  208. package/skills/wooyun-legacy/references/checklists/misconfig-checklist.md +124 -0
  209. package/skills/wooyun-legacy/references/checklists/path-traversal-checklist.md +87 -0
  210. package/skills/wooyun-legacy/references/checklists/rce-checklist.md +93 -0
  211. package/skills/wooyun-legacy/references/checklists/sql-injection-checklist.md +97 -0
  212. package/skills/wooyun-legacy/references/checklists/ssrf-checklist.md +99 -0
  213. package/skills/wooyun-legacy/references/checklists/unauthorized-access-checklist.md +89 -0
  214. package/skills/wooyun-legacy/references/checklists/weak-password-checklist.md +115 -0
  215. package/skills/wooyun-legacy/references/checklists/xss-checklist.md +103 -0
  216. package/skills/wooyun-legacy/references/checklists/xxe-checklist.md +130 -0
  217. package/skills/wooyun-legacy/references/info-disclosure.md +975 -0
  218. package/skills/wooyun-legacy/references/logic-flaws.md +721 -0
  219. package/skills/wooyun-legacy/references/path-traversal.md +1191 -0
  220. package/skills/wooyun-legacy/references/telecom-penetration.md +156 -0
  221. package/skills/wooyun-legacy/references/unauthorized-access.md +980 -0
  222. package/skills/wooyun-legacy/references/xss.md +746 -0
  223. package/skills/zeroize-audit/SKILL.md +371 -0
  224. package/skills/zeroize-audit/configs/c.yaml +21 -0
  225. package/skills/zeroize-audit/configs/default.yaml +128 -0
  226. package/skills/zeroize-audit/configs/rust.yaml +83 -0
  227. package/skills/zeroize-audit/prompts/report_template.md +238 -0
  228. package/skills/zeroize-audit/prompts/system.md +163 -0
  229. package/skills/zeroize-audit/prompts/task.md +97 -0
  230. package/skills/zeroize-audit/references/compile-commands.md +231 -0
  231. package/skills/zeroize-audit/references/detection-strategy.md +191 -0
  232. package/skills/zeroize-audit/references/ir-analysis.md +252 -0
  233. package/skills/zeroize-audit/references/mcp-analysis.md +221 -0
  234. package/skills/zeroize-audit/references/poc-generation.md +470 -0
  235. package/skills/zeroize-audit/references/rust-zeroization-patterns.md +867 -0
  236. package/skills/zeroize-audit/schemas/input.json +83 -0
  237. package/skills/zeroize-audit/schemas/output.json +140 -0
  238. package/skills/zeroize-audit/tools/analyze_asm.sh +202 -0
  239. package/skills/zeroize-audit/tools/analyze_cfg.py +381 -0
  240. package/skills/zeroize-audit/tools/analyze_heap.sh +211 -0
  241. package/skills/zeroize-audit/tools/analyze_ir_semantic.py +429 -0
  242. package/skills/zeroize-audit/tools/diff_ir.sh +135 -0
  243. package/skills/zeroize-audit/tools/diff_rust_mir.sh +189 -0
  244. package/skills/zeroize-audit/tools/emit_asm.sh +67 -0
  245. package/skills/zeroize-audit/tools/emit_ir.sh +77 -0
  246. package/skills/zeroize-audit/tools/emit_rust_asm.sh +178 -0
  247. package/skills/zeroize-audit/tools/emit_rust_ir.sh +150 -0
  248. package/skills/zeroize-audit/tools/emit_rust_mir.sh +158 -0
  249. package/skills/zeroize-audit/tools/extract_compile_flags.py +284 -0
  250. package/skills/zeroize-audit/tools/generate_poc.py +1329 -0
  251. package/skills/zeroize-audit/tools/mcp/apply_confidence_gates.py +113 -0
  252. package/skills/zeroize-audit/tools/mcp/check_mcp.sh +68 -0
  253. package/skills/zeroize-audit/tools/mcp/normalize_mcp_evidence.py +125 -0
  254. package/skills/zeroize-audit/tools/scripts/check_llvm_patterns.py +481 -0
  255. package/skills/zeroize-audit/tools/scripts/check_mir_patterns.py +554 -0
  256. package/skills/zeroize-audit/tools/scripts/check_rust_asm.py +424 -0
  257. package/skills/zeroize-audit/tools/scripts/check_rust_asm_aarch64.py +300 -0
  258. package/skills/zeroize-audit/tools/scripts/check_rust_asm_x86.py +283 -0
  259. package/skills/zeroize-audit/tools/scripts/find_dangerous_apis.py +375 -0
  260. package/skills/zeroize-audit/tools/scripts/semantic_audit.py +923 -0
  261. package/skills/zeroize-audit/tools/track_dataflow.sh +196 -0
  262. package/skills/zeroize-audit/tools/validate_rust_toolchain.sh +298 -0
  263. package/skills/zeroize-audit/workflows/phase-0-preflight.md +150 -0
  264. package/skills/zeroize-audit/workflows/phase-1-source-analysis.md +144 -0
  265. package/skills/zeroize-audit/workflows/phase-2-compiler-analysis.md +139 -0
  266. package/skills/zeroize-audit/workflows/phase-3-interim-report.md +46 -0
  267. package/skills/zeroize-audit/workflows/phase-4-poc-generation.md +46 -0
  268. package/skills/zeroize-audit/workflows/phase-5-poc-validation.md +136 -0
  269. package/skills/zeroize-audit/workflows/phase-6-final-report.md +44 -0
  270. package/skills/zeroize-audit/workflows/phase-7-test-generation.md +42 -0
  271. package/themes/piolium-srcery.json +94 -0
@@ -0,0 +1,1129 @@
1
+ # Domain-Specific Attack Playbooks
2
+
3
+ Reference for Mode C of Phase 3 Domain Attack Research. Provides per-domain attack patterns,
4
+ research signals, and mapping to testing skills.
5
+
6
+ ---
7
+
8
+ ## Domain Identification Signals
9
+
10
+ Trigger Mode C when any of the following are detected during Phase 3 Steps 1-2:
11
+
12
+ | Signal | Where to look | Example trigger |
13
+ |--------|--------------|-----------------|
14
+ | Protocol/format keyword in project name or description | README, package.json, go.mod, Cargo.toml | "saml", "oauth", "jwt", "grpc", "graphql", "mqtt" |
15
+ | RFC/spec listed in `## Specs and RFCs Implemented` | Phase 3 Step 2 output | RFC 6749, RFC 7519, RFC 9110 |
16
+ | Security-sensitive library in dependencies | manifests, lockfiles | xmlsec, python-jose, openssl, bouncycastle, pyyaml, pickle |
17
+ | Transport, storage, or compute type in architecture inventory | Phase 3 Step 2 | WebSocket, gRPC, Kafka, Redis, S3, Lambda, Docker |
18
+ | Project type is `protocol`, `library`, `plugin`, `CI action` | Step 1 classification | OIDC provider, SAML SP, image processor, template renderer |
19
+ | Auth/crypto/parsing/rendering in component names | DFD slices | `SAMLValidator`, `OAuthHandler`, `TemplateEngine`, `PDFRenderer` |
20
+ | Keyword in source files | grep across codebase | `subprocess`, `eval`, `pickle.loads`, `Template(`, `innerHTML` |
21
+ | Cloud provider SDK import | imports, dependencies | boto3, google-cloud, azure-sdk, @aws-sdk |
22
+ | AI/ML framework import | imports, dependencies | openai, anthropic, transformers, langchain, torch |
23
+
24
+ Produce a list of identified domains at the top of the `## Domain Attack Research` section.
25
+
26
+ ---
27
+
28
+ ## Research Action Sequence
29
+
30
+ For each identified domain, perform in order:
31
+
32
+ 1. **Web search** — search for `"<domain> known attacks"`, `"<domain> security vulnerabilities"`,
33
+ `"<domain> CVE analysis"`, `"<domain> implementation pitfalls"`. Use `WebSearch` and `WebFetch`.
34
+
35
+ 2. **`last30days` skill** — invoke with query `"<domain> security vulnerability attack bypass"` to
36
+ surface recent CVE discussions, bypass technique posts, and new attack research.
37
+
38
+ 3. **`wooyun-legacy` skill** (conditional) — invoke only when the domain intersects with web
39
+ application security (HTTP, auth, session, XML, file handling). See per-domain mapping below.
40
+
41
+ 4. **MCP tools** (best-effort) — use `mcp__docker-gateway__perplexity_research`,
42
+ `mcp__docker-gateway__tavily_research`, or `mcp__docker-gateway__brave_web_search` for deeper
43
+ technical research when available. Fall back to `WebSearch` if MCP tools are unavailable.
44
+
45
+ 5. **Build attack taxonomy** — classify each discovered attack by: attack class, prerequisites,
46
+ detection strategy, SAST detectability (yes/no/partial), and relevance to this project's
47
+ implementation.
48
+
49
+ ---
50
+
51
+ ## Output Format
52
+
53
+ The `## Domain Attack Research` section in `archon/attack-surface/knowledge-base-report.md` must include,
54
+ for each identified domain, the following subsection:
55
+
56
+ ```markdown
57
+ ### Domain: <name>
58
+
59
+ **Identified via:** <signal — e.g., "RFC 7519 listed in Specs, go-jose dependency">
60
+
61
+ **Known attack classes:**
62
+
63
+ | Attack | Description | Detection strategy | Relevance |
64
+ |--------|-------------|-------------------|-----------|
65
+ | <name> | <brief> | <how to detect in code> | High/Med/Low |
66
+
67
+ **Custom SAST targets:**
68
+
69
+ | Attack pattern | Rule type | Source/sink or pattern | Priority |
70
+ |---------------|-----------|----------------------|----------|
71
+ | <name> | CodeQL / Semgrep | <what to model> | High/Med/Low |
72
+
73
+ **Manual review checklist:**
74
+ - [ ] <concrete check tied to this project's implementation>
75
+
76
+ **Research sources used:** last30days, wooyun-legacy (<checklist>), web search, MCP
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Per-Domain Templates
82
+
83
+ ---
84
+
85
+ ### Authentication & Authorization Protocols
86
+
87
+ ---
88
+
89
+ #### SAML
90
+
91
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `xxe-checklist.md`
92
+ **Key search terms:** `SAML XML signature wrapping`, `SAML assertion forgery`, `SAML comment injection`, `SAML roundtrip`
93
+
94
+ | Attack | Description | Detection strategy | SAST |
95
+ |--------|-------------|-------------------|------|
96
+ | XML Signature Wrapping (XSW) | Signed element moved; unsigned clone used | Assertion extraction happens on the same node as sig verification | Partial |
97
+ | Comment injection | XML comment splits identity (`admin<!---->.evil`) | Username extraction strips XML comments | Yes |
98
+ | SAML roundtrip | Parse→serialize→re-parse yields different assertion | No re-parse after serialization in auth flow | No |
99
+ | Unsigned assertion acceptance | SP accepts assertions without valid signature | Every code path verifying an assertion requires valid sig | Yes |
100
+ | InResponseTo bypass | Response replayed by spoofing/omitting InResponseTo | SP tracks issued IDs and validates InResponseTo | Yes |
101
+ | XML External Entity (XXE) | DTD-based SSRF or file read via XML parser | Parser disables external entity resolution | Yes |
102
+ | Destination validation bypass | SP accepts assertion intended for another SP | Destination attribute validated against known SP URLs | Yes |
103
+
104
+ **Manual review checklist:**
105
+ - [ ] Signature verification uses the same node reference that assertion extraction uses
106
+ - [ ] Parser entity resolution disabled; DTD processing disabled
107
+ - [ ] InResponseTo bound to request ID and checked for replay
108
+ - [ ] Destination and Recipient attributes validated against known values
109
+ - [ ] NameID extracted after signature validation, not before
110
+ - [ ] SubjectConfirmationData NotOnOrAfter enforced
111
+
112
+ ---
113
+
114
+ #### OAuth 2.0 / OIDC
115
+
116
+ **Wooyun-legacy:** `csrf-checklist.md`, `logic-flaws-checklist.md`, `ssrf-checklist.md`
117
+ **Key search terms:** `OAuth redirect_uri bypass`, `OAuth mix-up attack`, `PKCE downgrade`, `OIDC nonce bypass`
118
+
119
+ | Attack | Description | Detection strategy | SAST |
120
+ |--------|-------------|-------------------|------|
121
+ | redirect_uri bypass | Prefix match, subdomain, open redirect | Exact match or strict per-client allowlist | Yes |
122
+ | State CSRF | Missing/non-validated `state` on callback | State generated, stored server-side, verified on callback | Yes |
123
+ | Mix-up attack | Attacker substitutes a different AS's code | `iss` claim validated; AS metadata bound to session | No |
124
+ | PKCE downgrade | Server accepts code without PKCE when client sent challenge | Server enforces PKCE when challenge was registered | Yes |
125
+ | Token leakage via referrer | Token in URL ends up in Referer | Tokens not in URL query strings | Yes |
126
+ | Scope escalation | Scope not re-validated at resource access | Scope recorded at issuance and re-validated | Yes |
127
+ | OIDC nonce bypass | Nonce not validated in ID token | Nonce bound to request and verified in ID token | Yes |
128
+ | Authorization code replay | Code used more than once | One-time code invalidated after first exchange | Yes |
129
+
130
+ **Manual review checklist:**
131
+ - [ ] redirect_uri exact-match against per-client allowlist (no prefix/regex)
132
+ - [ ] state is cryptographically random, stored server-side, verified on callback
133
+ - [ ] PKCE enforced for public clients (S256 required)
134
+ - [ ] Token endpoint authenticates client before issuing tokens
135
+ - [ ] Authorization codes invalidated after first use
136
+
137
+ ---
138
+
139
+ #### JWT / JWS / JWE
140
+
141
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`
142
+ **Key search terms:** `JWT algorithm confusion`, `alg none attack`, `JWT kid injection`, `JKU substitution`
143
+
144
+ | Attack | Description | Detection strategy | SAST |
145
+ |--------|-------------|-------------------|------|
146
+ | Algorithm confusion RS256→HS256 | Public key used as HMAC secret | Algorithm allowlisted, not taken from header | Yes |
147
+ | `alg: none` acceptance | Unsigned tokens accepted | `none` rejected unconditionally | Yes |
148
+ | `kid` header injection | `kid` used in SQL/path query unsanitized | `kid` lookup uses allowlist or constant key store | Yes |
149
+ | `jku`/`x5u` substitution | Attacker-supplied URL for key retrieval | Key URL validated against allowlist | Yes |
150
+ | Claim validation bypass | `exp`, `nbf`, `iss`, `aud` not validated | All mandatory claims validated before use | Yes |
151
+ | Embedded `jwk` attack | Server uses attacker-supplied `jwk` header | `jwk` header ignored; only pre-configured keys | Yes |
152
+ | Cross-service token reuse | Token for service A accepted by service B | `aud` validated and service-specific | Yes |
153
+
154
+ **Manual review checklist:**
155
+ - [ ] Algorithm validated against explicit allowlist; `none` never accepted
156
+ - [ ] `jku`, `x5u`, `jwk` headers ignored or validated against strict allowlist
157
+ - [ ] `kid` only indexes a pre-configured key store; never used in dynamic queries
158
+ - [ ] `exp`, `nbf`, `iss`, `aud` all validated on every token
159
+
160
+ ---
161
+
162
+ #### Session Management
163
+
164
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `logic-flaws-checklist.md`
165
+ **Key search terms:** `session fixation attack`, `session riding`, `concurrent session confusion`, `insecure session storage`
166
+
167
+ | Attack | Description | Detection strategy | SAST |
168
+ |--------|-------------|-------------------|------|
169
+ | Session fixation | Attacker sets a known session ID pre-auth | Session ID regenerated on privilege elevation | Yes |
170
+ | Insufficient session ID entropy | Short or guessable session IDs | Session ID is cryptographically random (≥128 bits) | Yes |
171
+ | Session not invalidated on logout | Server-side session survives logout | Session record deleted/invalidated on logout | Yes |
172
+ | Concurrent session not bounded | Unlimited parallel sessions per user | Concurrent session limit enforced | No |
173
+ | Session ID in URL | Session ID leaks via Referer/logs | Session ID only in cookie, never in URL | Yes |
174
+ | Missing Secure/HttpOnly/SameSite | Cookie flags absent | All session cookies have Secure, HttpOnly, SameSite=Lax/Strict | Yes |
175
+ | Absolute timeout missing | Sessions valid indefinitely | Absolute session lifetime enforced server-side | Yes |
176
+
177
+ **Manual review checklist:**
178
+ - [ ] Session ID regenerated on login, privilege change, and role switch
179
+ - [ ] Session invalidated server-side on logout (not just cookie deleted client-side)
180
+ - [ ] Session cookie has Secure, HttpOnly, SameSite attributes
181
+ - [ ] Absolute timeout (e.g., 8-24h) enforced regardless of activity
182
+
183
+ ---
184
+
185
+ #### TOTP / MFA / OTP
186
+
187
+ **Wooyun-legacy:** `logic-flaws-checklist.md`
188
+ **Key search terms:** `TOTP bypass`, `OTP brute force`, `MFA fatigue attack`, `backup code security`
189
+
190
+ | Attack | Description | Detection strategy | SAST |
191
+ |--------|-------------|-------------------|------|
192
+ | OTP brute force | No rate limit on OTP submission | Rate limit and lockout on OTP attempts | Yes |
193
+ | OTP replay | Same OTP reused within validity window | Used OTPs invalidated immediately | Yes |
194
+ | Time window too large | TOTP accepted 10+ steps before/after | Window limited to ±1 step (30s) | Yes |
195
+ | Backup code exhaustion | Unlimited backup code attempts | Backup codes rate-limited and one-time | Yes |
196
+ | MFA fatigue (push) | Flood push notifications until accepted | Push notifications throttled and confirmable only once | No |
197
+ | TOTP secret in logs | Secret logged during QR code generation | TOTP secret never appears in logs | Yes |
198
+ | MFA bypass via account recovery | Recovery flow skips MFA | MFA re-enrolled after recovery | No |
199
+
200
+ **Manual review checklist:**
201
+ - [ ] OTP submissions rate-limited (e.g., 5 attempts then lockout)
202
+ - [ ] Used OTPs invalidated immediately; not reusable within validity window
203
+ - [ ] TOTP window is ±1 step (30s) maximum
204
+ - [ ] Backup codes are one-time and stored hashed
205
+
206
+ ---
207
+
208
+ #### Password Hashing
209
+
210
+ **Wooyun-legacy:** `weak-password-checklist.md`
211
+ **Key search terms:** `bcrypt max length truncation`, `timing attack password verification`, `password hashing bypass`
212
+
213
+ | Attack | Description | Detection strategy | SAST |
214
+ |--------|-------------|-------------------|------|
215
+ | Weak algorithm | MD5/SHA1/SHA256 used directly | bcrypt/scrypt/argon2/PBKDF2 required | Yes |
216
+ | bcrypt 72-byte truncation | bcrypt silently truncates at 72 bytes | Pre-hash with SHA-512 or use argon2 | Yes |
217
+ | Timing side-channel | Non-constant-time comparison | `hmac.compare_digest` or equivalent | Yes |
218
+ | Insufficient work factor | Cost parameter too low (bcrypt < 10) | Work factor validated at startup | Yes |
219
+ | Plaintext password in logs | Password logged during auth failure | Password field never logged | Yes |
220
+ | Password not rehashed on login | Old weak hash not upgraded | Hash upgraded on successful login | Yes |
221
+
222
+ **Manual review checklist:**
223
+ - [ ] Password hashed with bcrypt (cost≥12), argon2id, or scrypt
224
+ - [ ] Comparison uses constant-time function
225
+ - [ ] Password never appears in logs, error messages, or serialized objects
226
+ - [ ] Hash work factor is configurable and validated at startup
227
+
228
+ ---
229
+
230
+ ### Web Technologies
231
+
232
+ ---
233
+
234
+ #### Template Engines (Server-Side Template Injection)
235
+
236
+ **Wooyun-legacy:** `rce-checklist.md`, `xss-checklist.md`
237
+ **Key search terms:** `server-side template injection SSTI`, `Jinja2 SSTI`, `Twig SSTI`, `Handlebars template injection`, `Freemarker injection`
238
+
239
+ | Attack | Description | Detection strategy | SAST |
240
+ |--------|-------------|-------------------|------|
241
+ | SSTI to RCE | User input rendered as template expression | User input never passed to template constructor or `render()` | Yes |
242
+ | Template sandbox escape | Sandbox bypassed via `__class__` chains | Sandbox configuration audited; object traversal blocked | No |
243
+ | Partial template injection | User controls only part of template string | Even partial user input in template source is dangerous | Yes |
244
+ | Client-side template injection | Angular/Vue/React expression evaluation | `ng-bind-html`, `v-html`, `dangerouslySetInnerHTML` audited | Yes |
245
+ | Template file path traversal | User controls which template file is loaded | Template loader restricts to safe directory | Yes |
246
+
247
+ **Manual review checklist:**
248
+ - [ ] User input is never passed to template constructors (`Template(user_input)`, `env.from_string(user_input)`)
249
+ - [ ] User input is only passed as template variables, not as template source
250
+ - [ ] Template file selection is from a fixed allowlist, not user-controlled paths
251
+ - [ ] Client-side template bindings (`v-html`, `dangerouslySetInnerHTML`) audited for user input
252
+
253
+ ---
254
+
255
+ #### URL Parsing Differentials
256
+
257
+ **Wooyun-legacy:** `ssrf-checklist.md`, `path-traversal-checklist.md`
258
+ **Key search terms:** `URL parser differential bypass`, `open redirect bypass`, `SSRF filter bypass URL`, `URL confusion attack`
259
+
260
+ | Attack | Description | Detection strategy | SAST |
261
+ |--------|-------------|-------------------|------|
262
+ | Parser differential | Security check uses parser A; fetch uses parser B | Single authoritative parser used for both | No |
263
+ | Scheme confusion | `javascript:`, `data:`, `vbscript:` bypass URL checks | Scheme validated against explicit allowlist | Yes |
264
+ | IPv6/IPv4 confusion | `http://[::1]` bypasses `127.0.0.1` blocklist | Both IPv4 and IPv6 loopback/private ranges blocked | Yes |
265
+ | URL shortener / redirect | Allowed URL redirects to blocked target | SSRF check follows redirects | No |
266
+ | Double encoding | `%252F` bypasses single-decode check | URL decoded once before security check | Yes |
267
+ | Host@authority confusion | `http://evil@trusted.com` | Userinfo stripped before allowlist check | Yes |
268
+ | Embedded newline / null byte | `host\nX-Header:` splits request | Headers stripped of `\r\n` and `\x00` | Yes |
269
+
270
+ **Manual review checklist:**
271
+ - [ ] URL scheme validated against explicit allowlist before any fetch
272
+ - [ ] Security check and fetch operation use the same URL parser
273
+ - [ ] Private/loopback IP ranges blocked for both IPv4 and IPv6
274
+ - [ ] Redirects followed and destination re-validated for SSRF
275
+
276
+ ---
277
+
278
+ #### File Upload / Multipart Parsing
279
+
280
+ **Wooyun-legacy:** `file-upload-checklist.md`, `path-traversal-checklist.md`
281
+ **Key search terms:** `file upload bypass`, `polyglot file attack`, `multipart parsing confusion`, `MIME type bypass`
282
+
283
+ | Attack | Description | Detection strategy | SAST |
284
+ |--------|-------------|-------------------|------|
285
+ | Extension bypass | `.php.jpg` or null byte in filename | Extension validated after last dot; null bytes rejected | Yes |
286
+ | MIME confusion | Content-Type header spoofed | File content validated by magic bytes, not MIME header | Yes |
287
+ | Polyglot file | File valid in two formats simultaneously | Both format-specific checks applied | No |
288
+ | Path traversal in filename | `../../etc/passwd` in Content-Disposition | Filename sanitized; no path components allowed | Yes |
289
+ | Zip slip via upload | Archive entry escapes target directory | Extracted paths canonicalized and confined | Yes |
290
+ | Decompression bomb | Tiny upload expands to fill disk | Decompressed size bounded before extraction | Yes |
291
+ | Multipart boundary injection | Crafted boundary confuses parser | Framework-level multipart parser used; not custom | No |
292
+ | Web shell via upload | Executable file uploaded and served | Uploaded files served from non-executable storage | Yes |
293
+
294
+ **Manual review checklist:**
295
+ - [ ] File extension validated against allowlist (not blocklist) after last `.`
296
+ - [ ] File content validated by magic bytes or library, not Content-Type header
297
+ - [ ] Filenames stripped of path components and sanitized before storage
298
+ - [ ] Uploaded files stored outside webroot or served with `Content-Disposition: attachment`
299
+ - [ ] File size and decompressed size bounded
300
+
301
+ ---
302
+
303
+ #### Image Processing
304
+
305
+ **Wooyun-legacy:** `ssrf-checklist.md`, `command-execution-checklist.md`
306
+ **Key search terms:** `ImageMagick vulnerability`, `PIL/Pillow security`, `image processing SSRF`, `ghostscript injection`, `libvips security`
307
+
308
+ | Attack | Description | Detection strategy | SAST |
309
+ |--------|-------------|-------------------|------|
310
+ | ImageMagick shell injection (CVE-2016-3714) | `|` or `https://` MSL commands in image | ImageMagick policy.xml restricts dangerous coders | Yes |
311
+ | SSRF via image fetch | Image URL fetched server-side | URL validated against SSRF allowlist before fetch | Yes |
312
+ | SVG/XML external entity | SVG parsed with XXE-vulnerable parser | SVG processing disabled or sandboxed | Yes |
313
+ | Pixel flood DoS | Malformed header claims 100k×100k image | Dimension limits enforced before decode | Yes |
314
+ | Format confusion | File reported as JPEG but parsed as PostScript | Format detection by magic bytes, not file extension | Yes |
315
+ | Ghostscript command injection | Postscript/PDF processed by Ghostscript | Ghostscript disabled in ImageMagick policy | Yes |
316
+ | Metadata exfiltration | EXIF/IPTC data returned to user unstripped | Metadata stripped before serving user-uploaded images | Yes |
317
+
318
+ **Manual review checklist:**
319
+ - [ ] ImageMagick `policy.xml` disables dangerous coders: PS, EPS, PDF, MSL, MVG, SVG, URL
320
+ - [ ] Image dimensions validated before allocation
321
+ - [ ] SVG rendering sandboxed or disabled
322
+ - [ ] User-uploaded images processed in a separate, network-isolated process
323
+
324
+ ---
325
+
326
+ #### PDF Generation
327
+
328
+ **Wooyun-legacy:** `ssrf-checklist.md`, `xss-checklist.md`
329
+ **Key search terms:** `wkhtmltopdf SSRF`, `headless Chrome PDF injection`, `PDF generation XSS`, `iText injection`
330
+
331
+ | Attack | Description | Detection strategy | SAST |
332
+ |--------|-------------|-------------------|------|
333
+ | SSRF via HTML renderer | `<iframe src="http://169.254.169.254/">` in user content | User content sanitized before PDF rendering; network disabled | Yes |
334
+ | Local file read | `<iframe src="file:///etc/passwd">` | `file://` protocol disabled in renderer | Yes |
335
+ | HTML/JS injection → PDF | User content rendered as HTML; JS executed | HTML sanitized; JS execution disabled in renderer | Yes |
336
+ | Redirect to internal resource | External HTML redirects to internal URL | Redirects disabled in renderer; URL allowlisted | No |
337
+ | CSS injection → data exfiltration | CSS `@import` fetches attacker URL | External resource loading disabled | Yes |
338
+
339
+ **Manual review checklist:**
340
+ - [ ] User-controlled content sanitized with strict HTML allowlist before PDF render
341
+ - [ ] PDF renderer network access disabled or allowlisted
342
+ - [ ] `file://` protocol disabled in renderer configuration
343
+ - [ ] JavaScript execution disabled in renderer
344
+
345
+ ---
346
+
347
+ #### Markdown / Rich Text Parsers
348
+
349
+ **Wooyun-legacy:** `xss-checklist.md`
350
+ **Key search terms:** `Markdown XSS bypass`, `mXSS mutation XSS`, `CommonMark XSS`, `rich text sanitizer bypass`
351
+
352
+ | Attack | Description | Detection strategy | SAST |
353
+ |--------|-------------|-------------------|------|
354
+ | Raw HTML in Markdown | `<script>` or `<img onerror=...>` in Markdown source | Raw HTML disabled or sanitized after rendering | Yes |
355
+ | Mutation XSS (mXSS) | Sanitized HTML mutated by browser re-parse | Sanitizer applied after Markdown→HTML, not before | No |
356
+ | Link/image URL injection | `[text](javascript:alert(1))` | Link/image URL validated against scheme allowlist | Yes |
357
+ | LaTeX injection | `\input{}` or `\write18{}` in math blocks | LaTeX rendering sandboxed; dangerous commands blocked | No |
358
+ | Mention/link expansion | Auto-linked URLs trigger SSRF on preview | Server-side link expansion uses SSRF-safe fetch | Yes |
359
+
360
+ **Manual review checklist:**
361
+ - [ ] Raw HTML disabled in Markdown renderer or sanitized strictly after rendering
362
+ - [ ] Link/image URLs validated against scheme allowlist (no `javascript:`, `data:`, `vbscript:`)
363
+ - [ ] HTML sanitizer applied to final rendered output, not to raw Markdown input
364
+
365
+ ---
366
+
367
+ #### Caching / Cache Poisoning
368
+
369
+ **Wooyun-legacy:** `misconfig-checklist.md`
370
+ **Key search terms:** `web cache poisoning`, `cache deception attack`, `cache key confusion`, `CDN cache poisoning`
371
+
372
+ | Attack | Description | Detection strategy | SAST |
373
+ |--------|-------------|-------------------|------|
374
+ | Web cache poisoning | Unkeyed input (header/cookie) poisons cached response | Cache key includes all security-relevant inputs | No |
375
+ | Cache deception | Attacker tricks victim into caching their response at attacker URL | Sensitive responses marked `Cache-Control: no-store` | Yes |
376
+ | Cache key confusion | `X-Forwarded-Host` used in response but not cache key | Unkeyed headers stripped at CDN/proxy | No |
377
+ | Stored DOM XSS via cache | Attacker-controlled value persisted in cached JS/HTML | User content never stored in CDN-cached responses | No |
378
+ | Race condition in cache write | Two concurrent requests write conflicting values | Cache writes atomic; TTL enforced | No |
379
+
380
+ **Manual review checklist:**
381
+ - [ ] Cache-Control headers reviewed: sensitive responses set `no-store`
382
+ - [ ] CDN/proxy cache key includes all headers/cookies that affect response content
383
+ - [ ] `X-Forwarded-Host`, `X-Host`, `X-Forwarded-Server` not trusted to override cache key
384
+ - [ ] Authenticated responses not cached at CDN layer
385
+
386
+ ---
387
+
388
+ #### Regular Expressions (ReDoS)
389
+
390
+ **Wooyun-legacy:** (none directly applicable)
391
+ **Key search terms:** `ReDoS regular expression denial of service`, `catastrophic backtracking`, `redos vulnerability detection`
392
+
393
+ | Attack | Description | Detection strategy | SAST |
394
+ |--------|-------------|-------------------|------|
395
+ | Catastrophic backtracking | Nested quantifiers with overlap cause exponential time | Regex static analysis (safe-regex, vuln-regex-detector) | Partial |
396
+ | ReDoS via nested groups | `(a+)+`, `(a|a)+`, `(.*a){n}` patterns | No nested quantifiers on overlapping character classes | Yes |
397
+ | Email/URL regex bomb | Complex validation regex on user input | Replace hand-rolled validators with proven libraries | Yes |
398
+ | Regex injection | User input passed as regex pattern | User input never used as regex pattern | Yes |
399
+
400
+ **Manual review checklist:**
401
+ - [ ] No regex with nested quantifiers applied to user-controlled input
402
+ - [ ] Email/URL validation uses a proven library, not a hand-rolled regex
403
+ - [ ] User input never used as a regex pattern
404
+
405
+ ---
406
+
407
+ ### Data Storage & Messaging
408
+
409
+ ---
410
+
411
+ #### SQL / ORM Query Building
412
+
413
+ **Wooyun-legacy:** `sql-injection-checklist.md`
414
+ **Key search terms:** `ORM SQL injection`, `raw query injection`, `second-order SQL injection`, `SQL injection via ORM`
415
+
416
+ | Attack | Description | Detection strategy | SAST |
417
+ |--------|-------------|-------------------|------|
418
+ | Raw query with string concat | `db.query("SELECT * WHERE id=" + id)` | No string concatenation into SQL; parameterized only | Yes |
419
+ | ORM raw() / execute() injection | ORM raw query escape hatch used with user input | `raw()`, `execute()`, `annotate()` flagged for user input | Yes |
420
+ | Second-order injection | Data stored safely, later used unsafely in query | Stored values also parameterized when re-queried | No |
421
+ | ORDER BY / LIMIT injection | User-controlled sort column interpolated | Column names validated against allowlist | Yes |
422
+ | Mass assignment | ORM model updated directly from request body | `fillable`/`guarded` or explicit field binding enforced | Yes |
423
+ | Blind injection via timing | Time-based blind injection via slow query | Rate limiting and query timeout enforced | No |
424
+
425
+ **Manual review checklist:**
426
+ - [ ] All queries use parameterized queries or ORM-level parameter binding
427
+ - [ ] `ORDER BY` column names validated against allowlist; never user-interpolated
428
+ - [ ] `raw()`, `execute()`, `annotate(rawsql)` occurrences audited for user input
429
+ - [ ] Mass assignment protection enabled (allowlist of fillable fields)
430
+
431
+ ---
432
+
433
+ #### NoSQL (MongoDB, Redis, Elasticsearch, DynamoDB)
434
+
435
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`
436
+ **Key search terms:** `MongoDB injection`, `NoSQL injection`, `Elasticsearch injection`, `Redis command injection`
437
+
438
+ | Attack | Description | Detection strategy | SAST |
439
+ |--------|-------------|-------------------|------|
440
+ | MongoDB operator injection | `{ "$where": "..." }` or `{ "$gt": "" }` from user input | User input never merged directly into query object | Yes |
441
+ | Redis command injection | User input reaches `EVAL` or command string | `EVAL` with user input blocked; commands use parameterized clients | Yes |
442
+ | Elasticsearch query injection | User input in `query_string` with wildcard abuse | Query type restricted; user input in `match` (analyzed) not `query_string` | Yes |
443
+ | DynamoDB filter expression injection | User input in filter expression | Filter expressions use `:placeholder` substitution | Yes |
444
+ | Unauthenticated service exposure | Redis/Elasticsearch bound to 0.0.0.0 without auth | Datastores bound to localhost or require auth | No |
445
+ | Key enumeration | Predictable key patterns allow data extraction | Keys include user-specific entropy; SCAN disabled | Yes |
446
+
447
+ **Manual review checklist:**
448
+ - [ ] MongoDB queries use typed operators; user input never merged into query object with `Object.assign` or `...spread`
449
+ - [ ] Redis `EVAL` and `KEYS` / `SCAN` commands not accessible with user-supplied arguments
450
+ - [ ] Elasticsearch `query_string` queries not used with user input; use `match` or `term`
451
+
452
+ ---
453
+
454
+ #### Message Queues / Event Streaming (Kafka, RabbitMQ, SQS, Pub/Sub, NATS)
455
+
456
+ **Wooyun-legacy:** (none directly)
457
+ **Key search terms:** `Kafka deserialization vulnerability`, `message queue injection`, `event sourcing security`, `AMQP security`
458
+
459
+ | Attack | Description | Detection strategy | SAST |
460
+ |--------|-------------|-------------------|------|
461
+ | Deserialization via queue | Java/Python deserialization in consumer | Deserializer type-constrained; no Java native deserialization | Yes |
462
+ | Topic/queue injection | User input used as topic name | Topic names validated against allowlist | Yes |
463
+ | Message replay | Old messages re-delivered without idempotency guard | Consumer is idempotent; deduplication ID used | No |
464
+ | Consumer group privilege escalation | Consumer joins privileged group by name | Consumer group membership validated | No |
465
+ | Dead letter queue exposure | DLQ contains sensitive unprocessed messages | DLQ access controlled; messages encrypted | No |
466
+ | Schema evolution confusion | Producer schema changes break consumer validation | Schema registry enforced; consumers reject unknown versions | No |
467
+ | SSRF via webhook delivery | Broker delivers messages to user-controlled URLs | Webhook URL validated against SSRF allowlist | Yes |
468
+
469
+ **Manual review checklist:**
470
+ - [ ] Message deserializer is schema-constrained (protobuf/Avro/JSON with schema); no native Java/Python serialization
471
+ - [ ] Topic names used in routing are from allowlist, not user-constructed
472
+ - [ ] Webhook delivery URLs validated against SSRF allowlist before fetch
473
+ - [ ] DLQ access is restricted and audited
474
+
475
+ ---
476
+
477
+ #### Caching Layers (Memcached, Redis as cache, CDN)
478
+
479
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`
480
+ **Key search terms:** `cache key injection`, `Memcached injection`, `cache poisoning`, `cache timing attack`
481
+
482
+ | Attack | Description | Detection strategy | SAST |
483
+ |--------|-------------|-------------------|------|
484
+ | Memcached injection | Newline in key name injects additional commands | Keys sanitized; no `\r\n` in cache keys | Yes |
485
+ | Cache key collision | Two different inputs produce same cache key | Cache key uniquely encodes all variable inputs | No |
486
+ | Sensitive data in cache | Tokens, passwords, or PII stored in shared cache | Sensitive data excluded from cache or encrypted | Yes |
487
+ | Cache-based timing oracle | Timing difference reveals cache hit/miss | Responses normalized to avoid timing leakage | No |
488
+ | Unauthenticated cache access | Redis/Memcached accessible without auth | Cache bound to localhost or requires auth | No |
489
+
490
+ **Manual review checklist:**
491
+ - [ ] Cache keys include all inputs that affect the response (user ID, locale, permissions)
492
+ - [ ] Sensitive data (auth tokens, PII) excluded from cache or encrypted at rest
493
+ - [ ] Cache service bound to localhost or protected by auth and firewall
494
+
495
+ ---
496
+
497
+ ### Infrastructure & Cloud
498
+
499
+ ---
500
+
501
+ #### Containers / Docker
502
+
503
+ **Wooyun-legacy:** `command-execution-checklist.md`
504
+ **Key search terms:** `Docker container escape`, `privileged container escape`, `container breakout`, `Docker socket exposure`
505
+
506
+ | Attack | Description | Detection strategy | SAST |
507
+ |--------|-------------|-------------------|------|
508
+ | Privileged container escape | `--privileged` mounts all host devices | No privileged containers; seccomp/AppArmor enforced | Yes |
509
+ | Docker socket mount | `/var/run/docker.sock` mounted inside container | Docker socket not mounted in containers | Yes |
510
+ | Host PID/network namespace | `--pid=host` or `--network=host` shared | Host namespaces not shared | Yes |
511
+ | Writable host filesystem | Host path mounted writable | Host mounts read-only; sensitive paths excluded | Yes |
512
+ | Capability abuse | `CAP_NET_ADMIN`, `CAP_SYS_PTRACE` etc. granted | Only required capabilities granted; `cap_drop=ALL` as default | Yes |
513
+ | Image with root user | Container runs as root by default | `USER` directive sets non-root user; `runAsNonRoot: true` | Yes |
514
+ | Secrets in image layers | Secrets in `RUN` commands or ENV | Multi-stage builds; secrets via vault/env injection, not image | Yes |
515
+
516
+ **Manual review checklist:**
517
+ - [ ] No containers run with `--privileged` or `--pid=host`
518
+ - [ ] Docker socket not mounted inside containers
519
+ - [ ] `USER` set to non-root in Dockerfile
520
+ - [ ] Secrets not present in image layers (multi-stage builds used)
521
+ - [ ] `cap_drop: ALL` with explicit `cap_add` for required capabilities only
522
+
523
+ ---
524
+
525
+ #### Kubernetes
526
+
527
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `misconfig-checklist.md`
528
+ **Key search terms:** `Kubernetes RBAC privilege escalation`, `Kubernetes secrets exposure`, `pod security policy bypass`, `etcd exposure`
529
+
530
+ | Attack | Description | Detection strategy | SAST |
531
+ |--------|-------------|-------------------|------|
532
+ | RBAC privilege escalation | Overpermissive ClusterRole or `*` verbs | Roles use least privilege; no `*` on resources/verbs | Yes |
533
+ | Service account token auto-mount | Default SA token mounted unnecessarily | `automountServiceAccountToken: false` for pods that don't need it | Yes |
534
+ | Secrets in environment variables | K8s secrets exposed as env vars in plain text | Secrets referenced as volume mounts; external vault used | Yes |
535
+ | etcd access without TLS | etcd accessible on port 2379 without auth | etcd peer/client TLS and auth enforced | No |
536
+ | Admission controller bypass | Mutating webhook not enforced | Admission webhooks cover all namespaces | No |
537
+ | Node escape via hostPath | `hostPath` volume mounts sensitive paths | `hostPath` restricted via admission policy | Yes |
538
+ | Namespace boundary bypass | Pod with cluster-admin escalates across namespaces | Cross-namespace service account bindings audited | Yes |
539
+
540
+ **Manual review checklist:**
541
+ - [ ] All RBAC roles audited for `*` verbs and overpermissive resource access
542
+ - [ ] `automountServiceAccountToken: false` on pods that don't call K8s API
543
+ - [ ] Secrets stored in external vault, not K8s Secrets directly where possible
544
+ - [ ] `hostPath` volumes restricted or prohibited by admission policy
545
+
546
+ ---
547
+
548
+ #### Cloud Metadata / IMDS (AWS, GCP, Azure)
549
+
550
+ **Wooyun-legacy:** `ssrf-checklist.md`
551
+ **Key search terms:** `SSRF cloud metadata`, `AWS IMDSv1 SSRF`, `GCP metadata server SSRF`, `cloud credential theft via SSRF`
552
+
553
+ | Attack | Description | Detection strategy | SAST |
554
+ |--------|-------------|-------------------|------|
555
+ | IMDSv1 credential theft | `http://169.254.169.254/` returns IAM credentials | IMDSv2 enforced (PUT-required token); IMDSv1 disabled | No |
556
+ | GCP metadata server | `http://metadata.google.internal/` fetches SA tokens | SSRF blocklist includes GCP metadata IP and hostname | No |
557
+ | Azure IMDS | `http://169.254.169.254/metadata/identity` | SSRF blocklist includes Azure metadata IP | No |
558
+ | Link-local range bypass | `http://0251.0254.0254.0254/` bypasses IP check | All link-local ranges blocked including octal/hex variants | No |
559
+ | Metadata via DNS rebinding | Attacker hostname resolves to 169.254.169.254 | DNS resolution results validated against SSRF blocklist | No |
560
+
561
+ **Manual review checklist:**
562
+ - [ ] SSRF blocklist includes `169.254.169.254`, `fd00:ec2::254`, `metadata.google.internal`, and Azure IMDS IP
563
+ - [ ] All IP variants (octal, hex, IPv6-mapped) blocked in SSRF protection
564
+ - [ ] IMDSv2 enforced on all EC2 instances (IMDSv1 disabled at instance metadata level)
565
+
566
+ ---
567
+
568
+ #### Serverless / Lambda / FaaS
569
+
570
+ **Wooyun-legacy:** `command-execution-checklist.md`, `ssrf-checklist.md`
571
+ **Key search terms:** `Lambda injection attack`, `serverless security`, `function event injection`, `cold start timing attack`
572
+
573
+ | Attack | Description | Detection strategy | SAST |
574
+ |--------|-------------|-------------------|------|
575
+ | Event data injection | Lambda event fields used as shell/SQL input | Event fields treated as untrusted user input | Yes |
576
+ | Environment variable secret exposure | Secrets in function env vars unencrypted | Secrets fetched from Secrets Manager at runtime, not env vars | Yes |
577
+ | Over-permissive execution role | Lambda role has `*` on S3/DDB/etc. | Execution role scoped to specific resources and actions | No |
578
+ | Function URL without auth | Lambda Function URL allows unauthenticated access | Function URL uses `AuthType: AWS_IAM` or proxy auth | Yes |
579
+ | Dependency in `/tmp` exploitation | Shared `/tmp` between warm invocations | `/tmp` state validated or cleaned between invocations | No |
580
+ | Zip bomb in payload | Large payload causes OOM before processing | Payload size validated before deserialization | Yes |
581
+
582
+ **Manual review checklist:**
583
+ - [ ] All event fields treated as untrusted input (validated before use in queries/commands)
584
+ - [ ] Secrets fetched from Secrets Manager/Parameter Store, not env vars
585
+ - [ ] Execution role uses least-privilege (specific resources and actions)
586
+ - [ ] Function URLs require authentication or are behind a proxy with auth
587
+
588
+ ---
589
+
590
+ #### CI/CD Pipelines (GitHub Actions, Jenkins, CircleCI, GitLab CI)
591
+
592
+ **Wooyun-legacy:** (none directly; see `agentic-actions-auditor` for GitHub Actions)
593
+ **Key search terms:** `CI/CD pipeline injection`, `GitHub Actions injection`, `Jenkins script injection`, `pipeline secret exposure`
594
+
595
+ | Attack | Description | Detection strategy | SAST |
596
+ |--------|-------------|-------------------|------|
597
+ | Expression injection | `${{ github.event.issue.title }}` in `run:` step | Untrusted input only via env vars, never directly in `run:` | Yes |
598
+ | Secrets in logs | `echo $SECRET` in pipeline scripts | Secrets passed as masked env vars; not echoed | Yes |
599
+ | Pull request poisoning | Malicious PR changes CI config to exfiltrate secrets | Secrets restricted to base repo; `pull_request_target` audited | Yes |
600
+ | Artifact tampering | Build artifacts fetched without integrity check | Artifacts verified with hash/signature before use | No |
601
+ | Dependency cache poisoning | Cache restored from untrusted key | Cache keys include lockfile hash; restored cache verified | No |
602
+ | Overpermissive `GITHUB_TOKEN` | Token has write permissions it doesn't need | `permissions:` set to minimum required in each workflow | Yes |
603
+ | Self-hosted runner code execution | Malicious PR runs on self-hosted runner | Self-hosted runners isolated; not used for untrusted PRs | No |
604
+
605
+ **Manual review checklist:**
606
+ - [ ] No untrusted event data (issue title, PR body, committer name) directly in `run:` shell steps
607
+ - [ ] `permissions:` specified and minimal in all workflow files
608
+ - [ ] `pull_request_target` workflows do not check out or execute untrusted PR code
609
+ - [ ] Self-hosted runners not used for workflows triggered by external PRs
610
+
611
+ ---
612
+
613
+ #### Supply Chain / Package Managers
614
+
615
+ **Wooyun-legacy:** (none directly)
616
+ **Key search terms:** `dependency confusion attack`, `typosquatting npm`, `malicious package`, `lockfile integrity`
617
+
618
+ | Attack | Description | Detection strategy | SAST |
619
+ |--------|-------------|-------------------|------|
620
+ | Dependency confusion | Internal package name published to public registry | Private registry scope enforced; public name squatted | No |
621
+ | Typosquatting | Misspelled package name installs malicious code | Dependency names audited; lockfile committed and pinned | No |
622
+ | Lockfile tampering | Lockfile modified to point to malicious version | Lockfile integrity verified in CI (hash/signature) | No |
623
+ | Postinstall script execution | `postinstall` in dependency runs arbitrary code | `ignore-scripts` flag used; scripts audited before use | Yes |
624
+ | Unpinned dependencies | `^1.0.0` allows unexpected minor/patch upgrades | Dependencies pinned to exact versions in lockfile | Yes |
625
+ | Subdependency compromise | Transitive dependency hijacked | Dependency tree audited; SBOM generated | No |
626
+
627
+ **Manual review checklist:**
628
+ - [ ] Lockfile committed and verified in CI
629
+ - [ ] Dependencies pinned to exact versions or hashes
630
+ - [ ] `npm install --ignore-scripts` or equivalent used in CI
631
+ - [ ] Internal package names squatted on public registries
632
+
633
+ ---
634
+
635
+ ### Process & Native Execution
636
+
637
+ ---
638
+
639
+ #### Command / Process Execution
640
+
641
+ **Wooyun-legacy:** `command-execution-checklist.md`, `rce-checklist.md`
642
+ **Key search terms:** `command injection`, `subprocess injection`, `shell injection bypass`, `argument injection`
643
+
644
+ | Attack | Description | Detection strategy | SAST |
645
+ |--------|-------------|-------------------|------|
646
+ | Shell metacharacter injection | `;`, `|`, `&&`, `` ` `` in user input reach shell | `shell=False` (Python), array args (Node), no shell string | Yes |
647
+ | Argument injection | User controls argument that changes program behavior | Argument validated; `--` separator used | Yes |
648
+ | Path injection | User controls executable path | Executable paths hardcoded or validated against allowlist | Yes |
649
+ | Environment variable injection | User controls `PATH` or other env affecting execution | Sanitized environment passed to subprocess | Yes |
650
+ | TOCTOU on executable | Path checked then different binary executed | Execute directly without re-resolving path | No |
651
+
652
+ **Manual review checklist:**
653
+ - [ ] All subprocess calls use array/list arguments, not shell strings with user input
654
+ - [ ] `shell=True` / `sh -c` with user input flagged and removed
655
+ - [ ] Executable paths not constructed from user input
656
+
657
+ ---
658
+
659
+ #### Deserialization (Java, Python, Ruby, PHP, .NET)
660
+
661
+ **Wooyun-legacy:** `rce-checklist.md`
662
+ **Key search terms:** `Java deserialization gadget chain`, `Python pickle RCE`, `PHP unserialize`, `.NET BinaryFormatter`, `Ruby Marshal`
663
+
664
+ | Attack | Description | Detection strategy | SAST |
665
+ |--------|-------------|-------------------|------|
666
+ | Java native deserialization | `ObjectInputStream` with untrusted data | `ObjectInputStream` not used with untrusted data | Yes |
667
+ | Python pickle/marshal | `pickle.loads` / `marshal.loads` on user input | `pickle`/`marshal` not used with user-supplied data | Yes |
668
+ | PHP `unserialize()` | PHP unserialize on user input | `unserialize()` not used with user input; JSON used instead | Yes |
669
+ | .NET BinaryFormatter | BinaryFormatter on untrusted data | BinaryFormatter disabled; `System.Text.Json` or protobuf used | Yes |
670
+ | YAML unsafe load | `yaml.load()` without `Loader=SafeLoader` | `yaml.safe_load()` used everywhere | Yes |
671
+ | Ruby `Marshal.load` | Marshal on untrusted data | `Marshal.load` not used with user data | Yes |
672
+
673
+ **Manual review checklist:**
674
+ - [ ] `pickle.loads`, `marshal.loads`, `yaml.load` (without SafeLoader) not called with user data
675
+ - [ ] Java `ObjectInputStream` not used with untrusted data
676
+ - [ ] PHP `unserialize()` not called with user input
677
+ - [ ] YAML parsing uses safe loader everywhere
678
+
679
+ ---
680
+
681
+ #### FFI / Native Bindings / Memory Safety
682
+
683
+ **Wooyun-legacy:** `rce-checklist.md`
684
+ **Key search terms:** `FFI buffer overflow`, `use-after-free FFI`, `unsafe Rust`, `CGo security`, `ctypes vulnerability`
685
+
686
+ | Attack | Description | Detection strategy | SAST |
687
+ |--------|-------------|-------------------|------|
688
+ | Buffer overflow via FFI | Caller passes too-large input to native function | Length validated before passing to native code | Partial |
689
+ | Use-after-free | Native reference used after Rust/C GC | Ownership/lifetime enforced; no raw pointer aliasing | Partial |
690
+ | Integer overflow in size calculation | `len * 4` overflows into small allocation | Checked arithmetic used for size calculations | Yes |
691
+ | Unsafe Rust block misuse | `unsafe {}` used unnecessarily or unsafely | `unsafe` blocks audited and minimized | Yes |
692
+ | Null pointer dereference | Null passed to non-nullable native parameter | Null checks before FFI calls | Yes |
693
+
694
+ **Manual review checklist:**
695
+ - [ ] All FFI calls validate buffer lengths before passing to native code
696
+ - [ ] `unsafe` Rust blocks documented with safety invariants
697
+ - [ ] CGo pointers obey CGo rules (no Go pointer in C-allocated memory)
698
+
699
+ ---
700
+
701
+ ### AI / ML Systems
702
+
703
+ ---
704
+
705
+ #### LLM / AI Integration (Prompt Injection)
706
+
707
+ **Wooyun-legacy:** (none directly)
708
+ **Key search terms:** `prompt injection attack`, `indirect prompt injection`, `LLM jailbreak`, `AI agent tool call injection`, `system prompt extraction`
709
+
710
+ | Attack | Description | Detection strategy | SAST |
711
+ |--------|-------------|-------------------|------|
712
+ | Direct prompt injection | User input overrides system prompt | User input separated from system prompt; role distinction enforced | No |
713
+ | Indirect prompt injection | LLM reads attacker-controlled external content that injects instructions | External content treated as data, not instructions; structured output enforced | No |
714
+ | Tool call injection | Injected instruction triggers unintended tool/action | Tool calls validated against expected schema; user confirmation for sensitive actions | No |
715
+ | System prompt extraction | User extracts system prompt via clever prompting | System prompt not referenced in context; input/output filtering | No |
716
+ | Insecure output handling | LLM output rendered directly as HTML/code | LLM output sanitized before rendering; not passed to `eval` | Yes |
717
+ | Training data extraction | PII or secrets recoverable from model outputs | Sensitive data excluded from training; output filtering | No |
718
+ | Excessive agency | Agent takes irreversible actions without confirmation | Human-in-the-loop for sensitive operations; action scope limited | No |
719
+
720
+ **Manual review checklist:**
721
+ - [ ] User-supplied content never concatenated directly into system prompt
722
+ - [ ] LLM output never passed to `eval`, `exec`, shell, or rendered as raw HTML
723
+ - [ ] Tool calls with destructive/irreversible effects require explicit confirmation
724
+ - [ ] External content (web pages, documents, emails) processed in a restricted context that cannot override system instructions
725
+
726
+ ---
727
+
728
+ #### ML Model Loading (Pickle, ONNX, TensorFlow SavedModel)
729
+
730
+ **Wooyun-legacy:** `rce-checklist.md`
731
+ **Key search terms:** `pickle model RCE`, `ONNX model injection`, `TensorFlow SavedModel security`, `Hugging Face model security`
732
+
733
+ | Attack | Description | Detection strategy | SAST |
734
+ |--------|-------------|-------------------|------|
735
+ | Pickle-based model RCE | `torch.load`, `joblib.load` execute arbitrary code | `weights_only=True` (PyTorch 2.0+); safe format used | Yes |
736
+ | ONNX custom op injection | ONNX model loads attacker-controlled custom operator | Models validated against allowlist before loading | No |
737
+ | TensorFlow lambda injection | `tf.keras.models.load_model` with lambda layers | `safe_mode=True` enforced; lambda layers disabled | Yes |
738
+ | Model from untrusted source | Model downloaded without integrity check | Model hash/signature verified before load | No |
739
+ | Hugging Face model execution | `from_pretrained` loads untrusted model with `trust_remote_code=True` | `trust_remote_code=False` (default); model source verified | Yes |
740
+
741
+ **Manual review checklist:**
742
+ - [ ] `torch.load` uses `weights_only=True` for all user-supplied model files
743
+ - [ ] `trust_remote_code=False` for all Hugging Face `from_pretrained` calls
744
+ - [ ] Model files from external sources verified by hash before loading
745
+ - [ ] `tf.keras.models.load_model` uses `safe_mode=True`
746
+
747
+ ---
748
+
749
+ ### Protocol-Level
750
+
751
+ ---
752
+
753
+ #### HTTP Client / Server
754
+
755
+ **Wooyun-legacy:** `ssrf-checklist.md`, `misconfig-checklist.md`, `path-traversal-checklist.md`
756
+ **Key search terms:** `HTTP request smuggling CL.TE`, `CRLF injection HTTP`, `hop-by-hop header abuse`
757
+
758
+ | Attack | Description | Detection strategy | SAST |
759
+ |--------|-------------|-------------------|------|
760
+ | CL.TE / TE.CL request smuggling | Proxy and backend disagree on body framing | Server rejects requests with both CL and TE; proxy/backend agree | No |
761
+ | CRLF injection | `\r\n` in header value enables response splitting | Header values stripped of CR/LF before writing | Yes |
762
+ | Host header injection | Host used in redirect/URL construction without validation | Host validated against allowlist before use | Yes |
763
+ | Hop-by-hop header abuse | `Connection` header removes security headers at proxy | Security headers not removable via hop-by-hop | No |
764
+ | HTTP/2 desync | H2 pseudo-headers mapped to H1 inconsistently | H2-to-H1 downgrade strips or validates pseudo-headers | No |
765
+ | HTTP method override | `_method` or `X-HTTP-Method-Override` bypasses restrictions | Method override headers disabled or restricted | Yes |
766
+
767
+ **Manual review checklist:**
768
+ - [ ] Header values with user input stripped of `\r\n`
769
+ - [ ] Server rejects ambiguous requests with both Content-Length and Transfer-Encoding
770
+ - [ ] Host header validated before use in redirects or URL construction
771
+ - [ ] `X-HTTP-Method-Override` disabled or restricted to trusted clients
772
+
773
+ ---
774
+
775
+ #### gRPC
776
+
777
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`
778
+ **Key search terms:** `gRPC metadata injection`, `gRPC reflection abuse`, `gRPC channel security`
779
+
780
+ | Attack | Description | Detection strategy | SAST |
781
+ |--------|-------------|-------------------|------|
782
+ | Metadata injection | Attacker-controlled metadata forwarded downstream | Metadata sanitized or allowlisted before forwarding | Partial |
783
+ | Unauthenticated reflection | Schema exposed to unauthenticated callers | Reflection disabled or authenticated | Yes |
784
+ | Insecure channel | gRPC channel configured without TLS | TLS credentials required; `insecure.NewCredentials()` flagged | Yes |
785
+ | Missing per-RPC auth | Channel-level auth skips per-call validation | Every RPC handler validates caller identity | Yes |
786
+
787
+ **Manual review checklist:**
788
+ - [ ] gRPC reflection disabled in production or behind authentication
789
+ - [ ] All channels use TLS credentials
790
+ - [ ] Per-call metadata sanitized before forwarding
791
+
792
+ ---
793
+
794
+ #### GraphQL
795
+
796
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `ssrf-checklist.md`
797
+ **Key search terms:** `GraphQL introspection abuse`, `GraphQL batching attack`, `GraphQL field authorization bypass`
798
+
799
+ | Attack | Description | Detection strategy | SAST |
800
+ |--------|-------------|-------------------|------|
801
+ | Introspection leakage | Full schema exposed unauthenticated | Introspection disabled in production | Yes |
802
+ | Nested query DoS | Deeply nested queries cause exponential load | Query depth and complexity limits enforced | Yes |
803
+ | Field-level authorization bypass | Root resolver auth but no field-level check | Every field resolver validates permissions | No |
804
+ | Batching / alias rate limit evasion | Multiple ops in one request bypass rate limiting | Per-operation rate limiting; alias count bounded | No |
805
+ | SSRF via URL inputs | Mutations accept URL arguments fetched server-side | URL inputs validated against SSRF allowlist | Yes |
806
+
807
+ **Manual review checklist:**
808
+ - [ ] Introspection disabled in production (or behind authentication)
809
+ - [ ] Query depth limit (≤10) and complexity budget enforced
810
+ - [ ] Every field resolver validates caller authorization
811
+
812
+ ---
813
+
814
+ #### WebSocket
815
+
816
+ **Wooyun-legacy:** `csrf-checklist.md`, `unauthorized-access-checklist.md`
817
+ **Key search terms:** `WebSocket CSWSH cross-site hijacking`, `WebSocket origin validation`
818
+
819
+ | Attack | Description | Detection strategy | SAST |
820
+ |--------|-------------|-------------------|------|
821
+ | Cross-Site WebSocket Hijacking | Browser sends cookies; no CSRF protection on upgrade | `Origin` header validated against allowlist on upgrade | Yes |
822
+ | Unauthenticated first message | Connection accepted before auth validated | First message validated for auth token | Yes |
823
+ | Message injection | User-controlled data injected into WS frame stream | Input validated before broadcast | Yes |
824
+
825
+ **Manual review checklist:**
826
+ - [ ] `Origin` header validated against explicit allowlist on every WebSocket upgrade
827
+ - [ ] Authentication validated within first message after upgrade
828
+ - [ ] Message size limits enforced
829
+
830
+ ---
831
+
832
+ #### XML / SOAP
833
+
834
+ **Wooyun-legacy:** `xxe-checklist.md`, `ssrf-checklist.md`
835
+ **Key search terms:** `XXE external entity`, `XML billion laughs`, `XPath injection`, `SOAP action spoofing`
836
+
837
+ | Attack | Description | Detection strategy | SAST |
838
+ |--------|-------------|-------------------|------|
839
+ | XML External Entity (XXE) | DTD external entity for SSRF or file read | Parser disables external entities and DTD | Yes |
840
+ | Billion laughs | Recursive entity expansion causes DoS | Entity expansion bounded; SAX parser used | Yes |
841
+ | XPath injection | User input concatenated into XPath | Parameterized XPath or allowlist used | Yes |
842
+ | SOAP action spoofing | SOAPAction header overrides operation | SOAPAction validated against allowed list | Yes |
843
+
844
+ **Manual review checklist:**
845
+ - [ ] XML parser has external entity resolution disabled
846
+ - [ ] DTD processing disabled
847
+ - [ ] XPath expressions use parameterized queries
848
+
849
+ ---
850
+
851
+ #### TLS / mTLS
852
+
853
+ **Wooyun-legacy:** `misconfig-checklist.md`
854
+ **Key search terms:** `TLS certificate validation bypass`, `hostname verification disabled`, `mTLS bypass`
855
+
856
+ | Attack | Description | Detection strategy | SAST |
857
+ |--------|-------------|-------------------|------|
858
+ | Hostname verification disabled | `InsecureSkipVerify: true` | Hostname verification never disabled | Yes |
859
+ | mTLS auth bypass | Client cert required in config but not checked in handler | Handler verifies `VerifiedChains` non-empty | Yes |
860
+ | Protocol downgrade | TLS 1.0/1.1/SSLv3 accepted | Minimum TLS 1.2 or 1.3 enforced | Yes |
861
+ | Weak cipher suite | RC4, DES, 3DES, export ciphers accepted | Cipher suite explicitly restricted | Yes |
862
+
863
+ **Manual review checklist:**
864
+ - [ ] `InsecureSkipVerify` never set to `true`
865
+ - [ ] TLS minimum version is 1.2 or 1.3
866
+ - [ ] mTLS handlers verify `VerifiedChains` is non-empty
867
+
868
+ ---
869
+
870
+ #### SAML
871
+
872
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `xxe-checklist.md`
873
+ **Key search terms:** `SAML XML signature wrapping`, `SAML assertion forgery`, `SAML roundtrip attack`
874
+
875
+ | Attack | Description | Detection strategy | SAST |
876
+ |--------|-------------|-------------------|------|
877
+ | XML Signature Wrapping (XSW) | Signed element moved; unsigned clone used | Assertion extraction on same node as sig verification | Partial |
878
+ | Comment injection | XML comment splits identity | Username extraction strips XML comments | Yes |
879
+ | Unsigned assertion acceptance | SP accepts without valid signature | Every code path requires valid sig | Yes |
880
+ | InResponseTo bypass | Response replayed by omitting InResponseTo | SP validates InResponseTo against issued IDs | Yes |
881
+ | XXE via SAML parser | DTD-based SSRF via XML parser | Parser entity resolution disabled | Yes |
882
+
883
+ **Manual review checklist:**
884
+ - [ ] Assertion extraction uses same node reference as signature verification
885
+ - [ ] InResponseTo validated and tracked for replay prevention
886
+ - [ ] Parser entity resolution and DTD processing disabled
887
+ - [ ] NameID extracted after signature validation
888
+
889
+ ---
890
+
891
+ #### DNS
892
+
893
+ **Wooyun-legacy:** `ssrf-checklist.md`
894
+ **Key search terms:** `DNS rebinding attack`, `DNS TOCTOU`, `SSRF via DNS`
895
+
896
+ | Attack | Description | Detection strategy | SAST |
897
+ |--------|-------------|-------------------|------|
898
+ | DNS rebinding | Hostname resolves to internal IP on re-lookup | Resolved IP validated against SSRF blocklist at connection time | No |
899
+ | TOCTOU DNS | IP changes between check and connection | IP pinned at lookup time; no re-resolve | No |
900
+
901
+ **Manual review checklist:**
902
+ - [ ] IPs from user-controlled hostnames validated against SSRF blocklist at connection time
903
+ - [ ] DNS results not re-resolved between security check and connection
904
+
905
+ ---
906
+
907
+ #### SMTP / Email
908
+
909
+ **Wooyun-legacy:** `ssrf-checklist.md`, `xss-checklist.md`
910
+ **Key search terms:** `email header injection`, `SMTP CRLF injection`, `open mail relay`
911
+
912
+ | Attack | Description | Detection strategy | SAST |
913
+ |--------|-------------|-------------------|------|
914
+ | Header injection | User input in To/Subject with CRLF | Header values stripped of `\r\n` | Yes |
915
+ | Open relay | Server forwards for arbitrary recipients | Relay restricted to authenticated senders | Yes |
916
+ | HTML email XSS | HTML email with unescaped user content | HTML sanitized in email templates | Yes |
917
+
918
+ **Manual review checklist:**
919
+ - [ ] All email header values stripped of `\r\n`
920
+ - [ ] Email relay restricted to authenticated users and known domains
921
+ - [ ] HTML email content sanitized with allowlist sanitizer
922
+
923
+ ---
924
+
925
+ #### LDAP
926
+
927
+ **Wooyun-legacy:** `sql-injection-checklist.md`, `unauthorized-access-checklist.md`
928
+ **Key search terms:** `LDAP injection`, `LDAP null bind`, `LDAP authentication bypass`
929
+
930
+ | Attack | Description | Detection strategy | SAST |
931
+ |--------|-------------|-------------------|------|
932
+ | LDAP injection | User input in filter without RFC 4515 escaping | LDAP filter values properly escaped | Yes |
933
+ | Null/anonymous bind | Empty password accepted by LDAP server | Empty credential rejected before bind | Yes |
934
+ | DN injection | User input in distinguished name construction | DN components escaped per RFC 4514 | Yes |
935
+
936
+ **Manual review checklist:**
937
+ - [ ] LDAP filter special characters escaped per RFC 4515
938
+ - [ ] Empty passwords rejected application-side before bind attempt
939
+
940
+ ---
941
+
942
+ #### SSH
943
+
944
+ **Wooyun-legacy:** `misconfig-checklist.md`, `unauthorized-access-checklist.md`
945
+ **Key search terms:** `SSH host key verification bypass`, `SSH agent forwarding abuse`, `weak SSH key`
946
+
947
+ | Attack | Description | Detection strategy | SAST |
948
+ |--------|-------------|-------------------|------|
949
+ | Host key verification disabled | `StrictHostKeyChecking no` | Verification always enabled | Yes |
950
+ | Agent forwarding abuse | Lateral movement via forwarded agent | Agent forwarding disabled by default | Yes |
951
+ | Weak key algorithm | RSA-1024 or DSA keys | Ed25519 or RSA ≥ 3072 required | Yes |
952
+
953
+ **Manual review checklist:**
954
+ - [ ] Host key verification always enabled
955
+ - [ ] Agent forwarding disabled by default
956
+ - [ ] Key algorithms restricted to Ed25519 or RSA ≥ 3072
957
+
958
+ ---
959
+
960
+ #### MQTT / IoT Protocols (MQTT, CoAP, AMQP, Modbus)
961
+
962
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`, `misconfig-checklist.md`
963
+ **Key search terms:** `MQTT security`, `MQTT topic injection`, `CoAP security`, `Modbus unauthorized access`
964
+
965
+ | Attack | Description | Detection strategy | SAST |
966
+ |--------|-------------|-------------------|------|
967
+ | MQTT anonymous access | Broker allows connections without credentials | Authentication required; anonymous access disabled | No |
968
+ | Topic wildcard injection | User controls topic containing `#` or `+` wildcards | Topic names validated; wildcards disallowed in user input | Yes |
969
+ | MQTT topic ACL bypass | Client subscribes to topics outside its authorization | Per-client ACL enforced by broker | No |
970
+ | Unauthenticated CoAP | CoAP endpoints without DTLS | DTLS required for all CoAP connections | No |
971
+ | Modbus unauthorized write | Modbus coil/register write without auth | Write access restricted by device configuration | No |
972
+ | Firmware update without verification | OTA update accepted without signature check | Update packages verified with signature before installation | No |
973
+
974
+ **Manual review checklist:**
975
+ - [ ] MQTT broker requires authentication; anonymous access disabled
976
+ - [ ] Topic names from user input validated; wildcards (`#`, `+`) blocked
977
+ - [ ] OTA firmware updates verified with signature before installation
978
+ - [ ] DTLS enforced for CoAP endpoints
979
+
980
+ ---
981
+
982
+ ### Cryptography
983
+
984
+ ---
985
+
986
+ #### Cryptographic Primitives
987
+
988
+ **Wooyun-legacy:** `misconfig-checklist.md`
989
+ **Key search terms:** `nonce reuse IV attack`, `ECB mode attack`, `padding oracle`, `timing side-channel`, `weak PRNG`
990
+
991
+ | Attack | Description | Detection strategy | SAST |
992
+ |--------|-------------|-------------------|------|
993
+ | IV/nonce reuse | Same nonce with AES-GCM or stream cipher | Nonce random or counter-based; never reused | Yes |
994
+ | ECB mode | ECB leaks block patterns | ECB never used for confidentiality | Yes |
995
+ | Padding oracle | CBC padding error reveals plaintext | AEAD mode used; padding errors indistinguishable | Yes |
996
+ | Hardcoded key | Encryption key in source | Keys loaded from secret store | Yes |
997
+ | Weak PRNG | `Math.random()` / `rand()` for security values | `crypto/rand` or CSPRNG used | Yes |
998
+ | Non-constant-time comparison | Timing attack on secret comparison | `hmac.Equal()` / `crypto/subtle.ConstantTimeCompare()` | Yes |
999
+ | Short key length | RSA < 2048, ECDSA < 256, AES < 128 | Key lengths validated at initialization | Yes |
1000
+
1001
+ **Manual review checklist:**
1002
+ - [ ] AES-GCM or ChaCha20-Poly1305 used (not ECB, CBC without MAC)
1003
+ - [ ] Nonces generated with CSPRNG and never reused
1004
+ - [ ] Secret comparisons use constant-time functions
1005
+ - [ ] Keys loaded from secret store, never hardcoded
1006
+ - [ ] Weak PRNG never used for tokens, nonces, or IDs
1007
+
1008
+ ---
1009
+
1010
+ #### Key Management
1011
+
1012
+ **Wooyun-legacy:** `misconfig-checklist.md`
1013
+ **Key search terms:** `key rotation bypass`, `key wrapping attack`, `HSM bypass`, `KMS misuse`
1014
+
1015
+ | Attack | Description | Detection strategy | SAST |
1016
+ |--------|-------------|-------------------|------|
1017
+ | Key material in source code | Private keys committed to repo | Keys loaded from vault/KMS; never hardcoded | Yes |
1018
+ | Missing key rotation | Long-lived keys never rotated | Key rotation schedule enforced; old key versions disabled | No |
1019
+ | Overpermissive KMS policy | Any principal can decrypt with CMK | KMS key policy restricts to specific principals and actions | No |
1020
+ | Key derivation without salt | PBKDF without per-key salt allows rainbow tables | Unique salt per key derivation | Yes |
1021
+ | Envelope encryption bypass | Data key cached in plaintext indefinitely | Data key TTL enforced; cached key re-encrypted periodically | No |
1022
+
1023
+ **Manual review checklist:**
1024
+ - [ ] No private keys or secrets committed to source repository
1025
+ - [ ] KMS key policies restricted to minimum required principals
1026
+ - [ ] PBKDF uses unique per-derivation salt
1027
+
1028
+ ---
1029
+
1030
+ ### Serialization & Formats
1031
+
1032
+ ---
1033
+
1034
+ #### Serialization Formats (protobuf, msgpack, CBOR, Avro, Thrift)
1035
+
1036
+ **Wooyun-legacy:** `rce-checklist.md`
1037
+ **Key search terms:** `protobuf deserialization vulnerability`, `msgpack type confusion`, `CBOR parsing attack`
1038
+
1039
+ | Attack | Description | Detection strategy | SAST |
1040
+ |--------|-------------|-------------------|------|
1041
+ | Schema evolution confusion | Old/new schema version parse same bytes differently | Schema version enforced; unknown fields rejected | No |
1042
+ | Type confusion | Integer vs string triggers unexpected path | Strict type validation after deserialization | Yes |
1043
+ | Integer overflow in length field | Malformed length triggers buffer overread | Length field bounds-checked before allocation | Yes |
1044
+ | Deep nesting DoS | Stack overflow via nested messages | Recursion/nesting depth limited | Partial |
1045
+
1046
+ **Manual review checklist:**
1047
+ - [ ] Unknown fields rejected or ignored (not passed through)
1048
+ - [ ] Nesting/recursion depth bounded
1049
+ - [ ] Message size bounded before deserialization begins
1050
+
1051
+ ---
1052
+
1053
+ #### Compression (zip, gzip, zlib, brotli)
1054
+
1055
+ **Wooyun-legacy:** `path-traversal-checklist.md`, `ssrf-checklist.md`
1056
+ **Key search terms:** `zip bomb`, `zip slip path traversal`, `decompression bomb`
1057
+
1058
+ | Attack | Description | Detection strategy | SAST |
1059
+ |--------|-------------|-------------------|------|
1060
+ | Zip slip | Archive entry path traverses outside target directory | Extracted path confined to target directory | Yes |
1061
+ | Decompression bomb | Tiny input expands to gigabytes | Decompressed size bounded before reading | Yes |
1062
+ | Zip entry name injection | Entry name contains null bytes or special chars | Entry names sanitized before use in file ops | Yes |
1063
+
1064
+ **Manual review checklist:**
1065
+ - [ ] Extracted file paths normalized and confined to target directory
1066
+ - [ ] Decompressed size bounded (ratio check and absolute limit)
1067
+ - [ ] Archive entry count bounded
1068
+
1069
+ ---
1070
+
1071
+ ### Mobile & Browser
1072
+
1073
+ ---
1074
+
1075
+ #### Browser Extensions / Content Scripts
1076
+
1077
+ **Wooyun-legacy:** `xss-checklist.md`
1078
+ **Key search terms:** `browser extension security`, `content script XSS`, `chrome extension privilege escalation`, `postMessage injection`
1079
+
1080
+ | Attack | Description | Detection strategy | SAST |
1081
+ |--------|-------------|-------------------|------|
1082
+ | `postMessage` injection | Content script trusts messages from any origin | `event.origin` validated before processing postMessage | Yes |
1083
+ | Content script XSS | Content script injects unsanitized DOM content | Content script never uses `innerHTML` with page data | Yes |
1084
+ | Manifest permission over-request | Extension requests `<all_urls>` unnecessarily | Permissions minimized in manifest; no `*` host permissions | Yes |
1085
+ | Background page CSRF | Extension background page acts on any cross-origin message | Message source validated; sensitive actions require explicit permission | Yes |
1086
+ | Content Security Policy bypass | Extension weakens CSP with `unsafe-eval` | `unsafe-eval` not in extension CSP | Yes |
1087
+
1088
+ **Manual review checklist:**
1089
+ - [ ] `postMessage` handlers validate `event.origin` before processing
1090
+ - [ ] Content scripts never use `innerHTML`, `outerHTML`, `document.write` with untrusted data
1091
+ - [ ] Extension manifest requests minimum required permissions
1092
+ - [ ] `unsafe-eval` absent from extension Content Security Policy
1093
+
1094
+ ---
1095
+
1096
+ #### Mobile Deep Links / URL Schemes (Android, iOS)
1097
+
1098
+ **Wooyun-legacy:** `unauthorized-access-checklist.md`
1099
+ **Key search terms:** `Android deep link hijacking`, `iOS URL scheme hijacking`, `Universal Links bypass`, `intent scheme attack`
1100
+
1101
+ | Attack | Description | Detection strategy | SAST |
1102
+ |--------|-------------|-------------------|------|
1103
+ | Deep link hijacking | Malicious app registers same custom URL scheme | Universal Links (iOS) / App Links (Android) used; custom schemes avoided | No |
1104
+ | Intent data injection | Deep link intent data used in sensitive operations | Intent data validated before use in queries/navigation | Yes |
1105
+ | OAuth redirect via deep link | OAuth callback routed to custom scheme | App Link / Universal Link used for OAuth callbacks | No |
1106
+ | WebView deep link bypass | Deep link opens untrusted URL in WebView | URL allowlisted before opening in WebView | Yes |
1107
+ | Fragment injection | URI fragment used in authentication state | Fragment data validated and sanitized | Yes |
1108
+
1109
+ **Manual review checklist:**
1110
+ - [ ] Custom URL schemes not used for OAuth callbacks; App Links / Universal Links used instead
1111
+ - [ ] All deep link intent data validated before use in navigation or queries
1112
+ - [ ] WebView URL allowlisted before loading deep link destinations
1113
+
1114
+ ---
1115
+
1116
+ ## Notes for threat-modeler
1117
+
1118
+ - Run Mode C in parallel with Mode A and Mode B when they overlap. Do not skip Mode A/B because
1119
+ Mode C is being run.
1120
+ - **Token budget**: bound each domain research to one `last30days` call, one `wooyun-legacy` read,
1121
+ and 3-5 web searches. Do not research more than 5 domains in depth in a single session without
1122
+ explicit user instruction. Prioritize by relevance to high-risk DFD/CFD slices.
1123
+ - When MCP tools are unavailable, `WebSearch` + `WebFetch` of top 2-3 results is sufficient.
1124
+ - The attack taxonomy produced here is the primary input for Phase 4 custom SAST rule generation
1125
+ and Phase 9 spec gap analysis. Quality over quantity — a focused 5-item checklist is more useful
1126
+ than an exhaustive 30-item generic list.
1127
+ - Record which research sources were used in the `## Domain Attack Research` section for auditability.
1128
+ - **Domain identification is exhaustive, not exclusive**: a single project may trigger 5+ domains.
1129
+ Triage by DFD slice criticality — research domains that appear in high-risk flows first.