@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,603 @@
|
|
|
1
|
+
# Authorization Security
|
|
2
|
+
|
|
3
|
+
> Expertise module for AI agents — use during planning and implementation to enforce
|
|
4
|
+
> secure authorization by default. Broken Access Control is OWASP #1 (A01:2021/2025).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Threat Landscape
|
|
9
|
+
|
|
10
|
+
Authorization — deciding *what* an authenticated identity may do — is the most
|
|
11
|
+
exploited vulnerability class. OWASP found 94% of applications had some form of broken
|
|
12
|
+
access control (318k+ occurrences). It rose from #5 (2017) to #1 (2021) and holds that
|
|
13
|
+
rank in the 2025 release candidate.
|
|
14
|
+
|
|
15
|
+
Authorization flaws are *logic bugs*: each app defines its own permission model, and
|
|
16
|
+
any gap between intended and enforced policy is exploitable. WAFs cannot catch them.
|
|
17
|
+
|
|
18
|
+
### Attack Classes
|
|
19
|
+
|
|
20
|
+
| Attack | Direction | Description |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| **IDOR** | Horizontal | Change object ID to access another user's resource |
|
|
23
|
+
| **Horizontal privilege escalation** | Horizontal | Access peer accounts at the same privilege level |
|
|
24
|
+
| **Vertical privilege escalation** | Vertical | Elevate from user to admin/service account |
|
|
25
|
+
| **BFLA** (Broken Function-Level Authz) | Vertical | Call admin endpoints as a regular user |
|
|
26
|
+
| **BOLA** (Broken Object-Level Authz) | Horizontal | API variant of IDOR — OWASP API Security #1 since 2019 |
|
|
27
|
+
| **Mass assignment** | Both | Bind untrusted input to internal fields (`isAdmin`, `role`, `balance`) |
|
|
28
|
+
| **Forced browsing** | Vertical | Guess/enumerate URLs to unprotected admin pages |
|
|
29
|
+
| **Path traversal for access** | Horizontal | `../` sequences to escape authorized directories |
|
|
30
|
+
| **Parameter tampering** | Both | Modify hidden fields, cookies, or query params carrying authz decisions |
|
|
31
|
+
|
|
32
|
+
### Real-World Breaches
|
|
33
|
+
|
|
34
|
+
**Facebook Access Token Breach (Sep 2018):** Three bugs in the "View As" feature let
|
|
35
|
+
attackers steal access tokens for ~50M accounts. Tokens granted full account takeover
|
|
36
|
+
including third-party apps using Facebook Login. Root cause: the video uploader
|
|
37
|
+
generated tokens with the *viewed user's* permissions instead of the viewer's. Facebook
|
|
38
|
+
reset tokens for 90M accounts. (Source: Facebook Security Update, Sep 2018; NPR, EFF)
|
|
39
|
+
|
|
40
|
+
**Parler Data Scrape (Jan 2021):** Sequential numeric IDs, no authentication, no rate
|
|
41
|
+
limiting on API endpoints. A researcher incremented `/v1/photo?id=N` to download 70 TB
|
|
42
|
+
of data including posts, GPS-tagged videos, and government IDs from the "Verified
|
|
43
|
+
Citizen" program. Textbook IDOR. (Source: Salt Security, CyberNews, TechCrunch)
|
|
44
|
+
|
|
45
|
+
**Kia Dealer Portal (Jun 2024):** Researchers could remotely take over any post-2013
|
|
46
|
+
Kia vehicle using only a license plate number. Weak ownership verification allowed
|
|
47
|
+
querying PII and silently registering as a second vehicle user, gaining remote
|
|
48
|
+
lock/unlock/start in ~30 seconds. Patched Aug 2024. (Source: Sam Curry, Malwarebytes)
|
|
49
|
+
|
|
50
|
+
**Other notable incidents:** GitHub mass assignment (2012) — SSH key injected into any
|
|
51
|
+
org. ZITADEL IDOR (CVE-2025-27507, CVSS 9.0). KubeSphere IDOR (CVE-2024-46528).
|
|
52
|
+
Moodle badges IDOR (CVE-2024-48899).
|
|
53
|
+
|
|
54
|
+
### Trends
|
|
55
|
+
|
|
56
|
+
- BOLA accounts for ~40% of all API attacks.
|
|
57
|
+
- IDOR represents 15-36% of bug bounty payouts depending on industry.
|
|
58
|
+
- API-centric architectures and multi-tenant SaaS amplify the surface.
|
|
59
|
+
- Authorization flaws are increasingly chained with SSRF, JWT manipulation for impact.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 2. Core Security Principles
|
|
64
|
+
|
|
65
|
+
**Deny by default.** Every request denied unless an explicit policy grants access.
|
|
66
|
+
Never rely on the absence of a deny rule — require the presence of an allow rule.
|
|
67
|
+
|
|
68
|
+
**Least privilege.** Grant the minimum permissions for the minimum duration. Service
|
|
69
|
+
accounts get scoped permissions. API tokens carry only needed scopes. DB connections
|
|
70
|
+
use restricted roles. Temporary elevation expires automatically.
|
|
71
|
+
|
|
72
|
+
**Separation of duties.** No single role controls a full critical workflow. The user
|
|
73
|
+
who creates a payment should not approve it. Code authors should not deploy to prod.
|
|
74
|
+
|
|
75
|
+
**Server-side enforcement is non-negotiable.** Client-side checks (hidden buttons,
|
|
76
|
+
disabled fields) are UX, not security. An attacker with a proxy bypasses them all.
|
|
77
|
+
|
|
78
|
+
### Authorization Model Comparison
|
|
79
|
+
|
|
80
|
+
| Model | Mechanism | Best For | Weakness |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| **RBAC** | Roles carry permissions | Stable org structures | Role explosion |
|
|
83
|
+
| **ABAC** | Evaluate user/resource/env attributes | Dynamic, context-aware decisions | Complex policy authoring |
|
|
84
|
+
| **ReBAC** | Permissions from entity relationships | Doc sharing, social, hierarchies | Requires relationship graph |
|
|
85
|
+
| **Hybrid** | Roles baseline + attributes refine + relationships scope | Enterprise SaaS | Higher complexity |
|
|
86
|
+
|
|
87
|
+
Start with RBAC. Add ABAC for dynamic conditions (time, IP, risk). Add ReBAC when
|
|
88
|
+
permissions depend on entity relationships (org hierarchy, sharing, teams).
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. Implementation Patterns
|
|
93
|
+
|
|
94
|
+
### 3.1 RBAC Implementation (TypeScript)
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
const PERMISSIONS = {
|
|
98
|
+
'document:read': ['viewer', 'editor', 'admin'],
|
|
99
|
+
'document:write': ['editor', 'admin'],
|
|
100
|
+
'document:delete': ['admin'],
|
|
101
|
+
'user:manage': ['admin'],
|
|
102
|
+
} as const;
|
|
103
|
+
|
|
104
|
+
type Permission = keyof typeof PERMISSIONS;
|
|
105
|
+
type Role = 'viewer' | 'editor' | 'admin';
|
|
106
|
+
|
|
107
|
+
function hasPermission(roles: Role[], perm: Permission): boolean {
|
|
108
|
+
return roles.some(r => PERMISSIONS[perm].includes(r));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function requirePermission(perm: Permission) {
|
|
112
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
113
|
+
if (!req.user || !hasPermission(req.user.roles, perm))
|
|
114
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
115
|
+
next();
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
app.delete('/api/documents/:id', requireAuth, requirePermission('document:delete'), ctrl.delete);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 3.2 ABAC with OPA/Rego
|
|
123
|
+
|
|
124
|
+
```rego
|
|
125
|
+
package authz
|
|
126
|
+
default allow := false
|
|
127
|
+
|
|
128
|
+
allow {
|
|
129
|
+
input.action == "read"
|
|
130
|
+
input.user.department == input.resource.department
|
|
131
|
+
input.user.clearance_level >= input.resource.classification_level
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
allow {
|
|
135
|
+
input.action == "write"
|
|
136
|
+
input.user.role == "editor"
|
|
137
|
+
input.environment.hour >= 9; input.environment.hour < 17
|
|
138
|
+
net.cidr_contains("10.0.0.0/8", input.environment.source_ip)
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Casbin** uses model-policy separation. Model defines the pattern (ACL/RBAC/ABAC);
|
|
143
|
+
policy defines rules. Policies stored in files, MySQL, Postgres, MongoDB, Redis, S3.
|
|
144
|
+
|
|
145
|
+
### 3.3 Row-Level Security (PostgreSQL)
|
|
146
|
+
|
|
147
|
+
```sql
|
|
148
|
+
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
|
|
149
|
+
|
|
150
|
+
-- Tenant isolation
|
|
151
|
+
CREATE POLICY tenant_isolation ON documents
|
|
152
|
+
USING (tenant_id = current_setting('app.current_tenant')::uuid);
|
|
153
|
+
|
|
154
|
+
-- Role-based: admins see all, users see own
|
|
155
|
+
CREATE POLICY user_documents ON documents FOR SELECT
|
|
156
|
+
USING (
|
|
157
|
+
owner_id = current_setting('app.current_user_id')::uuid
|
|
158
|
+
OR current_setting('app.current_role') = 'admin'
|
|
159
|
+
);
|
|
160
|
+
-- CRITICAL: Superusers bypass RLS. Always connect as a restricted role.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 3.4 Resource-Based Authorization
|
|
164
|
+
|
|
165
|
+
Check the user's *relationship to the specific resource*, not just their role:
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
async function authorizeDocAccess(userId: string, docId: string, action: string): Promise<boolean> {
|
|
169
|
+
const doc = await db.documents.findById(docId);
|
|
170
|
+
if (!doc) return false; // 404 not 403 — prevent enumeration
|
|
171
|
+
if (doc.ownerId === userId) return true;
|
|
172
|
+
const share = await db.shares.findOne({ documentId: docId, userId, permission: action });
|
|
173
|
+
return !!share;
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 3.5 Multi-Tenancy Authorization
|
|
178
|
+
|
|
179
|
+
Enforce tenant isolation at every layer:
|
|
180
|
+
1. **Application:** Every query includes tenant filter from session (never from user input)
|
|
181
|
+
2. **Database:** PostgreSQL RLS enforces boundaries even if app layer is bypassed
|
|
182
|
+
3. **API:** Validate resource belongs to authenticated tenant before any operation
|
|
183
|
+
4. **Infrastructure:** Separate schemas/instances for high-security tenants
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
function tenantScope(req: Request, res: Response, next: NextFunction) {
|
|
187
|
+
const tenantId = req.user?.tenantId;
|
|
188
|
+
if (!tenantId) return res.status(403).json({ error: 'No tenant context' });
|
|
189
|
+
req.dbClient.query("SELECT set_config('app.current_tenant', $1, true)", [tenantId]);
|
|
190
|
+
next();
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 4. Vulnerability Catalog
|
|
197
|
+
|
|
198
|
+
### V01 — IDOR (CWE-639)
|
|
199
|
+
User-supplied ID used in DB query without ownership check.
|
|
200
|
+
```javascript
|
|
201
|
+
// VULNERABLE
|
|
202
|
+
const invoice = await Invoice.findById(req.params.id); // any user reads any invoice
|
|
203
|
+
// SECURE
|
|
204
|
+
const invoice = await Invoice.findOne({ _id: req.params.id, userId: req.user.id });
|
|
205
|
+
if (!invoice) return res.status(404).json({ error: 'Not found' });
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### V02 — Mass Assignment (CWE-915)
|
|
209
|
+
Request body bound directly to model without field filtering.
|
|
210
|
+
```javascript
|
|
211
|
+
// VULNERABLE
|
|
212
|
+
await User.findByIdAndUpdate(req.user.id, req.body); // attacker sends { role: "admin" }
|
|
213
|
+
// SECURE
|
|
214
|
+
const allowed = ['name', 'email', 'avatar'];
|
|
215
|
+
const updates = Object.fromEntries(Object.entries(req.body).filter(([k]) => allowed.includes(k)));
|
|
216
|
+
await User.findByIdAndUpdate(req.user.id, updates);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### V03 — Missing Function-Level Access Control (CWE-285)
|
|
220
|
+
Admin endpoints lack role verification; "security by obscurity."
|
|
221
|
+
```javascript
|
|
222
|
+
// VULNERABLE
|
|
223
|
+
app.delete('/api/admin/users/:id', async (req, res) => { /* no role check */ });
|
|
224
|
+
// SECURE
|
|
225
|
+
app.delete('/api/admin/users/:id', requireAuth, requireRole('admin'), ctrl.deleteUser);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### V04 — JWT Role Manipulation (CWE-290)
|
|
229
|
+
Role claim in JWT trusted without server-side verification.
|
|
230
|
+
```javascript
|
|
231
|
+
// VULNERABLE — decode without verify, trust role from token
|
|
232
|
+
const token = jwt.decode(req.headers.authorization);
|
|
233
|
+
req.user = { id: token.sub, role: token.role };
|
|
234
|
+
// SECURE — verify signature, explicit algorithm, role from DB
|
|
235
|
+
const token = jwt.verify(req.headers.authorization, KEY, { algorithms: ['RS256'] });
|
|
236
|
+
const user = await User.findById(token.sub);
|
|
237
|
+
req.user = { id: user.id, role: user.role }; // role from DB
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### V05 — Parameter Tampering (CWE-269)
|
|
241
|
+
Role/permission fields accepted in user-facing API requests.
|
|
242
|
+
|
|
243
|
+
### V06 — Forced Browsing (CWE-425)
|
|
244
|
+
Sensitive URLs unprotected because "not linked in the UI."
|
|
245
|
+
|
|
246
|
+
### V07 — Path Traversal for Authz Bypass (CWE-22)
|
|
247
|
+
User-supplied file paths not canonicalized before authorization check.
|
|
248
|
+
|
|
249
|
+
### V08 — BOLA (CWE-639)
|
|
250
|
+
API endpoints accept object IDs without verifying caller's relationship.
|
|
251
|
+
|
|
252
|
+
### V09 — BFLA (CWE-285)
|
|
253
|
+
API relies on client-side role filtering; server does not re-check.
|
|
254
|
+
|
|
255
|
+
### V10 — Metadata/Header Manipulation (CWE-290)
|
|
256
|
+
Trusting `X-Forwarded-For`, `X-User-Role` from untrusted sources.
|
|
257
|
+
|
|
258
|
+
### V11 — Cross-Tenant Data Leakage (CWE-668)
|
|
259
|
+
Missing tenant ID filter in database queries.
|
|
260
|
+
|
|
261
|
+
### V12 — Insecure Default Permissions (CWE-276)
|
|
262
|
+
New resources default to public/world-readable.
|
|
263
|
+
|
|
264
|
+
### V13 — OAuth Scope Bypass (CWE-863)
|
|
265
|
+
API does not validate token scopes cover the requested operation.
|
|
266
|
+
|
|
267
|
+
### V14 — Race Condition in Authorization (CWE-362)
|
|
268
|
+
TOCTOU: permission checked, revoked, then action executed with cached decision.
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## 5. Security Checklist
|
|
273
|
+
|
|
274
|
+
### Access Control Architecture
|
|
275
|
+
- [ ] Authorization enforced server-side on every request
|
|
276
|
+
- [ ] Default policy is deny-all; access requires explicit grant
|
|
277
|
+
- [ ] Authorization logic centralized in middleware/guards, not scattered in handlers
|
|
278
|
+
- [ ] Role/permission definitions are declarative data, not hardcoded strings
|
|
279
|
+
- [ ] Multi-tenancy isolation at both application and database layers
|
|
280
|
+
|
|
281
|
+
### Object-Level Authorization
|
|
282
|
+
- [ ] Every data query scoped to the authenticated user or tenant
|
|
283
|
+
- [ ] Object IDs are UUIDs or non-sequential (not auto-increment integers)
|
|
284
|
+
- [ ] Ownership verified before read, update, or delete
|
|
285
|
+
- [ ] Unauthorized access returns 404 (not 403) to prevent enumeration
|
|
286
|
+
- [ ] Bulk/list endpoints filtered by authorization scope
|
|
287
|
+
|
|
288
|
+
### Function-Level Authorization
|
|
289
|
+
- [ ] Admin endpoints have explicit role checks
|
|
290
|
+
- [ ] HTTP method restrictions enforced (no DELETE on read-only resources)
|
|
291
|
+
- [ ] Internal/debug endpoints disabled or firewalled in production
|
|
292
|
+
|
|
293
|
+
### Input Handling
|
|
294
|
+
- [ ] Mass assignment protection via explicit field allowlists
|
|
295
|
+
- [ ] User-supplied IDs validated against authenticated user's permissions
|
|
296
|
+
- [ ] File paths canonicalized and checked against allowed directories
|
|
297
|
+
- [ ] Role/permission fields never accepted from user input
|
|
298
|
+
|
|
299
|
+
### Token and Session Security
|
|
300
|
+
- [ ] JWT signatures verified with explicit algorithm (no `alg: none`)
|
|
301
|
+
- [ ] Roles fetched from database, not trusted from tokens
|
|
302
|
+
- [ ] OAuth scopes validated at every endpoint
|
|
303
|
+
- [ ] Token revocation checked on each request
|
|
304
|
+
|
|
305
|
+
### Audit and Monitoring
|
|
306
|
+
- [ ] All authorization denials logged with user, resource, action
|
|
307
|
+
- [ ] Privilege escalation patterns trigger alerts
|
|
308
|
+
- [ ] High-volume IDOR scanning detected and rate-limited
|
|
309
|
+
- [ ] Authorization policy changes require multi-party approval
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 6. Tools and Automation
|
|
314
|
+
|
|
315
|
+
### SAST — Semgrep Custom Rules
|
|
316
|
+
|
|
317
|
+
```yaml
|
|
318
|
+
rules:
|
|
319
|
+
- id: missing-auth-middleware
|
|
320
|
+
patterns:
|
|
321
|
+
- pattern: app.$METHOD($PATH, async (req, res) => { ... })
|
|
322
|
+
- pattern-not: app.$METHOD($PATH, requireAuth, ...)
|
|
323
|
+
message: "Route handler missing authentication middleware"
|
|
324
|
+
severity: ERROR
|
|
325
|
+
languages: [javascript, typescript]
|
|
326
|
+
|
|
327
|
+
- id: direct-id-without-ownership
|
|
328
|
+
patterns:
|
|
329
|
+
- pattern: $MODEL.findById(req.params.$ID)
|
|
330
|
+
- pattern-not-inside: $MODEL.findOne({ ..., userId: req.user.id, ... })
|
|
331
|
+
message: "Direct object lookup without ownership check — potential IDOR"
|
|
332
|
+
severity: WARNING
|
|
333
|
+
languages: [javascript, typescript]
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Semgrep AI-powered detection (2025) achieves 1.9x better recall on IDOR detection
|
|
337
|
+
compared to standalone AI assistants. **CodeQL** models taint flows from user input
|
|
338
|
+
to DB queries, flagging missing authorization along the path.
|
|
339
|
+
|
|
340
|
+
### DAST
|
|
341
|
+
|
|
342
|
+
- **Burp Suite Authorize plugin:** Replays requests with low-privilege tokens,
|
|
343
|
+
highlights responses that succeed when they should fail. Essential for BOLA/BFLA.
|
|
344
|
+
- **OWASP ZAP:** Access Control Testing add-on for forced browsing and horizontal
|
|
345
|
+
privilege testing.
|
|
346
|
+
- **Nuclei:** Community templates for common authorization bypass patterns.
|
|
347
|
+
|
|
348
|
+
### Policy Testing
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
describe('Authorization', () => {
|
|
352
|
+
it('denies cross-user document access', async () => {
|
|
353
|
+
const doc = await createDocument({ ownerId: 'user-a' });
|
|
354
|
+
expect(await authorize('user-b', doc.id, 'read')).toBe(false);
|
|
355
|
+
});
|
|
356
|
+
it('prevents mass assignment of role', async () => {
|
|
357
|
+
await request(app).put('/api/users/profile')
|
|
358
|
+
.set('Authorization', userToken).send({ name: 'Test', role: 'admin' });
|
|
359
|
+
expect((await User.findById(userId)).role).toBe('viewer');
|
|
360
|
+
});
|
|
361
|
+
it('enforces tenant isolation', async () => {
|
|
362
|
+
const doc = await createDocument({ tenantId: 'tenant-a' });
|
|
363
|
+
const res = await request(app).get(`/api/documents/${doc.id}`)
|
|
364
|
+
.set('Authorization', tenantBToken);
|
|
365
|
+
expect(res.status).toBe(404);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Authorization Audit Logging
|
|
371
|
+
|
|
372
|
+
```json
|
|
373
|
+
{
|
|
374
|
+
"timestamp": "2025-03-08T14:23:01Z",
|
|
375
|
+
"event": "authorization_decision",
|
|
376
|
+
"decision": "deny",
|
|
377
|
+
"principal": { "userId": "usr_abc123", "roles": ["viewer"], "tenantId": "t_001" },
|
|
378
|
+
"resource": { "type": "document", "id": "doc_xyz789" },
|
|
379
|
+
"action": "delete",
|
|
380
|
+
"reason": "insufficient_role",
|
|
381
|
+
"sourceIp": "192.168.1.42"
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
Alert on: repeated denials from same principal, sudden access to many distinct
|
|
386
|
+
resources (IDOR scan), any admin-resource access by non-admin principals.
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## 7. Platform-Specific Guidance
|
|
391
|
+
|
|
392
|
+
### Web — Middleware Guards
|
|
393
|
+
|
|
394
|
+
**Express.js:**
|
|
395
|
+
```typescript
|
|
396
|
+
const authorize = (resource: string, action: string) =>
|
|
397
|
+
async (req: Request, res: Response, next: NextFunction) => {
|
|
398
|
+
const allowed = await policyEngine.evaluate({ subject: req.user, resource, action });
|
|
399
|
+
if (!allowed) return res.status(403).json({ error: 'Forbidden' });
|
|
400
|
+
next();
|
|
401
|
+
};
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**Django REST Framework:**
|
|
405
|
+
```python
|
|
406
|
+
class IsDocumentOwner(BasePermission):
|
|
407
|
+
def has_object_permission(self, request, view, obj):
|
|
408
|
+
return obj.owner == request.user
|
|
409
|
+
|
|
410
|
+
class DocumentViewSet(viewsets.ModelViewSet):
|
|
411
|
+
permission_classes = [IsAuthenticated, IsDocumentOwner]
|
|
412
|
+
def get_queryset(self):
|
|
413
|
+
return Document.objects.filter(tenant_id=self.request.user.tenant_id)
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Spring Security:**
|
|
417
|
+
```java
|
|
418
|
+
@PreAuthorize("hasRole('ADMIN') or @docService.isOwner(#id, authentication.name)")
|
|
419
|
+
@GetMapping("/api/documents/{id}")
|
|
420
|
+
public ResponseEntity<Document> getDocument(@PathVariable Long id) { ... }
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Mobile
|
|
424
|
+
|
|
425
|
+
All authorization enforcement MUST happen server-side. Mobile clients are untrusted:
|
|
426
|
+
attackers decompile APK/IPA, intercept via Frida/Objection, or call APIs directly.
|
|
427
|
+
Never store roles/permissions in local storage. Use short-lived tokens with refresh
|
|
428
|
+
rotation. Certificate pinning is defense-in-depth, not a primary control.
|
|
429
|
+
|
|
430
|
+
### API — OAuth Scope Enforcement
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
function requireScopes(...required: string[]) {
|
|
434
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
435
|
+
const tokenScopes = req.auth?.scope?.split(' ') || [];
|
|
436
|
+
if (!required.every(s => tokenScopes.includes(s)))
|
|
437
|
+
return res.status(403).json({ error: 'insufficient_scope', required });
|
|
438
|
+
next();
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
app.get('/api/users', requireScopes('users:read'), ctrl.list);
|
|
442
|
+
app.delete('/api/users', requireScopes('users:admin'), ctrl.delete);
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
Even with valid scopes, always verify resource ownership:
|
|
446
|
+
```typescript
|
|
447
|
+
const order = await Order.findOne({ _id: req.params.id, userId: req.auth.sub });
|
|
448
|
+
if (!order) return res.status(404).json({ error: 'Not found' });
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## 8. Incident Patterns
|
|
454
|
+
|
|
455
|
+
### IDOR Exploitation Chain
|
|
456
|
+
1. Attacker authenticates normally, observes resource IDs in API responses
|
|
457
|
+
2. Modifies the ID parameter (increment, decrement, substitute)
|
|
458
|
+
3. If response contains another user's data, IDOR confirmed
|
|
459
|
+
4. Automates enumeration, scraping all accessible IDs
|
|
460
|
+
5. May escalate via PUT/DELETE with tampered IDs
|
|
461
|
+
|
|
462
|
+
**Detection:** Single user accessing many distinct resource IDs; sequential access
|
|
463
|
+
patterns; 200 OK for IDs outside normal access range; high volume to parameterized
|
|
464
|
+
endpoints.
|
|
465
|
+
|
|
466
|
+
### Privilege Escalation Detection
|
|
467
|
+
**Indicators:** User account gains roles not assigned through admin workflow; non-admin
|
|
468
|
+
calls admin endpoints; JWT claims differ from DB record; `role`/`is_admin` modified
|
|
469
|
+
outside admin interface.
|
|
470
|
+
|
|
471
|
+
**Response:** (1) Revoke session/tokens. (2) Audit all actions since escalation.
|
|
472
|
+
(3) Roll back unauthorized changes. (4) Identify vector (mass assignment, JWT
|
|
473
|
+
manipulation, SQLi). (5) Deploy fix, re-test. (6) Notify affected users.
|
|
474
|
+
|
|
475
|
+
### Cross-Tenant Breach Response
|
|
476
|
+
1. Identify scope: which tenants affected, what data exposed
|
|
477
|
+
2. Isolate vulnerable endpoint (feature flag, WAF rule, takedown)
|
|
478
|
+
3. Audit cross-tenant queries in DB logs for the exposure window
|
|
479
|
+
4. Notify affected tenants per regulatory obligations (GDPR: 72 hours)
|
|
480
|
+
5. Implement RLS to prevent recurrence; engage pentesters to verify
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## 9. Compliance and Standards
|
|
485
|
+
|
|
486
|
+
### OWASP A01:2021/2025 — Broken Access Control
|
|
487
|
+
Maps to 34 CWEs: CWE-200 (Info Exposure), CWE-285 (Improper Authorization), CWE-639
|
|
488
|
+
(Authz Bypass via User-Controlled Key), CWE-862 (Missing Authorization), CWE-863
|
|
489
|
+
(Incorrect Authorization), CWE-915 (Mass Assignment).
|
|
490
|
+
|
|
491
|
+
### NIST SP 800-53 Rev. 5 — AC Family
|
|
492
|
+
- **AC-3:** Access Enforcement
|
|
493
|
+
- **AC-5:** Separation of Duties
|
|
494
|
+
- **AC-6:** Least Privilege
|
|
495
|
+
- **AC-16:** Security/Privacy Attributes (supports ABAC)
|
|
496
|
+
- **AC-24:** Access Control Decisions (PDP/PEP points)
|
|
497
|
+
|
|
498
|
+
### SOC 2 Trust Services Criteria
|
|
499
|
+
- **CC6.1:** Logical access controls to protect information
|
|
500
|
+
- **CC6.3:** Access authorized and modified based on roles
|
|
501
|
+
- **CC6.6:** System boundaries restrict unauthorized external access
|
|
502
|
+
|
|
503
|
+
### PCI DSS v4.0
|
|
504
|
+
- **Req 7:** Restrict access by business need-to-know (7.2: define access, 7.3: enforce via ACL)
|
|
505
|
+
- **Req 10:** Log and monitor all access to cardholder data
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
## 10. Code Examples — Vulnerable vs. Secure
|
|
510
|
+
|
|
511
|
+
### 10.1 RBAC Middleware (TypeScript)
|
|
512
|
+
|
|
513
|
+
```typescript
|
|
514
|
+
import { Request, Response, NextFunction } from 'express';
|
|
515
|
+
|
|
516
|
+
const ROLE_PERMISSIONS: Record<string, Set<string>> = {
|
|
517
|
+
admin: new Set(['create', 'read', 'update', 'delete', 'manage_users']),
|
|
518
|
+
editor: new Set(['create', 'read', 'update']),
|
|
519
|
+
viewer: new Set(['read']),
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
export function rbacGuard(permission: string) {
|
|
523
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
524
|
+
const user = req.user;
|
|
525
|
+
if (!user) {
|
|
526
|
+
auditLog('authz_denied', { reason: 'no_user', permission, path: req.path });
|
|
527
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
528
|
+
}
|
|
529
|
+
const allowed = user.roles.some((r: string) => ROLE_PERMISSIONS[r]?.has(permission));
|
|
530
|
+
if (!allowed) {
|
|
531
|
+
auditLog('authz_denied', { userId: user.id, permission, path: req.path });
|
|
532
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
533
|
+
}
|
|
534
|
+
next();
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### 10.2 Mass Assignment Protection (Zod)
|
|
540
|
+
|
|
541
|
+
```typescript
|
|
542
|
+
import { z } from 'zod';
|
|
543
|
+
|
|
544
|
+
const UpdateProfileSchema = z.object({
|
|
545
|
+
name: z.string().min(1).max(100).optional(),
|
|
546
|
+
email: z.string().email().optional(),
|
|
547
|
+
avatar: z.string().url().optional(),
|
|
548
|
+
// role, emailVerified, credits — NOT in schema, cannot be set
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
app.patch('/api/users/:id', requireAuth, async (req, res) => {
|
|
552
|
+
if (req.params.id !== req.user.id) return res.status(404).json({ error: 'Not found' });
|
|
553
|
+
const updates = UpdateProfileSchema.parse(req.body); // strips unknown fields
|
|
554
|
+
const user = await User.findByIdAndUpdate(req.user.id, updates, { new: true });
|
|
555
|
+
return res.json(user);
|
|
556
|
+
});
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### 10.3 Row-Level Security (Complete SQL Setup)
|
|
560
|
+
|
|
561
|
+
```sql
|
|
562
|
+
CREATE ROLE app_user LOGIN PASSWORD 'strong-random-password';
|
|
563
|
+
CREATE TABLE orders (
|
|
564
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
565
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
|
566
|
+
user_id UUID NOT NULL,
|
|
567
|
+
amount DECIMAL(10,2) NOT NULL,
|
|
568
|
+
status TEXT DEFAULT 'pending'
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
GRANT SELECT, INSERT, UPDATE ON orders TO app_user;
|
|
572
|
+
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
|
|
573
|
+
|
|
574
|
+
CREATE POLICY tenant_isolation ON orders FOR ALL
|
|
575
|
+
USING (tenant_id = current_setting('app.current_tenant')::uuid)
|
|
576
|
+
WITH CHECK (tenant_id = current_setting('app.current_tenant')::uuid);
|
|
577
|
+
|
|
578
|
+
CREATE POLICY user_read ON orders FOR SELECT
|
|
579
|
+
USING (user_id = current_setting('app.current_user')::uuid
|
|
580
|
+
OR current_setting('app.current_role') = 'admin');
|
|
581
|
+
|
|
582
|
+
-- Per request: SET LOCAL "app.current_tenant" = 'uuid'; (transaction-scoped)
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## References
|
|
588
|
+
|
|
589
|
+
- OWASP Top 10: A01:2021 — https://owasp.org/Top10/2021/A01_2021-Broken_Access_Control/
|
|
590
|
+
- OWASP API Security: API1:2023 BOLA — https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/
|
|
591
|
+
- OWASP IDOR Prevention Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html
|
|
592
|
+
- NIST SP 800-53 Rev. 5 — https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final
|
|
593
|
+
- CWE-639, CWE-915, CWE-285 — https://cwe.mitre.org/
|
|
594
|
+
- Facebook Security Update (Sep 2018) — https://about.fb.com/news/2018/09/security-update/
|
|
595
|
+
- Salt Security: Parler Breach — https://salt.security/blog/unpacking-the-parler-data-breach
|
|
596
|
+
- Sam Curry: Hacking Kia — https://samcurry.net/hacking-kia
|
|
597
|
+
- PostgreSQL RLS — https://www.postgresql.org/docs/current/ddl-rowsecurity.html
|
|
598
|
+
- Open Policy Agent — https://www.openpolicyagent.org/docs
|
|
599
|
+
- Apache Casbin — https://casbin.org/docs/overview/
|
|
600
|
+
- Semgrep AI Detection — https://semgrep.dev/blog/2025/ai-powered-detection-with-semgrep/
|
|
601
|
+
- CVE-2025-27507 (ZITADEL IDOR) — CVSS 9.0
|
|
602
|
+
- CVE-2024-46528 (KubeSphere IDOR)
|
|
603
|
+
- CVE-2025-29927 (Next.js Middleware Auth Bypass)
|