agentic-qe 3.7.9 → 3.7.11
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/.claude/skills/.validation/README.md +111 -111
- package/.claude/skills/.validation/examples/chaos-engineering-output.example.json +530 -530
- package/.claude/skills/.validation/examples/performance-testing-output.example.json +252 -252
- package/.claude/skills/.validation/examples/security-testing-output.example.json +413 -413
- package/.claude/skills/.validation/examples/testability-scoring-output.example.json +350 -350
- package/.claude/skills/.validation/schemas/skill-eval.schema.json +462 -462
- package/.claude/skills/.validation/schemas/skill-frontmatter.schema.json +341 -341
- package/.claude/skills/.validation/schemas/skill-output-meta.schema.json +199 -199
- package/.claude/skills/.validation/schemas/skill-output.template.json +610 -610
- package/.claude/skills/.validation/skill-validation-mcp-integration.md +250 -250
- package/.claude/skills/.validation/templates/eval.template.yaml +366 -366
- package/.claude/skills/.validation/templates/schemas/output.json +145 -145
- package/.claude/skills/.validation/templates/security-testing-eval.template.yaml +725 -725
- package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +225 -225
- package/.claude/skills/.validation/test-data/invalid-output.json +5 -5
- package/.claude/skills/.validation/test-data/minimal-output.json +9 -9
- package/.claude/skills/.validation/test-data/sample-output.json +73 -73
- package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +376 -376
- package/.claude/skills/a11y-ally/schemas/output.json +549 -549
- package/.claude/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -719
- package/.claude/skills/accessibility-testing/schemas/output.json +776 -776
- package/.claude/skills/accessibility-testing/test-data/sample-output.json +191 -191
- package/.claude/skills/agentic-quality-engineering/schemas/output.json +577 -577
- package/.claude/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -696
- package/.claude/skills/api-testing-patterns/schemas/output.json +845 -845
- package/.claude/skills/aqe-v2-v3-migration/schemas/output.json +513 -513
- package/.claude/skills/brutal-honesty-review/schemas/output.json +291 -291
- package/.claude/skills/bug-reporting-excellence/schemas/output.json +288 -288
- package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -761
- package/.claude/skills/chaos-engineering-resilience/schemas/output.json +1205 -1205
- package/.claude/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +157 -157
- package/.claude/skills/cicd-pipeline-qe-orchestrator/schemas/output.json +542 -542
- package/.claude/skills/code-review-quality/schemas/output.json +264 -264
- package/.claude/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -410
- package/.claude/skills/compatibility-testing/schemas/output.json +551 -551
- package/.claude/skills/compliance-testing/evals/compliance-testing.yaml +1107 -1107
- package/.claude/skills/compliance-testing/schemas/output.json +845 -845
- package/.claude/skills/consultancy-practices/schemas/output.json +282 -282
- package/.claude/skills/contract-testing/evals/contract-testing.yaml +748 -748
- package/.claude/skills/contract-testing/schemas/output.json +638 -638
- package/.claude/skills/database-testing/evals/database-testing.yaml +968 -968
- package/.claude/skills/database-testing/schemas/output.json +1446 -1446
- package/.claude/skills/debug-loop/SKILL.md +61 -61
- package/.claude/skills/enterprise-integration-testing/SKILL.md +735 -735
- package/.claude/skills/enterprise-integration-testing/evals/enterprise-integration-testing.yaml +158 -158
- package/.claude/skills/enterprise-integration-testing/schemas/output.json +74 -74
- package/.claude/skills/enterprise-integration-testing/scripts/validate-config.json +25 -25
- package/.claude/skills/iterative-loop/SKILL.md +371 -371
- package/.claude/skills/localization-testing/evals/localization-testing.yaml +544 -544
- package/.claude/skills/localization-testing/schemas/output.json +325 -325
- package/.claude/skills/middleware-testing-patterns/SKILL.md +798 -798
- package/.claude/skills/middleware-testing-patterns/evals/middleware-testing-patterns.yaml +153 -153
- package/.claude/skills/middleware-testing-patterns/schemas/output.json +58 -58
- package/.claude/skills/middleware-testing-patterns/scripts/validate-config.json +25 -25
- package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +537 -537
- package/.claude/skills/mobile-testing/schemas/output.json +318 -318
- package/.claude/skills/mutation-testing/evals/mutation-testing.yaml +652 -652
- package/.claude/skills/mutation-testing/schemas/output.json +707 -707
- package/.claude/skills/mutation-testing/test-data/sample-output.json +295 -295
- package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +450 -450
- package/.claude/skills/n8n-expression-testing/schemas/output.json +369 -369
- package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +522 -522
- package/.claude/skills/n8n-integration-testing-patterns/schemas/output.json +291 -291
- package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +493 -493
- package/.claude/skills/n8n-security-testing/schemas/output.json +293 -293
- package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +500 -500
- package/.claude/skills/n8n-trigger-testing-strategies/schemas/output.json +295 -295
- package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +497 -497
- package/.claude/skills/n8n-workflow-testing-fundamentals/schemas/output.json +254 -254
- package/.claude/skills/observability-testing-patterns/SKILL.md +930 -930
- package/.claude/skills/observability-testing-patterns/evals/observability-testing-patterns.yaml +157 -157
- package/.claude/skills/observability-testing-patterns/schemas/output.json +58 -58
- package/.claude/skills/observability-testing-patterns/scripts/validate-config.json +25 -25
- package/.claude/skills/pentest-validation/SKILL.md +268 -268
- package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +708 -708
- package/.claude/skills/pentest-validation/schemas/output.json +281 -281
- package/.claude/skills/performance-analysis/evals/performance-analysis.yaml +144 -144
- package/.claude/skills/performance-analysis/schemas/output.json +588 -588
- package/.claude/skills/performance-testing/evals/performance-testing.yaml +772 -772
- package/.claude/skills/performance-testing/schemas/output.json +1184 -1184
- package/.claude/skills/pr-review/SKILL.md +61 -61
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +2206 -2206
- package/.claude/skills/qcsd-cicd-swarm/evals/qcsd-cicd-swarm.yaml +211 -211
- package/.claude/skills/qcsd-cicd-swarm/schemas/output.json +86 -86
- package/.claude/skills/qcsd-cicd-swarm/scripts/validate-config.json +30 -30
- package/.claude/skills/qcsd-development-swarm/SKILL.md +2154 -2154
- package/.claude/skills/qcsd-development-swarm/evals/qcsd-development-swarm.yaml +162 -162
- package/.claude/skills/qcsd-development-swarm/schemas/output.json +72 -72
- package/.claude/skills/qcsd-development-swarm/scripts/validate-config.json +25 -25
- package/.claude/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +138 -138
- package/.claude/skills/qcsd-ideation-swarm/schemas/output.json +568 -568
- package/.claude/skills/qcsd-production-swarm/SKILL.md +2781 -2781
- package/.claude/skills/qcsd-production-swarm/evals/qcsd-production-swarm.yaml +246 -246
- package/.claude/skills/qcsd-production-swarm/schemas/output.json +505 -505
- package/.claude/skills/qcsd-production-swarm/scripts/validate-config.json +25 -25
- package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -443
- package/.claude/skills/qe-chaos-resilience/schemas/output.json +314 -314
- package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -459
- package/.claude/skills/qe-code-intelligence/schemas/output.json +315 -315
- package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -513
- package/.claude/skills/qe-contract-testing/schemas/output.json +295 -295
- package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -494
- package/.claude/skills/qe-coverage-analysis/schemas/output.json +286 -286
- package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -511
- package/.claude/skills/qe-defect-intelligence/schemas/output.json +283 -283
- package/.claude/skills/qe-iterative-loop/schemas/output.json +264 -264
- package/.claude/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -144
- package/.claude/skills/qe-learning-optimization/schemas/output.json +288 -288
- package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -506
- package/.claude/skills/qe-quality-assessment/schemas/output.json +550 -550
- package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -598
- package/.claude/skills/qe-requirements-validation/schemas/output.json +587 -587
- package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -595
- package/.claude/skills/qe-security-compliance/schemas/output.json +498 -498
- package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -607
- package/.claude/skills/qe-test-execution/schemas/output.json +529 -529
- package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -148
- package/.claude/skills/qe-test-generation/schemas/output.json +439 -439
- package/.claude/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -142
- package/.claude/skills/qe-visual-accessibility/schemas/output.json +491 -491
- package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +494 -494
- package/.claude/skills/quality-metrics/schemas/output.json +403 -403
- package/.claude/skills/refactoring-patterns/schemas/output.json +475 -475
- package/.claude/skills/regression-testing/evals/regression-testing.yaml +504 -504
- package/.claude/skills/regression-testing/schemas/output.json +311 -311
- package/.claude/skills/release/SKILL.md +347 -347
- package/.claude/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -141
- package/.claude/skills/risk-based-testing/schemas/output.json +480 -480
- package/.claude/skills/security-testing/evals/security-testing.yaml +789 -789
- package/.claude/skills/security-testing/schemas/output.json +879 -879
- package/.claude/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -163
- package/.claude/skills/security-visual-testing/schemas/output.json +486 -486
- package/.claude/skills/sfdipot-product-factors/SKILL.md +239 -239
- package/.claude/skills/sherlock-review/schemas/output.json +297 -297
- package/.claude/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -145
- package/.claude/skills/shift-left-testing/schemas/output.json +459 -459
- package/.claude/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -147
- package/.claude/skills/shift-right-testing/schemas/output.json +418 -418
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/tdd-london-chicago/schemas/output.json +444 -444
- package/.claude/skills/technical-writing/schemas/output.json +268 -268
- package/.claude/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -148
- package/.claude/skills/test-automation-strategy/schemas/output.json +444 -444
- package/.claude/skills/test-data-management/evals/test-data-management.yaml +504 -504
- package/.claude/skills/test-data-management/schemas/output.json +284 -284
- package/.claude/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -142
- package/.claude/skills/test-design-techniques/schemas/output.json +295 -295
- package/.claude/skills/test-environment-management/schemas/output.json +310 -310
- package/.claude/skills/test-idea-rewriting/SKILL.md +229 -229
- package/.claude/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -155
- package/.claude/skills/test-reporting-analytics/schemas/output.json +329 -329
- package/.claude/skills/testability-scoring/evals/testability-scoring.yaml +814 -814
- package/.claude/skills/testability-scoring/resources/templates/config.template.js +84 -84
- package/.claude/skills/testability-scoring/schemas/output.json +606 -606
- package/.claude/skills/testability-scoring/scripts/generate-html-report.js +1007 -1007
- package/.claude/skills/verification-quality/evals/verification-quality.yaml +150 -150
- package/.claude/skills/verification-quality/schemas/output.json +432 -432
- package/.claude/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -154
- package/.claude/skills/visual-testing-advanced/schemas/output.json +294 -294
- package/.claude/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +165 -165
- package/.claude/skills/wms-testing-patterns/schemas/output.json +150 -150
- package/.claude/skills/wms-testing-patterns/scripts/validate-config.json +51 -51
- package/CHANGELOG.md +36 -0
- package/README.md +171 -901
- package/assets/agents/v3/helpers/quality-criteria/evidence-classification.md +116 -116
- package/assets/agents/v3/helpers/quality-criteria/htsm-categories.md +139 -139
- package/assets/governance/constitution.md +202 -202
- package/assets/governance/shards/chaos-resilience.shard.md +221 -221
- package/assets/governance/shards/code-intelligence.shard.md +178 -178
- package/assets/governance/shards/contract-testing.shard.md +206 -206
- package/assets/governance/shards/coverage-analysis.shard.md +146 -146
- package/assets/governance/shards/defect-intelligence.shard.md +182 -182
- package/assets/governance/shards/learning-optimization.shard.md +248 -248
- package/assets/governance/shards/quality-assessment.shard.md +165 -165
- package/assets/governance/shards/requirements-validation.shard.md +177 -177
- package/assets/governance/shards/security-compliance.shard.md +196 -196
- package/assets/governance/shards/test-execution.shard.md +156 -156
- package/assets/governance/shards/test-generation.shard.md +128 -128
- package/assets/governance/shards/visual-accessibility.shard.md +209 -209
- package/assets/hooks/cross-phase-memory.yaml +253 -253
- package/assets/patterns/adr-051-booster-patterns.json +78 -78
- package/assets/patterns/adr-051-embedding-patterns.json +147 -147
- package/assets/patterns/adr-051-integration-summary.json +62 -62
- package/assets/patterns/adr-051-reasoning-patterns.json +166 -166
- package/assets/patterns/adr-051-router-patterns.json +113 -113
- package/assets/patterns/index.json +136 -136
- package/assets/skills/.validation/README.md +111 -111
- package/assets/skills/.validation/examples/chaos-engineering-output.example.json +530 -530
- package/assets/skills/.validation/examples/performance-testing-output.example.json +252 -252
- package/assets/skills/.validation/examples/security-testing-output.example.json +413 -413
- package/assets/skills/.validation/examples/testability-scoring-output.example.json +350 -350
- package/assets/skills/.validation/schemas/skill-eval.schema.json +462 -462
- package/assets/skills/.validation/schemas/skill-frontmatter.schema.json +341 -341
- package/assets/skills/.validation/schemas/skill-output-meta.schema.json +199 -199
- package/assets/skills/.validation/schemas/skill-output.template.json +610 -610
- package/assets/skills/.validation/skill-validation-mcp-integration.md +250 -250
- package/assets/skills/.validation/templates/eval.template.yaml +366 -366
- package/assets/skills/.validation/templates/schemas/output.json +145 -145
- package/assets/skills/.validation/templates/security-testing-eval.template.yaml +725 -725
- package/assets/skills/.validation/templates/skill-frontmatter.example.yaml +225 -225
- package/assets/skills/.validation/test-data/invalid-output.json +5 -5
- package/assets/skills/.validation/test-data/minimal-output.json +9 -9
- package/assets/skills/.validation/test-data/sample-output.json +73 -73
- package/assets/skills/a11y-ally/evals/a11y-ally.yaml +376 -376
- package/assets/skills/a11y-ally/schemas/output.json +549 -549
- package/assets/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -719
- package/assets/skills/accessibility-testing/schemas/output.json +776 -776
- package/assets/skills/accessibility-testing/test-data/sample-output.json +191 -191
- package/assets/skills/agentic-quality-engineering/schemas/output.json +577 -577
- package/assets/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -696
- package/assets/skills/api-testing-patterns/schemas/output.json +845 -845
- package/assets/skills/aqe-v2-v3-migration/schemas/output.json +513 -513
- package/assets/skills/brutal-honesty-review/schemas/output.json +291 -291
- package/assets/skills/bug-reporting-excellence/schemas/output.json +288 -288
- package/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -761
- package/assets/skills/chaos-engineering-resilience/schemas/output.json +1205 -1205
- package/assets/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +157 -157
- package/assets/skills/cicd-pipeline-qe-orchestrator/schemas/output.json +542 -542
- package/assets/skills/code-review-quality/schemas/output.json +264 -264
- package/assets/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -410
- package/assets/skills/compatibility-testing/schemas/output.json +551 -551
- package/assets/skills/compliance-testing/evals/compliance-testing.yaml +1107 -1107
- package/assets/skills/compliance-testing/schemas/output.json +845 -845
- package/assets/skills/consultancy-practices/schemas/output.json +282 -282
- package/assets/skills/contract-testing/evals/contract-testing.yaml +748 -748
- package/assets/skills/contract-testing/schemas/output.json +638 -638
- package/assets/skills/database-testing/evals/database-testing.yaml +968 -968
- package/assets/skills/database-testing/schemas/output.json +1446 -1446
- package/assets/skills/debug-loop/SKILL.md +61 -61
- package/assets/skills/enterprise-integration-testing/SKILL.md +735 -735
- package/assets/skills/enterprise-integration-testing/evals/enterprise-integration-testing.yaml +158 -158
- package/assets/skills/enterprise-integration-testing/schemas/output.json +74 -74
- package/assets/skills/enterprise-integration-testing/scripts/validate-config.json +25 -25
- package/assets/skills/localization-testing/evals/localization-testing.yaml +544 -544
- package/assets/skills/localization-testing/schemas/output.json +325 -325
- package/assets/skills/middleware-testing-patterns/SKILL.md +798 -798
- package/assets/skills/middleware-testing-patterns/evals/middleware-testing-patterns.yaml +153 -153
- package/assets/skills/middleware-testing-patterns/schemas/output.json +58 -58
- package/assets/skills/middleware-testing-patterns/scripts/validate-config.json +25 -25
- package/assets/skills/mobile-testing/evals/mobile-testing.yaml +537 -537
- package/assets/skills/mobile-testing/schemas/output.json +318 -318
- package/assets/skills/mutation-testing/evals/mutation-testing.yaml +652 -652
- package/assets/skills/mutation-testing/schemas/output.json +707 -707
- package/assets/skills/mutation-testing/test-data/sample-output.json +295 -295
- package/assets/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +450 -450
- package/assets/skills/n8n-expression-testing/schemas/output.json +369 -369
- package/assets/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +522 -522
- package/assets/skills/n8n-integration-testing-patterns/schemas/output.json +291 -291
- package/assets/skills/n8n-security-testing/evals/n8n-security-testing.yaml +493 -493
- package/assets/skills/n8n-security-testing/schemas/output.json +293 -293
- package/assets/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +500 -500
- package/assets/skills/n8n-trigger-testing-strategies/schemas/output.json +295 -295
- package/assets/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +497 -497
- package/assets/skills/n8n-workflow-testing-fundamentals/schemas/output.json +254 -254
- package/assets/skills/observability-testing-patterns/SKILL.md +930 -930
- package/assets/skills/observability-testing-patterns/evals/observability-testing-patterns.yaml +157 -157
- package/assets/skills/observability-testing-patterns/schemas/output.json +58 -58
- package/assets/skills/observability-testing-patterns/scripts/validate-config.json +25 -25
- package/assets/skills/pentest-validation/SKILL.md +268 -268
- package/assets/skills/pentest-validation/evals/pentest-validation.yaml +708 -708
- package/assets/skills/pentest-validation/schemas/output.json +281 -281
- package/assets/skills/performance-testing/evals/performance-testing.yaml +772 -772
- package/assets/skills/performance-testing/schemas/output.json +1184 -1184
- package/assets/skills/pr-review/SKILL.md +61 -61
- package/assets/skills/qcsd-cicd-swarm/SKILL.md +2206 -2206
- package/assets/skills/qcsd-cicd-swarm/evals/qcsd-cicd-swarm.yaml +211 -211
- package/assets/skills/qcsd-cicd-swarm/schemas/output.json +86 -86
- package/assets/skills/qcsd-cicd-swarm/scripts/validate-config.json +30 -30
- package/assets/skills/qcsd-development-swarm/SKILL.md +2154 -2154
- package/assets/skills/qcsd-development-swarm/evals/qcsd-development-swarm.yaml +162 -162
- package/assets/skills/qcsd-development-swarm/schemas/output.json +72 -72
- package/assets/skills/qcsd-development-swarm/scripts/validate-config.json +25 -25
- package/assets/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +138 -138
- package/assets/skills/qcsd-ideation-swarm/schemas/output.json +568 -568
- package/assets/skills/qcsd-production-swarm/SKILL.md +2781 -2781
- package/assets/skills/qcsd-production-swarm/evals/qcsd-production-swarm.yaml +246 -246
- package/assets/skills/qcsd-production-swarm/schemas/output.json +505 -505
- package/assets/skills/qcsd-production-swarm/scripts/validate-config.json +25 -25
- package/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -443
- package/assets/skills/qe-chaos-resilience/schemas/output.json +314 -314
- package/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -459
- package/assets/skills/qe-code-intelligence/schemas/output.json +315 -315
- package/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -513
- package/assets/skills/qe-contract-testing/schemas/output.json +295 -295
- package/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -494
- package/assets/skills/qe-coverage-analysis/schemas/output.json +286 -286
- package/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -511
- package/assets/skills/qe-defect-intelligence/schemas/output.json +283 -283
- package/assets/skills/qe-iterative-loop/schemas/output.json +264 -264
- package/assets/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -144
- package/assets/skills/qe-learning-optimization/schemas/output.json +288 -288
- package/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -506
- package/assets/skills/qe-quality-assessment/schemas/output.json +550 -550
- package/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -598
- package/assets/skills/qe-requirements-validation/schemas/output.json +587 -587
- package/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -595
- package/assets/skills/qe-security-compliance/schemas/output.json +498 -498
- package/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -607
- package/assets/skills/qe-test-execution/schemas/output.json +529 -529
- package/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -148
- package/assets/skills/qe-test-generation/schemas/output.json +439 -439
- package/assets/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -142
- package/assets/skills/qe-visual-accessibility/schemas/output.json +491 -491
- package/assets/skills/quality-metrics/evals/quality-metrics.yaml +494 -494
- package/assets/skills/quality-metrics/schemas/output.json +403 -403
- package/assets/skills/refactoring-patterns/schemas/output.json +475 -475
- package/assets/skills/regression-testing/evals/regression-testing.yaml +504 -504
- package/assets/skills/regression-testing/schemas/output.json +311 -311
- package/assets/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -141
- package/assets/skills/risk-based-testing/schemas/output.json +480 -480
- package/assets/skills/security-testing/evals/security-testing.yaml +789 -789
- package/assets/skills/security-testing/schemas/output.json +879 -879
- package/assets/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -163
- package/assets/skills/security-visual-testing/schemas/output.json +486 -486
- package/assets/skills/sfdipot-product-factors/SKILL.md +239 -239
- package/assets/skills/sherlock-review/schemas/output.json +297 -297
- package/assets/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -145
- package/assets/skills/shift-left-testing/schemas/output.json +459 -459
- package/assets/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -147
- package/assets/skills/shift-right-testing/schemas/output.json +418 -418
- package/assets/skills/tdd-london-chicago/schemas/output.json +444 -444
- package/assets/skills/technical-writing/schemas/output.json +268 -268
- package/assets/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -148
- package/assets/skills/test-automation-strategy/schemas/output.json +444 -444
- package/assets/skills/test-data-management/evals/test-data-management.yaml +504 -504
- package/assets/skills/test-data-management/schemas/output.json +284 -284
- package/assets/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -142
- package/assets/skills/test-design-techniques/schemas/output.json +295 -295
- package/assets/skills/test-environment-management/schemas/output.json +310 -310
- package/assets/skills/test-idea-rewriting/SKILL.md +229 -229
- package/assets/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -155
- package/assets/skills/test-reporting-analytics/schemas/output.json +329 -329
- package/assets/skills/testability-scoring/evals/testability-scoring.yaml +814 -814
- package/assets/skills/testability-scoring/resources/templates/config.template.js +84 -84
- package/assets/skills/testability-scoring/schemas/output.json +606 -606
- package/assets/skills/testability-scoring/scripts/generate-html-report.js +1007 -1007
- package/assets/skills/verification-quality/evals/verification-quality.yaml +150 -150
- package/assets/skills/verification-quality/schemas/output.json +432 -432
- package/assets/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -154
- package/assets/skills/visual-testing-advanced/schemas/output.json +294 -294
- package/assets/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +165 -165
- package/assets/skills/wms-testing-patterns/schemas/output.json +150 -150
- package/assets/skills/wms-testing-patterns/scripts/validate-config.json +51 -51
- package/assets/templates/validation-summary.json +56 -56
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +1 -0
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts.map +1 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.js +16 -3
- package/dist/agents/claim-verifier/verifiers/output-verifier.js.map +1 -1
- package/dist/cli/bundle.js +488 -75
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -9
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/governance/adversarial-defense-integration.d.ts +29 -0
- package/dist/governance/adversarial-defense-integration.d.ts.map +1 -1
- package/dist/governance/adversarial-defense-integration.js +85 -1
- package/dist/governance/adversarial-defense-integration.js.map +1 -1
- package/dist/governance/continue-gate-integration.d.ts +7 -5
- package/dist/governance/continue-gate-integration.d.ts.map +1 -1
- package/dist/governance/continue-gate-integration.js +72 -15
- package/dist/governance/continue-gate-integration.js.map +1 -1
- package/dist/governance/deterministic-gateway-integration.d.ts +5 -0
- package/dist/governance/deterministic-gateway-integration.d.ts.map +1 -1
- package/dist/governance/deterministic-gateway-integration.js +35 -1
- package/dist/governance/deterministic-gateway-integration.js.map +1 -1
- package/dist/governance/evolution-pipeline-integration.d.ts +5 -0
- package/dist/governance/evolution-pipeline-integration.d.ts.map +1 -1
- package/dist/governance/evolution-pipeline-integration.js +57 -1
- package/dist/governance/evolution-pipeline-integration.js.map +1 -1
- package/dist/governance/memory-write-gate-integration.d.ts +6 -3
- package/dist/governance/memory-write-gate-integration.d.ts.map +1 -1
- package/dist/governance/memory-write-gate-integration.js +48 -10
- package/dist/governance/memory-write-gate-integration.js.map +1 -1
- package/dist/governance/proof-envelope-integration.d.ts +1 -0
- package/dist/governance/proof-envelope-integration.d.ts.map +1 -1
- package/dist/governance/proof-envelope-integration.js +37 -0
- package/dist/governance/proof-envelope-integration.js.map +1 -1
- package/dist/governance/shard-retriever-integration.d.ts +10 -0
- package/dist/governance/shard-retriever-integration.d.ts.map +1 -1
- package/dist/governance/shard-retriever-integration.js +50 -1
- package/dist/governance/shard-retriever-integration.js.map +1 -1
- package/dist/governance/trust-accumulator-integration.d.ts +5 -0
- package/dist/governance/trust-accumulator-integration.d.ts.map +1 -1
- package/dist/governance/trust-accumulator-integration.js +35 -2
- package/dist/governance/trust-accumulator-integration.js.map +1 -1
- package/dist/init/phases/10-workers.js +2 -2
- package/dist/init/phases/10-workers.js.map +1 -1
- package/dist/mcp/bundle.js +478 -62
- package/dist/mcp/protocol-server.js +2 -2
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +1 -0
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/shared/language-detector.js +1 -1
- package/dist/shared/language-detector.js.map +1 -1
- package/dist/shared/parsers/multi-language-parser.d.ts.map +1 -1
- package/dist/shared/parsers/multi-language-parser.js +55 -16
- package/dist/shared/parsers/multi-language-parser.js.map +1 -1
- package/dist/shared/sql-safety.d.ts.map +1 -1
- package/dist/shared/sql-safety.js +7 -1
- package/dist/shared/sql-safety.js.map +1 -1
- package/package.json +6 -2
- package/scripts/prepare-assets.sh +8 -0
|
@@ -1,789 +1,789 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# AQE Skill Evaluation Test Suite: Security Testing v1.0.0
|
|
3
|
-
# =============================================================================
|
|
4
|
-
#
|
|
5
|
-
# Comprehensive evaluation suite for the security-testing skill per ADR-056.
|
|
6
|
-
# Tests OWASP Top 10 2021 detection, severity classification, remediation
|
|
7
|
-
# quality, and cross-model consistency.
|
|
8
|
-
#
|
|
9
|
-
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
|
|
10
|
-
# Validator: .claude/skills/security-testing/scripts/validate-config.json
|
|
11
|
-
#
|
|
12
|
-
# Coverage:
|
|
13
|
-
# - OWASP A01:2021 - Broken Access Control
|
|
14
|
-
# - OWASP A02:2021 - Cryptographic Failures
|
|
15
|
-
# - OWASP A03:2021 - Injection (SQL, XSS, Command)
|
|
16
|
-
# - OWASP A07:2021 - Identification and Authentication Failures
|
|
17
|
-
# - Negative tests (no false positives on secure code)
|
|
18
|
-
#
|
|
19
|
-
# =============================================================================
|
|
20
|
-
|
|
21
|
-
skill: security-testing
|
|
22
|
-
version: 1.0.0
|
|
23
|
-
description: >
|
|
24
|
-
Comprehensive evaluation suite for the security-testing skill.
|
|
25
|
-
Tests OWASP Top 10 2021 detection capabilities, CWE classification accuracy,
|
|
26
|
-
CVSS scoring, severity classification, and remediation quality.
|
|
27
|
-
Supports multi-model testing and integrates with ReasoningBank for
|
|
28
|
-
continuous improvement.
|
|
29
|
-
|
|
30
|
-
# =============================================================================
|
|
31
|
-
# Multi-Model Configuration
|
|
32
|
-
# =============================================================================
|
|
33
|
-
|
|
34
|
-
models_to_test:
|
|
35
|
-
- claude-3.5-sonnet # Primary model (high accuracy expected)
|
|
36
|
-
- claude-3-haiku # Fast model (minimum quality threshold)
|
|
37
|
-
- gpt-4o # Cross-vendor validation
|
|
38
|
-
|
|
39
|
-
# =============================================================================
|
|
40
|
-
# MCP Integration Configuration
|
|
41
|
-
# =============================================================================
|
|
42
|
-
|
|
43
|
-
mcp_integration:
|
|
44
|
-
enabled: true
|
|
45
|
-
namespace: skill-validation
|
|
46
|
-
|
|
47
|
-
# Query existing security patterns before running evals
|
|
48
|
-
query_patterns: true
|
|
49
|
-
|
|
50
|
-
# Track each test outcome for learning feedback loop
|
|
51
|
-
track_outcomes: true
|
|
52
|
-
|
|
53
|
-
# Store successful patterns after evals complete
|
|
54
|
-
store_patterns: true
|
|
55
|
-
|
|
56
|
-
# Share learning with fleet coordinator agents
|
|
57
|
-
share_learning: true
|
|
58
|
-
|
|
59
|
-
# Update quality gate with validation metrics
|
|
60
|
-
update_quality_gate: true
|
|
61
|
-
|
|
62
|
-
# Target agents for learning distribution
|
|
63
|
-
target_agents:
|
|
64
|
-
- qe-learning-coordinator
|
|
65
|
-
- qe-queen-coordinator
|
|
66
|
-
- qe-security-scanner
|
|
67
|
-
- qe-security-auditor
|
|
68
|
-
|
|
69
|
-
# =============================================================================
|
|
70
|
-
# ReasoningBank Learning Configuration
|
|
71
|
-
# =============================================================================
|
|
72
|
-
|
|
73
|
-
learning:
|
|
74
|
-
store_success_patterns: true
|
|
75
|
-
store_failure_patterns: true
|
|
76
|
-
pattern_ttl_days: 90
|
|
77
|
-
min_confidence_to_store: 0.7
|
|
78
|
-
cross_model_comparison: true
|
|
79
|
-
|
|
80
|
-
# =============================================================================
|
|
81
|
-
# Result Format Configuration
|
|
82
|
-
# =============================================================================
|
|
83
|
-
|
|
84
|
-
result_format:
|
|
85
|
-
json_output: true
|
|
86
|
-
markdown_report: true
|
|
87
|
-
include_raw_output: false
|
|
88
|
-
include_timing: true
|
|
89
|
-
include_token_usage: true
|
|
90
|
-
|
|
91
|
-
# =============================================================================
|
|
92
|
-
# Environment Setup
|
|
93
|
-
# =============================================================================
|
|
94
|
-
|
|
95
|
-
setup:
|
|
96
|
-
required_tools:
|
|
97
|
-
- jq # JSON parsing (required)
|
|
98
|
-
- npm # Dependency audit (optional but recommended)
|
|
99
|
-
|
|
100
|
-
environment_variables:
|
|
101
|
-
SECURITY_SCAN_DEPTH: "deep"
|
|
102
|
-
OWASP_ENABLED: "true"
|
|
103
|
-
SEVERITY_THRESHOLD: "medium"
|
|
104
|
-
|
|
105
|
-
fixtures:
|
|
106
|
-
- name: vulnerable_express_app
|
|
107
|
-
path: fixtures/vulnerable-express-app.js
|
|
108
|
-
content: |
|
|
109
|
-
const express = require('express');
|
|
110
|
-
const app = express();
|
|
111
|
-
|
|
112
|
-
// SQL Injection vulnerability
|
|
113
|
-
app.get('/user', (req, res) => {
|
|
114
|
-
const query = `SELECT * FROM users WHERE id = ${req.params.id}`;
|
|
115
|
-
db.query(query);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// XSS vulnerability
|
|
119
|
-
app.get('/profile', (req, res) => {
|
|
120
|
-
res.send(`<h1>Hello ${req.query.name}</h1>`);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
// Path Traversal vulnerability
|
|
124
|
-
app.get('/file', (req, res) => {
|
|
125
|
-
const path = './uploads/' + req.query.filename;
|
|
126
|
-
res.sendFile(path);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
# =============================================================================
|
|
130
|
-
# TEST CASES
|
|
131
|
-
# =============================================================================
|
|
132
|
-
|
|
133
|
-
test_cases:
|
|
134
|
-
# ---------------------------------------------------------------------------
|
|
135
|
-
# CATEGORY: SQL Injection (OWASP A03:2021)
|
|
136
|
-
# ---------------------------------------------------------------------------
|
|
137
|
-
|
|
138
|
-
- id: tc001_sql_injection_string_concat
|
|
139
|
-
description: "Detect SQL injection via string concatenation in Node.js"
|
|
140
|
-
category: injection
|
|
141
|
-
priority: critical
|
|
142
|
-
|
|
143
|
-
input:
|
|
144
|
-
code: |
|
|
145
|
-
const express = require('express');
|
|
146
|
-
const mysql = require('mysql');
|
|
147
|
-
const app = express();
|
|
148
|
-
|
|
149
|
-
app.get('/api/users', (req, res) => {
|
|
150
|
-
const userId = req.params.id;
|
|
151
|
-
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
152
|
-
db.query(query, (err, results) => {
|
|
153
|
-
res.json(results);
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
context:
|
|
157
|
-
language: javascript
|
|
158
|
-
framework: express
|
|
159
|
-
environment: production
|
|
160
|
-
|
|
161
|
-
expected_output:
|
|
162
|
-
must_contain:
|
|
163
|
-
- "SQL injection"
|
|
164
|
-
- "parameterized"
|
|
165
|
-
must_not_contain:
|
|
166
|
-
- "no vulnerabilities"
|
|
167
|
-
- "secure"
|
|
168
|
-
must_match_regex:
|
|
169
|
-
- "CWE-89|CWE-564"
|
|
170
|
-
- "A03:20[21][0-9]"
|
|
171
|
-
severity_classification: critical
|
|
172
|
-
finding_count:
|
|
173
|
-
min: 1
|
|
174
|
-
max: 3
|
|
175
|
-
recommendation_count:
|
|
176
|
-
min: 1
|
|
177
|
-
|
|
178
|
-
validation:
|
|
179
|
-
schema_check: true
|
|
180
|
-
keyword_match_threshold: 0.8
|
|
181
|
-
reasoning_quality_min: 0.7
|
|
182
|
-
grading_rubric:
|
|
183
|
-
completeness: 0.3
|
|
184
|
-
accuracy: 0.5
|
|
185
|
-
actionability: 0.2
|
|
186
|
-
|
|
187
|
-
timeout_ms: 30000
|
|
188
|
-
|
|
189
|
-
- id: tc002_sql_injection_parameterized_safe
|
|
190
|
-
description: "Verify parameterized queries are NOT flagged as vulnerable"
|
|
191
|
-
category: injection
|
|
192
|
-
priority: high
|
|
193
|
-
|
|
194
|
-
input:
|
|
195
|
-
code: |
|
|
196
|
-
app.get('/api/users', (req, res) => {
|
|
197
|
-
const userId = parseInt(req.params.id, 10);
|
|
198
|
-
db.query('SELECT * FROM users WHERE id = ?', [userId], (err, results) => {
|
|
199
|
-
res.json(results);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
context:
|
|
203
|
-
language: javascript
|
|
204
|
-
framework: express
|
|
205
|
-
|
|
206
|
-
expected_output:
|
|
207
|
-
must_contain:
|
|
208
|
-
- "parameterized"
|
|
209
|
-
- "secure"
|
|
210
|
-
must_not_contain:
|
|
211
|
-
- "SQL injection"
|
|
212
|
-
- "critical"
|
|
213
|
-
- "vulnerable"
|
|
214
|
-
severity_classification: info
|
|
215
|
-
finding_count:
|
|
216
|
-
max: 1
|
|
217
|
-
|
|
218
|
-
validation:
|
|
219
|
-
schema_check: true
|
|
220
|
-
keyword_match_threshold: 0.7
|
|
221
|
-
allow_partial: true
|
|
222
|
-
|
|
223
|
-
# ---------------------------------------------------------------------------
|
|
224
|
-
# CATEGORY: Cross-Site Scripting (OWASP A03:2021)
|
|
225
|
-
# ---------------------------------------------------------------------------
|
|
226
|
-
|
|
227
|
-
- id: tc003_xss_reflected_html_output
|
|
228
|
-
description: "Detect reflected XSS in unescaped HTML output"
|
|
229
|
-
category: injection
|
|
230
|
-
priority: critical
|
|
231
|
-
|
|
232
|
-
input:
|
|
233
|
-
code: |
|
|
234
|
-
app.get('/profile', (req, res) => {
|
|
235
|
-
const name = req.query.name;
|
|
236
|
-
res.send(`
|
|
237
|
-
<html>
|
|
238
|
-
<body>
|
|
239
|
-
<h1>Welcome, ${name}!</h1>
|
|
240
|
-
<p>Your profile has been loaded.</p>
|
|
241
|
-
</body>
|
|
242
|
-
</html>
|
|
243
|
-
`);
|
|
244
|
-
});
|
|
245
|
-
context:
|
|
246
|
-
language: javascript
|
|
247
|
-
framework: express
|
|
248
|
-
|
|
249
|
-
expected_output:
|
|
250
|
-
must_contain:
|
|
251
|
-
- "XSS"
|
|
252
|
-
- "cross-site scripting"
|
|
253
|
-
- "sanitize"
|
|
254
|
-
- "escape"
|
|
255
|
-
must_match_regex:
|
|
256
|
-
- "CWE-79"
|
|
257
|
-
severity_classification: high
|
|
258
|
-
finding_count:
|
|
259
|
-
min: 1
|
|
260
|
-
|
|
261
|
-
validation:
|
|
262
|
-
schema_check: true
|
|
263
|
-
keyword_match_threshold: 0.8
|
|
264
|
-
reasoning_quality_min: 0.75
|
|
265
|
-
|
|
266
|
-
- id: tc004_xss_dom_based_innerhtml
|
|
267
|
-
description: "Detect DOM-based XSS via innerHTML assignment"
|
|
268
|
-
category: injection
|
|
269
|
-
priority: high
|
|
270
|
-
|
|
271
|
-
input:
|
|
272
|
-
code: |
|
|
273
|
-
// Client-side JavaScript
|
|
274
|
-
const params = new URLSearchParams(window.location.search);
|
|
275
|
-
const message = params.get('msg');
|
|
276
|
-
document.getElementById('output').innerHTML = message;
|
|
277
|
-
context:
|
|
278
|
-
language: javascript
|
|
279
|
-
framework: vanilla
|
|
280
|
-
environment: production
|
|
281
|
-
|
|
282
|
-
expected_output:
|
|
283
|
-
must_contain:
|
|
284
|
-
- "DOM"
|
|
285
|
-
- "XSS"
|
|
286
|
-
- "innerHTML"
|
|
287
|
-
- "textContent"
|
|
288
|
-
must_match_regex:
|
|
289
|
-
- "CWE-79"
|
|
290
|
-
severity_classification: high
|
|
291
|
-
|
|
292
|
-
validation:
|
|
293
|
-
schema_check: true
|
|
294
|
-
keyword_match_threshold: 0.7
|
|
295
|
-
|
|
296
|
-
# ---------------------------------------------------------------------------
|
|
297
|
-
# CATEGORY: Authentication Failures (OWASP A07:2021)
|
|
298
|
-
# ---------------------------------------------------------------------------
|
|
299
|
-
|
|
300
|
-
- id: tc005_hardcoded_credentials
|
|
301
|
-
description: "Detect hardcoded credentials and API keys"
|
|
302
|
-
category: authentication
|
|
303
|
-
priority: critical
|
|
304
|
-
|
|
305
|
-
input:
|
|
306
|
-
code: |
|
|
307
|
-
const ADMIN_PASSWORD = 'admin123';
|
|
308
|
-
const API_KEY = 'sk-1234567890abcdef';
|
|
309
|
-
const DATABASE_URL = 'postgres://admin:password123@localhost/db';
|
|
310
|
-
|
|
311
|
-
app.post('/login', (req, res) => {
|
|
312
|
-
if (req.body.password === ADMIN_PASSWORD) {
|
|
313
|
-
req.session.isAdmin = true;
|
|
314
|
-
res.send('Login successful');
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
context:
|
|
318
|
-
language: javascript
|
|
319
|
-
framework: express
|
|
320
|
-
|
|
321
|
-
expected_output:
|
|
322
|
-
must_contain:
|
|
323
|
-
- "hardcoded"
|
|
324
|
-
- "credentials"
|
|
325
|
-
- "secret"
|
|
326
|
-
- "environment variable"
|
|
327
|
-
must_match_regex:
|
|
328
|
-
- "CWE-798|CWE-259"
|
|
329
|
-
severity_classification: critical
|
|
330
|
-
finding_count:
|
|
331
|
-
min: 2
|
|
332
|
-
|
|
333
|
-
validation:
|
|
334
|
-
schema_check: true
|
|
335
|
-
keyword_match_threshold: 0.8
|
|
336
|
-
reasoning_quality_min: 0.8
|
|
337
|
-
|
|
338
|
-
- id: tc006_weak_password_hashing
|
|
339
|
-
description: "Detect weak password hashing algorithms (MD5, SHA1)"
|
|
340
|
-
category: authentication
|
|
341
|
-
priority: high
|
|
342
|
-
|
|
343
|
-
input:
|
|
344
|
-
code: |
|
|
345
|
-
const crypto = require('crypto');
|
|
346
|
-
|
|
347
|
-
function hashPassword(password) {
|
|
348
|
-
return crypto.createHash('md5').update(password).digest('hex');
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
function verifyPassword(password, hash) {
|
|
352
|
-
return hashPassword(password) === hash;
|
|
353
|
-
}
|
|
354
|
-
context:
|
|
355
|
-
language: javascript
|
|
356
|
-
framework: nodejs
|
|
357
|
-
|
|
358
|
-
expected_output:
|
|
359
|
-
must_contain:
|
|
360
|
-
- "MD5"
|
|
361
|
-
- "weak"
|
|
362
|
-
- "bcrypt"
|
|
363
|
-
- "argon2"
|
|
364
|
-
must_match_regex:
|
|
365
|
-
- "CWE-327|CWE-328|CWE-916"
|
|
366
|
-
severity_classification: high
|
|
367
|
-
finding_count:
|
|
368
|
-
min: 1
|
|
369
|
-
|
|
370
|
-
validation:
|
|
371
|
-
schema_check: true
|
|
372
|
-
keyword_match_threshold: 0.8
|
|
373
|
-
|
|
374
|
-
# ---------------------------------------------------------------------------
|
|
375
|
-
# CATEGORY: Broken Access Control (OWASP A01:2021)
|
|
376
|
-
# ---------------------------------------------------------------------------
|
|
377
|
-
|
|
378
|
-
- id: tc007_idor_missing_authorization
|
|
379
|
-
description: "Detect IDOR vulnerability with missing authorization check"
|
|
380
|
-
category: authorization
|
|
381
|
-
priority: critical
|
|
382
|
-
|
|
383
|
-
input:
|
|
384
|
-
code: |
|
|
385
|
-
app.get('/api/users/:id/profile', (req, res) => {
|
|
386
|
-
// No authorization check - any user can access any profile
|
|
387
|
-
const userId = req.params.id;
|
|
388
|
-
db.query('SELECT * FROM profiles WHERE user_id = ?', [userId])
|
|
389
|
-
.then(profile => res.json(profile));
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
app.delete('/api/users/:id', (req, res) => {
|
|
393
|
-
// No check if requesting user owns this account
|
|
394
|
-
db.query('DELETE FROM users WHERE id = ?', [req.params.id]);
|
|
395
|
-
res.send('User deleted');
|
|
396
|
-
});
|
|
397
|
-
context:
|
|
398
|
-
language: javascript
|
|
399
|
-
framework: express
|
|
400
|
-
|
|
401
|
-
expected_output:
|
|
402
|
-
must_contain:
|
|
403
|
-
- "authorization"
|
|
404
|
-
- "access control"
|
|
405
|
-
- "IDOR"
|
|
406
|
-
- "ownership"
|
|
407
|
-
must_match_regex:
|
|
408
|
-
- "CWE-639|CWE-284|CWE-862"
|
|
409
|
-
- "A01:2021"
|
|
410
|
-
severity_classification: critical
|
|
411
|
-
|
|
412
|
-
validation:
|
|
413
|
-
schema_check: true
|
|
414
|
-
keyword_match_threshold: 0.7
|
|
415
|
-
|
|
416
|
-
# ---------------------------------------------------------------------------
|
|
417
|
-
# CATEGORY: Cryptographic Failures (OWASP A02:2021)
|
|
418
|
-
# ---------------------------------------------------------------------------
|
|
419
|
-
|
|
420
|
-
- id: tc008_weak_encryption_des
|
|
421
|
-
description: "Detect use of weak encryption algorithms (DES, RC4)"
|
|
422
|
-
category: cryptography
|
|
423
|
-
priority: high
|
|
424
|
-
|
|
425
|
-
input:
|
|
426
|
-
code: |
|
|
427
|
-
const crypto = require('crypto');
|
|
428
|
-
|
|
429
|
-
function encryptData(data, key) {
|
|
430
|
-
const cipher = crypto.createCipher('des', key);
|
|
431
|
-
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
function decryptData(data, key) {
|
|
435
|
-
const decipher = crypto.createDecipher('des', key);
|
|
436
|
-
return decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
|
|
437
|
-
}
|
|
438
|
-
context:
|
|
439
|
-
language: javascript
|
|
440
|
-
framework: nodejs
|
|
441
|
-
|
|
442
|
-
expected_output:
|
|
443
|
-
must_contain:
|
|
444
|
-
- "DES"
|
|
445
|
-
- "weak"
|
|
446
|
-
- "deprecated"
|
|
447
|
-
- "AES"
|
|
448
|
-
must_match_regex:
|
|
449
|
-
- "CWE-327|CWE-328"
|
|
450
|
-
- "A02:2021"
|
|
451
|
-
severity_classification: high
|
|
452
|
-
|
|
453
|
-
validation:
|
|
454
|
-
schema_check: true
|
|
455
|
-
keyword_match_threshold: 0.7
|
|
456
|
-
|
|
457
|
-
- id: tc009_plaintext_password_storage
|
|
458
|
-
description: "Detect plaintext password storage"
|
|
459
|
-
category: cryptography
|
|
460
|
-
priority: critical
|
|
461
|
-
|
|
462
|
-
input:
|
|
463
|
-
code: |
|
|
464
|
-
class User {
|
|
465
|
-
constructor(email, password) {
|
|
466
|
-
this.email = email;
|
|
467
|
-
this.password = password; // Stored in plaintext!
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
save() {
|
|
471
|
-
db.query('INSERT INTO users (email, password) VALUES (?, ?)',
|
|
472
|
-
[this.email, this.password]);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
context:
|
|
476
|
-
language: javascript
|
|
477
|
-
framework: nodejs
|
|
478
|
-
|
|
479
|
-
expected_output:
|
|
480
|
-
must_contain:
|
|
481
|
-
- "plaintext"
|
|
482
|
-
- "password"
|
|
483
|
-
- "hash"
|
|
484
|
-
- "bcrypt"
|
|
485
|
-
must_match_regex:
|
|
486
|
-
- "CWE-256|CWE-312"
|
|
487
|
-
- "A02:2021"
|
|
488
|
-
severity_classification: critical
|
|
489
|
-
|
|
490
|
-
validation:
|
|
491
|
-
schema_check: true
|
|
492
|
-
keyword_match_threshold: 0.8
|
|
493
|
-
|
|
494
|
-
# ---------------------------------------------------------------------------
|
|
495
|
-
# CATEGORY: Path Traversal (Related to A01:2021)
|
|
496
|
-
# ---------------------------------------------------------------------------
|
|
497
|
-
|
|
498
|
-
- id: tc010_path_traversal_file_access
|
|
499
|
-
description: "Detect path traversal vulnerability in file access"
|
|
500
|
-
category: injection
|
|
501
|
-
priority: critical
|
|
502
|
-
|
|
503
|
-
input:
|
|
504
|
-
code: |
|
|
505
|
-
const fs = require('fs');
|
|
506
|
-
|
|
507
|
-
app.get('/download', (req, res) => {
|
|
508
|
-
const filename = req.query.file;
|
|
509
|
-
const filepath = './uploads/' + filename;
|
|
510
|
-
res.sendFile(filepath);
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
app.get('/read', (req, res) => {
|
|
514
|
-
const content = fs.readFileSync('./data/' + req.params.name);
|
|
515
|
-
res.send(content);
|
|
516
|
-
});
|
|
517
|
-
context:
|
|
518
|
-
language: javascript
|
|
519
|
-
framework: express
|
|
520
|
-
|
|
521
|
-
expected_output:
|
|
522
|
-
must_contain:
|
|
523
|
-
- "path traversal"
|
|
524
|
-
- "directory traversal"
|
|
525
|
-
- "../"
|
|
526
|
-
- "sanitize"
|
|
527
|
-
must_match_regex:
|
|
528
|
-
- "CWE-22|CWE-23"
|
|
529
|
-
severity_classification: critical
|
|
530
|
-
|
|
531
|
-
validation:
|
|
532
|
-
schema_check: true
|
|
533
|
-
keyword_match_threshold: 0.7
|
|
534
|
-
|
|
535
|
-
# ---------------------------------------------------------------------------
|
|
536
|
-
# CATEGORY: Negative Tests (No False Positives)
|
|
537
|
-
# ---------------------------------------------------------------------------
|
|
538
|
-
|
|
539
|
-
- id: tc011_secure_code_no_false_positives
|
|
540
|
-
description: "Verify secure code is NOT flagged as vulnerable"
|
|
541
|
-
category: negative
|
|
542
|
-
priority: critical
|
|
543
|
-
|
|
544
|
-
input:
|
|
545
|
-
code: |
|
|
546
|
-
const express = require('express');
|
|
547
|
-
const helmet = require('helmet');
|
|
548
|
-
const rateLimit = require('express-rate-limit');
|
|
549
|
-
const bcrypt = require('bcrypt');
|
|
550
|
-
const validator = require('validator');
|
|
551
|
-
|
|
552
|
-
const app = express();
|
|
553
|
-
app.use(helmet());
|
|
554
|
-
app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
|
|
555
|
-
|
|
556
|
-
app.post('/api/users', async (req, res) => {
|
|
557
|
-
const { email, password } = req.body;
|
|
558
|
-
|
|
559
|
-
// Input validation
|
|
560
|
-
if (!validator.isEmail(email)) {
|
|
561
|
-
return res.status(400).json({ error: 'Invalid email' });
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
// Secure password hashing
|
|
565
|
-
const hashedPassword = await bcrypt.hash(password, 12);
|
|
566
|
-
|
|
567
|
-
// Parameterized query
|
|
568
|
-
await db.query(
|
|
569
|
-
'INSERT INTO users (email, password) VALUES ($1, $2)',
|
|
570
|
-
[email, hashedPassword]
|
|
571
|
-
);
|
|
572
|
-
|
|
573
|
-
res.status(201).json({ message: 'User created' });
|
|
574
|
-
});
|
|
575
|
-
context:
|
|
576
|
-
language: javascript
|
|
577
|
-
framework: express
|
|
578
|
-
environment: production
|
|
579
|
-
|
|
580
|
-
expected_output:
|
|
581
|
-
must_contain:
|
|
582
|
-
- "secure"
|
|
583
|
-
- "best practice"
|
|
584
|
-
must_not_contain:
|
|
585
|
-
- "SQL injection"
|
|
586
|
-
- "XSS"
|
|
587
|
-
- "critical vulnerability"
|
|
588
|
-
- "high severity"
|
|
589
|
-
finding_count:
|
|
590
|
-
max: 2 # Allow informational findings only
|
|
591
|
-
|
|
592
|
-
validation:
|
|
593
|
-
schema_check: true
|
|
594
|
-
keyword_match_threshold: 0.6
|
|
595
|
-
allow_partial: true
|
|
596
|
-
|
|
597
|
-
- id: tc012_secure_auth_implementation
|
|
598
|
-
description: "Verify secure authentication is recognized as safe"
|
|
599
|
-
category: negative
|
|
600
|
-
priority: high
|
|
601
|
-
|
|
602
|
-
input:
|
|
603
|
-
code: |
|
|
604
|
-
const bcrypt = require('bcrypt');
|
|
605
|
-
const jwt = require('jsonwebtoken');
|
|
606
|
-
|
|
607
|
-
async function login(email, password) {
|
|
608
|
-
const user = await User.findByEmail(email);
|
|
609
|
-
if (!user) {
|
|
610
|
-
return { error: 'Invalid credentials' };
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
const match = await bcrypt.compare(password, user.passwordHash);
|
|
614
|
-
if (!match) {
|
|
615
|
-
return { error: 'Invalid credentials' };
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
const token = jwt.sign(
|
|
619
|
-
{ userId: user.id },
|
|
620
|
-
process.env.JWT_SECRET,
|
|
621
|
-
{ expiresIn: '1h' }
|
|
622
|
-
);
|
|
623
|
-
|
|
624
|
-
return { token };
|
|
625
|
-
}
|
|
626
|
-
context:
|
|
627
|
-
language: javascript
|
|
628
|
-
framework: nodejs
|
|
629
|
-
|
|
630
|
-
expected_output:
|
|
631
|
-
must_contain:
|
|
632
|
-
- "bcrypt"
|
|
633
|
-
- "jwt"
|
|
634
|
-
- "secure"
|
|
635
|
-
must_not_contain:
|
|
636
|
-
- "vulnerable"
|
|
637
|
-
- "critical"
|
|
638
|
-
- "hardcoded"
|
|
639
|
-
severity_classification: info
|
|
640
|
-
|
|
641
|
-
validation:
|
|
642
|
-
schema_check: true
|
|
643
|
-
allow_partial: true
|
|
644
|
-
|
|
645
|
-
# ---------------------------------------------------------------------------
|
|
646
|
-
# CATEGORY: Python Security (Multi-language Support)
|
|
647
|
-
# ---------------------------------------------------------------------------
|
|
648
|
-
|
|
649
|
-
- id: tc013_python_sql_injection
|
|
650
|
-
description: "Detect SQL injection in Python Flask application"
|
|
651
|
-
category: injection
|
|
652
|
-
priority: critical
|
|
653
|
-
|
|
654
|
-
input:
|
|
655
|
-
code: |
|
|
656
|
-
from flask import Flask, request
|
|
657
|
-
import sqlite3
|
|
658
|
-
|
|
659
|
-
app = Flask(__name__)
|
|
660
|
-
|
|
661
|
-
@app.route('/user')
|
|
662
|
-
def get_user():
|
|
663
|
-
user_id = request.args.get('id')
|
|
664
|
-
conn = sqlite3.connect('users.db')
|
|
665
|
-
cursor = conn.cursor()
|
|
666
|
-
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
667
|
-
return str(cursor.fetchone())
|
|
668
|
-
context:
|
|
669
|
-
language: python
|
|
670
|
-
framework: flask
|
|
671
|
-
|
|
672
|
-
expected_output:
|
|
673
|
-
must_contain:
|
|
674
|
-
- "SQL injection"
|
|
675
|
-
- "parameterized"
|
|
676
|
-
- "f-string"
|
|
677
|
-
must_match_regex:
|
|
678
|
-
- "CWE-89"
|
|
679
|
-
severity_classification: critical
|
|
680
|
-
finding_count:
|
|
681
|
-
min: 1
|
|
682
|
-
|
|
683
|
-
validation:
|
|
684
|
-
schema_check: true
|
|
685
|
-
keyword_match_threshold: 0.7
|
|
686
|
-
|
|
687
|
-
- id: tc014_python_ssti_jinja
|
|
688
|
-
description: "Detect Server-Side Template Injection in Jinja2"
|
|
689
|
-
category: injection
|
|
690
|
-
priority: critical
|
|
691
|
-
|
|
692
|
-
input:
|
|
693
|
-
code: |
|
|
694
|
-
from flask import Flask, request, render_template_string
|
|
695
|
-
|
|
696
|
-
app = Flask(__name__)
|
|
697
|
-
|
|
698
|
-
@app.route('/render')
|
|
699
|
-
def render():
|
|
700
|
-
template = request.args.get('template')
|
|
701
|
-
return render_template_string(template)
|
|
702
|
-
context:
|
|
703
|
-
language: python
|
|
704
|
-
framework: flask
|
|
705
|
-
|
|
706
|
-
expected_output:
|
|
707
|
-
must_contain:
|
|
708
|
-
- "SSTI"
|
|
709
|
-
- "template injection"
|
|
710
|
-
- "render_template_string"
|
|
711
|
-
- "Jinja2"
|
|
712
|
-
must_match_regex:
|
|
713
|
-
- "CWE-94|CWE-1336"
|
|
714
|
-
severity_classification: critical
|
|
715
|
-
|
|
716
|
-
validation:
|
|
717
|
-
schema_check: true
|
|
718
|
-
keyword_match_threshold: 0.7
|
|
719
|
-
|
|
720
|
-
- id: tc015_python_pickle_deserialization
|
|
721
|
-
description: "Detect insecure deserialization with pickle"
|
|
722
|
-
category: injection
|
|
723
|
-
priority: critical
|
|
724
|
-
|
|
725
|
-
input:
|
|
726
|
-
code: |
|
|
727
|
-
import pickle
|
|
728
|
-
from flask import Flask, request
|
|
729
|
-
|
|
730
|
-
app = Flask(__name__)
|
|
731
|
-
|
|
732
|
-
@app.route('/load')
|
|
733
|
-
def load_data():
|
|
734
|
-
data = request.get_data()
|
|
735
|
-
obj = pickle.loads(data)
|
|
736
|
-
return str(obj)
|
|
737
|
-
context:
|
|
738
|
-
language: python
|
|
739
|
-
framework: flask
|
|
740
|
-
|
|
741
|
-
expected_output:
|
|
742
|
-
must_contain:
|
|
743
|
-
- "pickle"
|
|
744
|
-
- "deserialization"
|
|
745
|
-
- "untrusted"
|
|
746
|
-
- "RCE"
|
|
747
|
-
must_match_regex:
|
|
748
|
-
- "CWE-502"
|
|
749
|
-
- "A08:2021"
|
|
750
|
-
severity_classification: critical
|
|
751
|
-
|
|
752
|
-
validation:
|
|
753
|
-
schema_check: true
|
|
754
|
-
keyword_match_threshold: 0.7
|
|
755
|
-
|
|
756
|
-
# =============================================================================
|
|
757
|
-
# SUCCESS CRITERIA
|
|
758
|
-
# =============================================================================
|
|
759
|
-
|
|
760
|
-
success_criteria:
|
|
761
|
-
# Overall pass rate (90% of tests must pass)
|
|
762
|
-
pass_rate: 0.9
|
|
763
|
-
|
|
764
|
-
# Critical tests must ALL pass (100%)
|
|
765
|
-
critical_pass_rate: 1.0
|
|
766
|
-
|
|
767
|
-
# Average reasoning quality score
|
|
768
|
-
avg_reasoning_quality: 0.75
|
|
769
|
-
|
|
770
|
-
# Maximum suite execution time (5 minutes)
|
|
771
|
-
max_execution_time_ms: 300000
|
|
772
|
-
|
|
773
|
-
# Maximum variance between model results (15%)
|
|
774
|
-
cross_model_variance: 0.15
|
|
775
|
-
|
|
776
|
-
# =============================================================================
|
|
777
|
-
# METADATA
|
|
778
|
-
# =============================================================================
|
|
779
|
-
|
|
780
|
-
metadata:
|
|
781
|
-
author: "qe-security-auditor"
|
|
782
|
-
created: "2026-02-02"
|
|
783
|
-
last_updated: "2026-02-02"
|
|
784
|
-
coverage_target: >
|
|
785
|
-
OWASP Top 10 2021: A01 (Broken Access Control), A02 (Cryptographic Failures),
|
|
786
|
-
A03 (Injection - SQL, XSS, SSTI, Command), A07 (Authentication Failures),
|
|
787
|
-
A08 (Software Integrity - Deserialization). Covers JavaScript/Node.js
|
|
788
|
-
Express apps and Python Flask apps. 15 test cases with 90% pass rate
|
|
789
|
-
requirement and 100% critical pass rate.
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# AQE Skill Evaluation Test Suite: Security Testing v1.0.0
|
|
3
|
+
# =============================================================================
|
|
4
|
+
#
|
|
5
|
+
# Comprehensive evaluation suite for the security-testing skill per ADR-056.
|
|
6
|
+
# Tests OWASP Top 10 2021 detection, severity classification, remediation
|
|
7
|
+
# quality, and cross-model consistency.
|
|
8
|
+
#
|
|
9
|
+
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
|
|
10
|
+
# Validator: .claude/skills/security-testing/scripts/validate-config.json
|
|
11
|
+
#
|
|
12
|
+
# Coverage:
|
|
13
|
+
# - OWASP A01:2021 - Broken Access Control
|
|
14
|
+
# - OWASP A02:2021 - Cryptographic Failures
|
|
15
|
+
# - OWASP A03:2021 - Injection (SQL, XSS, Command)
|
|
16
|
+
# - OWASP A07:2021 - Identification and Authentication Failures
|
|
17
|
+
# - Negative tests (no false positives on secure code)
|
|
18
|
+
#
|
|
19
|
+
# =============================================================================
|
|
20
|
+
|
|
21
|
+
skill: security-testing
|
|
22
|
+
version: 1.0.0
|
|
23
|
+
description: >
|
|
24
|
+
Comprehensive evaluation suite for the security-testing skill.
|
|
25
|
+
Tests OWASP Top 10 2021 detection capabilities, CWE classification accuracy,
|
|
26
|
+
CVSS scoring, severity classification, and remediation quality.
|
|
27
|
+
Supports multi-model testing and integrates with ReasoningBank for
|
|
28
|
+
continuous improvement.
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# Multi-Model Configuration
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
models_to_test:
|
|
35
|
+
- claude-3.5-sonnet # Primary model (high accuracy expected)
|
|
36
|
+
- claude-3-haiku # Fast model (minimum quality threshold)
|
|
37
|
+
- gpt-4o # Cross-vendor validation
|
|
38
|
+
|
|
39
|
+
# =============================================================================
|
|
40
|
+
# MCP Integration Configuration
|
|
41
|
+
# =============================================================================
|
|
42
|
+
|
|
43
|
+
mcp_integration:
|
|
44
|
+
enabled: true
|
|
45
|
+
namespace: skill-validation
|
|
46
|
+
|
|
47
|
+
# Query existing security patterns before running evals
|
|
48
|
+
query_patterns: true
|
|
49
|
+
|
|
50
|
+
# Track each test outcome for learning feedback loop
|
|
51
|
+
track_outcomes: true
|
|
52
|
+
|
|
53
|
+
# Store successful patterns after evals complete
|
|
54
|
+
store_patterns: true
|
|
55
|
+
|
|
56
|
+
# Share learning with fleet coordinator agents
|
|
57
|
+
share_learning: true
|
|
58
|
+
|
|
59
|
+
# Update quality gate with validation metrics
|
|
60
|
+
update_quality_gate: true
|
|
61
|
+
|
|
62
|
+
# Target agents for learning distribution
|
|
63
|
+
target_agents:
|
|
64
|
+
- qe-learning-coordinator
|
|
65
|
+
- qe-queen-coordinator
|
|
66
|
+
- qe-security-scanner
|
|
67
|
+
- qe-security-auditor
|
|
68
|
+
|
|
69
|
+
# =============================================================================
|
|
70
|
+
# ReasoningBank Learning Configuration
|
|
71
|
+
# =============================================================================
|
|
72
|
+
|
|
73
|
+
learning:
|
|
74
|
+
store_success_patterns: true
|
|
75
|
+
store_failure_patterns: true
|
|
76
|
+
pattern_ttl_days: 90
|
|
77
|
+
min_confidence_to_store: 0.7
|
|
78
|
+
cross_model_comparison: true
|
|
79
|
+
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# Result Format Configuration
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
result_format:
|
|
85
|
+
json_output: true
|
|
86
|
+
markdown_report: true
|
|
87
|
+
include_raw_output: false
|
|
88
|
+
include_timing: true
|
|
89
|
+
include_token_usage: true
|
|
90
|
+
|
|
91
|
+
# =============================================================================
|
|
92
|
+
# Environment Setup
|
|
93
|
+
# =============================================================================
|
|
94
|
+
|
|
95
|
+
setup:
|
|
96
|
+
required_tools:
|
|
97
|
+
- jq # JSON parsing (required)
|
|
98
|
+
- npm # Dependency audit (optional but recommended)
|
|
99
|
+
|
|
100
|
+
environment_variables:
|
|
101
|
+
SECURITY_SCAN_DEPTH: "deep"
|
|
102
|
+
OWASP_ENABLED: "true"
|
|
103
|
+
SEVERITY_THRESHOLD: "medium"
|
|
104
|
+
|
|
105
|
+
fixtures:
|
|
106
|
+
- name: vulnerable_express_app
|
|
107
|
+
path: fixtures/vulnerable-express-app.js
|
|
108
|
+
content: |
|
|
109
|
+
const express = require('express');
|
|
110
|
+
const app = express();
|
|
111
|
+
|
|
112
|
+
// SQL Injection vulnerability
|
|
113
|
+
app.get('/user', (req, res) => {
|
|
114
|
+
const query = `SELECT * FROM users WHERE id = ${req.params.id}`;
|
|
115
|
+
db.query(query);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// XSS vulnerability
|
|
119
|
+
app.get('/profile', (req, res) => {
|
|
120
|
+
res.send(`<h1>Hello ${req.query.name}</h1>`);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// Path Traversal vulnerability
|
|
124
|
+
app.get('/file', (req, res) => {
|
|
125
|
+
const path = './uploads/' + req.query.filename;
|
|
126
|
+
res.sendFile(path);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
# =============================================================================
|
|
130
|
+
# TEST CASES
|
|
131
|
+
# =============================================================================
|
|
132
|
+
|
|
133
|
+
test_cases:
|
|
134
|
+
# ---------------------------------------------------------------------------
|
|
135
|
+
# CATEGORY: SQL Injection (OWASP A03:2021)
|
|
136
|
+
# ---------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
- id: tc001_sql_injection_string_concat
|
|
139
|
+
description: "Detect SQL injection via string concatenation in Node.js"
|
|
140
|
+
category: injection
|
|
141
|
+
priority: critical
|
|
142
|
+
|
|
143
|
+
input:
|
|
144
|
+
code: |
|
|
145
|
+
const express = require('express');
|
|
146
|
+
const mysql = require('mysql');
|
|
147
|
+
const app = express();
|
|
148
|
+
|
|
149
|
+
app.get('/api/users', (req, res) => {
|
|
150
|
+
const userId = req.params.id;
|
|
151
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
152
|
+
db.query(query, (err, results) => {
|
|
153
|
+
res.json(results);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
context:
|
|
157
|
+
language: javascript
|
|
158
|
+
framework: express
|
|
159
|
+
environment: production
|
|
160
|
+
|
|
161
|
+
expected_output:
|
|
162
|
+
must_contain:
|
|
163
|
+
- "SQL injection"
|
|
164
|
+
- "parameterized"
|
|
165
|
+
must_not_contain:
|
|
166
|
+
- "no vulnerabilities"
|
|
167
|
+
- "secure"
|
|
168
|
+
must_match_regex:
|
|
169
|
+
- "CWE-89|CWE-564"
|
|
170
|
+
- "A03:20[21][0-9]"
|
|
171
|
+
severity_classification: critical
|
|
172
|
+
finding_count:
|
|
173
|
+
min: 1
|
|
174
|
+
max: 3
|
|
175
|
+
recommendation_count:
|
|
176
|
+
min: 1
|
|
177
|
+
|
|
178
|
+
validation:
|
|
179
|
+
schema_check: true
|
|
180
|
+
keyword_match_threshold: 0.8
|
|
181
|
+
reasoning_quality_min: 0.7
|
|
182
|
+
grading_rubric:
|
|
183
|
+
completeness: 0.3
|
|
184
|
+
accuracy: 0.5
|
|
185
|
+
actionability: 0.2
|
|
186
|
+
|
|
187
|
+
timeout_ms: 30000
|
|
188
|
+
|
|
189
|
+
- id: tc002_sql_injection_parameterized_safe
|
|
190
|
+
description: "Verify parameterized queries are NOT flagged as vulnerable"
|
|
191
|
+
category: injection
|
|
192
|
+
priority: high
|
|
193
|
+
|
|
194
|
+
input:
|
|
195
|
+
code: |
|
|
196
|
+
app.get('/api/users', (req, res) => {
|
|
197
|
+
const userId = parseInt(req.params.id, 10);
|
|
198
|
+
db.query('SELECT * FROM users WHERE id = ?', [userId], (err, results) => {
|
|
199
|
+
res.json(results);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
context:
|
|
203
|
+
language: javascript
|
|
204
|
+
framework: express
|
|
205
|
+
|
|
206
|
+
expected_output:
|
|
207
|
+
must_contain:
|
|
208
|
+
- "parameterized"
|
|
209
|
+
- "secure"
|
|
210
|
+
must_not_contain:
|
|
211
|
+
- "SQL injection"
|
|
212
|
+
- "critical"
|
|
213
|
+
- "vulnerable"
|
|
214
|
+
severity_classification: info
|
|
215
|
+
finding_count:
|
|
216
|
+
max: 1
|
|
217
|
+
|
|
218
|
+
validation:
|
|
219
|
+
schema_check: true
|
|
220
|
+
keyword_match_threshold: 0.7
|
|
221
|
+
allow_partial: true
|
|
222
|
+
|
|
223
|
+
# ---------------------------------------------------------------------------
|
|
224
|
+
# CATEGORY: Cross-Site Scripting (OWASP A03:2021)
|
|
225
|
+
# ---------------------------------------------------------------------------
|
|
226
|
+
|
|
227
|
+
- id: tc003_xss_reflected_html_output
|
|
228
|
+
description: "Detect reflected XSS in unescaped HTML output"
|
|
229
|
+
category: injection
|
|
230
|
+
priority: critical
|
|
231
|
+
|
|
232
|
+
input:
|
|
233
|
+
code: |
|
|
234
|
+
app.get('/profile', (req, res) => {
|
|
235
|
+
const name = req.query.name;
|
|
236
|
+
res.send(`
|
|
237
|
+
<html>
|
|
238
|
+
<body>
|
|
239
|
+
<h1>Welcome, ${name}!</h1>
|
|
240
|
+
<p>Your profile has been loaded.</p>
|
|
241
|
+
</body>
|
|
242
|
+
</html>
|
|
243
|
+
`);
|
|
244
|
+
});
|
|
245
|
+
context:
|
|
246
|
+
language: javascript
|
|
247
|
+
framework: express
|
|
248
|
+
|
|
249
|
+
expected_output:
|
|
250
|
+
must_contain:
|
|
251
|
+
- "XSS"
|
|
252
|
+
- "cross-site scripting"
|
|
253
|
+
- "sanitize"
|
|
254
|
+
- "escape"
|
|
255
|
+
must_match_regex:
|
|
256
|
+
- "CWE-79"
|
|
257
|
+
severity_classification: high
|
|
258
|
+
finding_count:
|
|
259
|
+
min: 1
|
|
260
|
+
|
|
261
|
+
validation:
|
|
262
|
+
schema_check: true
|
|
263
|
+
keyword_match_threshold: 0.8
|
|
264
|
+
reasoning_quality_min: 0.75
|
|
265
|
+
|
|
266
|
+
- id: tc004_xss_dom_based_innerhtml
|
|
267
|
+
description: "Detect DOM-based XSS via innerHTML assignment"
|
|
268
|
+
category: injection
|
|
269
|
+
priority: high
|
|
270
|
+
|
|
271
|
+
input:
|
|
272
|
+
code: |
|
|
273
|
+
// Client-side JavaScript
|
|
274
|
+
const params = new URLSearchParams(window.location.search);
|
|
275
|
+
const message = params.get('msg');
|
|
276
|
+
document.getElementById('output').innerHTML = message;
|
|
277
|
+
context:
|
|
278
|
+
language: javascript
|
|
279
|
+
framework: vanilla
|
|
280
|
+
environment: production
|
|
281
|
+
|
|
282
|
+
expected_output:
|
|
283
|
+
must_contain:
|
|
284
|
+
- "DOM"
|
|
285
|
+
- "XSS"
|
|
286
|
+
- "innerHTML"
|
|
287
|
+
- "textContent"
|
|
288
|
+
must_match_regex:
|
|
289
|
+
- "CWE-79"
|
|
290
|
+
severity_classification: high
|
|
291
|
+
|
|
292
|
+
validation:
|
|
293
|
+
schema_check: true
|
|
294
|
+
keyword_match_threshold: 0.7
|
|
295
|
+
|
|
296
|
+
# ---------------------------------------------------------------------------
|
|
297
|
+
# CATEGORY: Authentication Failures (OWASP A07:2021)
|
|
298
|
+
# ---------------------------------------------------------------------------
|
|
299
|
+
|
|
300
|
+
- id: tc005_hardcoded_credentials
|
|
301
|
+
description: "Detect hardcoded credentials and API keys"
|
|
302
|
+
category: authentication
|
|
303
|
+
priority: critical
|
|
304
|
+
|
|
305
|
+
input:
|
|
306
|
+
code: |
|
|
307
|
+
const ADMIN_PASSWORD = 'admin123';
|
|
308
|
+
const API_KEY = 'sk-1234567890abcdef';
|
|
309
|
+
const DATABASE_URL = 'postgres://admin:password123@localhost/db';
|
|
310
|
+
|
|
311
|
+
app.post('/login', (req, res) => {
|
|
312
|
+
if (req.body.password === ADMIN_PASSWORD) {
|
|
313
|
+
req.session.isAdmin = true;
|
|
314
|
+
res.send('Login successful');
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
context:
|
|
318
|
+
language: javascript
|
|
319
|
+
framework: express
|
|
320
|
+
|
|
321
|
+
expected_output:
|
|
322
|
+
must_contain:
|
|
323
|
+
- "hardcoded"
|
|
324
|
+
- "credentials"
|
|
325
|
+
- "secret"
|
|
326
|
+
- "environment variable"
|
|
327
|
+
must_match_regex:
|
|
328
|
+
- "CWE-798|CWE-259"
|
|
329
|
+
severity_classification: critical
|
|
330
|
+
finding_count:
|
|
331
|
+
min: 2
|
|
332
|
+
|
|
333
|
+
validation:
|
|
334
|
+
schema_check: true
|
|
335
|
+
keyword_match_threshold: 0.8
|
|
336
|
+
reasoning_quality_min: 0.8
|
|
337
|
+
|
|
338
|
+
- id: tc006_weak_password_hashing
|
|
339
|
+
description: "Detect weak password hashing algorithms (MD5, SHA1)"
|
|
340
|
+
category: authentication
|
|
341
|
+
priority: high
|
|
342
|
+
|
|
343
|
+
input:
|
|
344
|
+
code: |
|
|
345
|
+
const crypto = require('crypto');
|
|
346
|
+
|
|
347
|
+
function hashPassword(password) {
|
|
348
|
+
return crypto.createHash('md5').update(password).digest('hex');
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function verifyPassword(password, hash) {
|
|
352
|
+
return hashPassword(password) === hash;
|
|
353
|
+
}
|
|
354
|
+
context:
|
|
355
|
+
language: javascript
|
|
356
|
+
framework: nodejs
|
|
357
|
+
|
|
358
|
+
expected_output:
|
|
359
|
+
must_contain:
|
|
360
|
+
- "MD5"
|
|
361
|
+
- "weak"
|
|
362
|
+
- "bcrypt"
|
|
363
|
+
- "argon2"
|
|
364
|
+
must_match_regex:
|
|
365
|
+
- "CWE-327|CWE-328|CWE-916"
|
|
366
|
+
severity_classification: high
|
|
367
|
+
finding_count:
|
|
368
|
+
min: 1
|
|
369
|
+
|
|
370
|
+
validation:
|
|
371
|
+
schema_check: true
|
|
372
|
+
keyword_match_threshold: 0.8
|
|
373
|
+
|
|
374
|
+
# ---------------------------------------------------------------------------
|
|
375
|
+
# CATEGORY: Broken Access Control (OWASP A01:2021)
|
|
376
|
+
# ---------------------------------------------------------------------------
|
|
377
|
+
|
|
378
|
+
- id: tc007_idor_missing_authorization
|
|
379
|
+
description: "Detect IDOR vulnerability with missing authorization check"
|
|
380
|
+
category: authorization
|
|
381
|
+
priority: critical
|
|
382
|
+
|
|
383
|
+
input:
|
|
384
|
+
code: |
|
|
385
|
+
app.get('/api/users/:id/profile', (req, res) => {
|
|
386
|
+
// No authorization check - any user can access any profile
|
|
387
|
+
const userId = req.params.id;
|
|
388
|
+
db.query('SELECT * FROM profiles WHERE user_id = ?', [userId])
|
|
389
|
+
.then(profile => res.json(profile));
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
app.delete('/api/users/:id', (req, res) => {
|
|
393
|
+
// No check if requesting user owns this account
|
|
394
|
+
db.query('DELETE FROM users WHERE id = ?', [req.params.id]);
|
|
395
|
+
res.send('User deleted');
|
|
396
|
+
});
|
|
397
|
+
context:
|
|
398
|
+
language: javascript
|
|
399
|
+
framework: express
|
|
400
|
+
|
|
401
|
+
expected_output:
|
|
402
|
+
must_contain:
|
|
403
|
+
- "authorization"
|
|
404
|
+
- "access control"
|
|
405
|
+
- "IDOR"
|
|
406
|
+
- "ownership"
|
|
407
|
+
must_match_regex:
|
|
408
|
+
- "CWE-639|CWE-284|CWE-862"
|
|
409
|
+
- "A01:2021"
|
|
410
|
+
severity_classification: critical
|
|
411
|
+
|
|
412
|
+
validation:
|
|
413
|
+
schema_check: true
|
|
414
|
+
keyword_match_threshold: 0.7
|
|
415
|
+
|
|
416
|
+
# ---------------------------------------------------------------------------
|
|
417
|
+
# CATEGORY: Cryptographic Failures (OWASP A02:2021)
|
|
418
|
+
# ---------------------------------------------------------------------------
|
|
419
|
+
|
|
420
|
+
- id: tc008_weak_encryption_des
|
|
421
|
+
description: "Detect use of weak encryption algorithms (DES, RC4)"
|
|
422
|
+
category: cryptography
|
|
423
|
+
priority: high
|
|
424
|
+
|
|
425
|
+
input:
|
|
426
|
+
code: |
|
|
427
|
+
const crypto = require('crypto');
|
|
428
|
+
|
|
429
|
+
function encryptData(data, key) {
|
|
430
|
+
const cipher = crypto.createCipher('des', key);
|
|
431
|
+
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function decryptData(data, key) {
|
|
435
|
+
const decipher = crypto.createDecipher('des', key);
|
|
436
|
+
return decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
|
|
437
|
+
}
|
|
438
|
+
context:
|
|
439
|
+
language: javascript
|
|
440
|
+
framework: nodejs
|
|
441
|
+
|
|
442
|
+
expected_output:
|
|
443
|
+
must_contain:
|
|
444
|
+
- "DES"
|
|
445
|
+
- "weak"
|
|
446
|
+
- "deprecated"
|
|
447
|
+
- "AES"
|
|
448
|
+
must_match_regex:
|
|
449
|
+
- "CWE-327|CWE-328"
|
|
450
|
+
- "A02:2021"
|
|
451
|
+
severity_classification: high
|
|
452
|
+
|
|
453
|
+
validation:
|
|
454
|
+
schema_check: true
|
|
455
|
+
keyword_match_threshold: 0.7
|
|
456
|
+
|
|
457
|
+
- id: tc009_plaintext_password_storage
|
|
458
|
+
description: "Detect plaintext password storage"
|
|
459
|
+
category: cryptography
|
|
460
|
+
priority: critical
|
|
461
|
+
|
|
462
|
+
input:
|
|
463
|
+
code: |
|
|
464
|
+
class User {
|
|
465
|
+
constructor(email, password) {
|
|
466
|
+
this.email = email;
|
|
467
|
+
this.password = password; // Stored in plaintext!
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
save() {
|
|
471
|
+
db.query('INSERT INTO users (email, password) VALUES (?, ?)',
|
|
472
|
+
[this.email, this.password]);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
context:
|
|
476
|
+
language: javascript
|
|
477
|
+
framework: nodejs
|
|
478
|
+
|
|
479
|
+
expected_output:
|
|
480
|
+
must_contain:
|
|
481
|
+
- "plaintext"
|
|
482
|
+
- "password"
|
|
483
|
+
- "hash"
|
|
484
|
+
- "bcrypt"
|
|
485
|
+
must_match_regex:
|
|
486
|
+
- "CWE-256|CWE-312"
|
|
487
|
+
- "A02:2021"
|
|
488
|
+
severity_classification: critical
|
|
489
|
+
|
|
490
|
+
validation:
|
|
491
|
+
schema_check: true
|
|
492
|
+
keyword_match_threshold: 0.8
|
|
493
|
+
|
|
494
|
+
# ---------------------------------------------------------------------------
|
|
495
|
+
# CATEGORY: Path Traversal (Related to A01:2021)
|
|
496
|
+
# ---------------------------------------------------------------------------
|
|
497
|
+
|
|
498
|
+
- id: tc010_path_traversal_file_access
|
|
499
|
+
description: "Detect path traversal vulnerability in file access"
|
|
500
|
+
category: injection
|
|
501
|
+
priority: critical
|
|
502
|
+
|
|
503
|
+
input:
|
|
504
|
+
code: |
|
|
505
|
+
const fs = require('fs');
|
|
506
|
+
|
|
507
|
+
app.get('/download', (req, res) => {
|
|
508
|
+
const filename = req.query.file;
|
|
509
|
+
const filepath = './uploads/' + filename;
|
|
510
|
+
res.sendFile(filepath);
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
app.get('/read', (req, res) => {
|
|
514
|
+
const content = fs.readFileSync('./data/' + req.params.name);
|
|
515
|
+
res.send(content);
|
|
516
|
+
});
|
|
517
|
+
context:
|
|
518
|
+
language: javascript
|
|
519
|
+
framework: express
|
|
520
|
+
|
|
521
|
+
expected_output:
|
|
522
|
+
must_contain:
|
|
523
|
+
- "path traversal"
|
|
524
|
+
- "directory traversal"
|
|
525
|
+
- "../"
|
|
526
|
+
- "sanitize"
|
|
527
|
+
must_match_regex:
|
|
528
|
+
- "CWE-22|CWE-23"
|
|
529
|
+
severity_classification: critical
|
|
530
|
+
|
|
531
|
+
validation:
|
|
532
|
+
schema_check: true
|
|
533
|
+
keyword_match_threshold: 0.7
|
|
534
|
+
|
|
535
|
+
# ---------------------------------------------------------------------------
|
|
536
|
+
# CATEGORY: Negative Tests (No False Positives)
|
|
537
|
+
# ---------------------------------------------------------------------------
|
|
538
|
+
|
|
539
|
+
- id: tc011_secure_code_no_false_positives
|
|
540
|
+
description: "Verify secure code is NOT flagged as vulnerable"
|
|
541
|
+
category: negative
|
|
542
|
+
priority: critical
|
|
543
|
+
|
|
544
|
+
input:
|
|
545
|
+
code: |
|
|
546
|
+
const express = require('express');
|
|
547
|
+
const helmet = require('helmet');
|
|
548
|
+
const rateLimit = require('express-rate-limit');
|
|
549
|
+
const bcrypt = require('bcrypt');
|
|
550
|
+
const validator = require('validator');
|
|
551
|
+
|
|
552
|
+
const app = express();
|
|
553
|
+
app.use(helmet());
|
|
554
|
+
app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
|
|
555
|
+
|
|
556
|
+
app.post('/api/users', async (req, res) => {
|
|
557
|
+
const { email, password } = req.body;
|
|
558
|
+
|
|
559
|
+
// Input validation
|
|
560
|
+
if (!validator.isEmail(email)) {
|
|
561
|
+
return res.status(400).json({ error: 'Invalid email' });
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Secure password hashing
|
|
565
|
+
const hashedPassword = await bcrypt.hash(password, 12);
|
|
566
|
+
|
|
567
|
+
// Parameterized query
|
|
568
|
+
await db.query(
|
|
569
|
+
'INSERT INTO users (email, password) VALUES ($1, $2)',
|
|
570
|
+
[email, hashedPassword]
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
res.status(201).json({ message: 'User created' });
|
|
574
|
+
});
|
|
575
|
+
context:
|
|
576
|
+
language: javascript
|
|
577
|
+
framework: express
|
|
578
|
+
environment: production
|
|
579
|
+
|
|
580
|
+
expected_output:
|
|
581
|
+
must_contain:
|
|
582
|
+
- "secure"
|
|
583
|
+
- "best practice"
|
|
584
|
+
must_not_contain:
|
|
585
|
+
- "SQL injection"
|
|
586
|
+
- "XSS"
|
|
587
|
+
- "critical vulnerability"
|
|
588
|
+
- "high severity"
|
|
589
|
+
finding_count:
|
|
590
|
+
max: 2 # Allow informational findings only
|
|
591
|
+
|
|
592
|
+
validation:
|
|
593
|
+
schema_check: true
|
|
594
|
+
keyword_match_threshold: 0.6
|
|
595
|
+
allow_partial: true
|
|
596
|
+
|
|
597
|
+
- id: tc012_secure_auth_implementation
|
|
598
|
+
description: "Verify secure authentication is recognized as safe"
|
|
599
|
+
category: negative
|
|
600
|
+
priority: high
|
|
601
|
+
|
|
602
|
+
input:
|
|
603
|
+
code: |
|
|
604
|
+
const bcrypt = require('bcrypt');
|
|
605
|
+
const jwt = require('jsonwebtoken');
|
|
606
|
+
|
|
607
|
+
async function login(email, password) {
|
|
608
|
+
const user = await User.findByEmail(email);
|
|
609
|
+
if (!user) {
|
|
610
|
+
return { error: 'Invalid credentials' };
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
const match = await bcrypt.compare(password, user.passwordHash);
|
|
614
|
+
if (!match) {
|
|
615
|
+
return { error: 'Invalid credentials' };
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const token = jwt.sign(
|
|
619
|
+
{ userId: user.id },
|
|
620
|
+
process.env.JWT_SECRET,
|
|
621
|
+
{ expiresIn: '1h' }
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
return { token };
|
|
625
|
+
}
|
|
626
|
+
context:
|
|
627
|
+
language: javascript
|
|
628
|
+
framework: nodejs
|
|
629
|
+
|
|
630
|
+
expected_output:
|
|
631
|
+
must_contain:
|
|
632
|
+
- "bcrypt"
|
|
633
|
+
- "jwt"
|
|
634
|
+
- "secure"
|
|
635
|
+
must_not_contain:
|
|
636
|
+
- "vulnerable"
|
|
637
|
+
- "critical"
|
|
638
|
+
- "hardcoded"
|
|
639
|
+
severity_classification: info
|
|
640
|
+
|
|
641
|
+
validation:
|
|
642
|
+
schema_check: true
|
|
643
|
+
allow_partial: true
|
|
644
|
+
|
|
645
|
+
# ---------------------------------------------------------------------------
|
|
646
|
+
# CATEGORY: Python Security (Multi-language Support)
|
|
647
|
+
# ---------------------------------------------------------------------------
|
|
648
|
+
|
|
649
|
+
- id: tc013_python_sql_injection
|
|
650
|
+
description: "Detect SQL injection in Python Flask application"
|
|
651
|
+
category: injection
|
|
652
|
+
priority: critical
|
|
653
|
+
|
|
654
|
+
input:
|
|
655
|
+
code: |
|
|
656
|
+
from flask import Flask, request
|
|
657
|
+
import sqlite3
|
|
658
|
+
|
|
659
|
+
app = Flask(__name__)
|
|
660
|
+
|
|
661
|
+
@app.route('/user')
|
|
662
|
+
def get_user():
|
|
663
|
+
user_id = request.args.get('id')
|
|
664
|
+
conn = sqlite3.connect('users.db')
|
|
665
|
+
cursor = conn.cursor()
|
|
666
|
+
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
667
|
+
return str(cursor.fetchone())
|
|
668
|
+
context:
|
|
669
|
+
language: python
|
|
670
|
+
framework: flask
|
|
671
|
+
|
|
672
|
+
expected_output:
|
|
673
|
+
must_contain:
|
|
674
|
+
- "SQL injection"
|
|
675
|
+
- "parameterized"
|
|
676
|
+
- "f-string"
|
|
677
|
+
must_match_regex:
|
|
678
|
+
- "CWE-89"
|
|
679
|
+
severity_classification: critical
|
|
680
|
+
finding_count:
|
|
681
|
+
min: 1
|
|
682
|
+
|
|
683
|
+
validation:
|
|
684
|
+
schema_check: true
|
|
685
|
+
keyword_match_threshold: 0.7
|
|
686
|
+
|
|
687
|
+
- id: tc014_python_ssti_jinja
|
|
688
|
+
description: "Detect Server-Side Template Injection in Jinja2"
|
|
689
|
+
category: injection
|
|
690
|
+
priority: critical
|
|
691
|
+
|
|
692
|
+
input:
|
|
693
|
+
code: |
|
|
694
|
+
from flask import Flask, request, render_template_string
|
|
695
|
+
|
|
696
|
+
app = Flask(__name__)
|
|
697
|
+
|
|
698
|
+
@app.route('/render')
|
|
699
|
+
def render():
|
|
700
|
+
template = request.args.get('template')
|
|
701
|
+
return render_template_string(template)
|
|
702
|
+
context:
|
|
703
|
+
language: python
|
|
704
|
+
framework: flask
|
|
705
|
+
|
|
706
|
+
expected_output:
|
|
707
|
+
must_contain:
|
|
708
|
+
- "SSTI"
|
|
709
|
+
- "template injection"
|
|
710
|
+
- "render_template_string"
|
|
711
|
+
- "Jinja2"
|
|
712
|
+
must_match_regex:
|
|
713
|
+
- "CWE-94|CWE-1336"
|
|
714
|
+
severity_classification: critical
|
|
715
|
+
|
|
716
|
+
validation:
|
|
717
|
+
schema_check: true
|
|
718
|
+
keyword_match_threshold: 0.7
|
|
719
|
+
|
|
720
|
+
- id: tc015_python_pickle_deserialization
|
|
721
|
+
description: "Detect insecure deserialization with pickle"
|
|
722
|
+
category: injection
|
|
723
|
+
priority: critical
|
|
724
|
+
|
|
725
|
+
input:
|
|
726
|
+
code: |
|
|
727
|
+
import pickle
|
|
728
|
+
from flask import Flask, request
|
|
729
|
+
|
|
730
|
+
app = Flask(__name__)
|
|
731
|
+
|
|
732
|
+
@app.route('/load')
|
|
733
|
+
def load_data():
|
|
734
|
+
data = request.get_data()
|
|
735
|
+
obj = pickle.loads(data)
|
|
736
|
+
return str(obj)
|
|
737
|
+
context:
|
|
738
|
+
language: python
|
|
739
|
+
framework: flask
|
|
740
|
+
|
|
741
|
+
expected_output:
|
|
742
|
+
must_contain:
|
|
743
|
+
- "pickle"
|
|
744
|
+
- "deserialization"
|
|
745
|
+
- "untrusted"
|
|
746
|
+
- "RCE"
|
|
747
|
+
must_match_regex:
|
|
748
|
+
- "CWE-502"
|
|
749
|
+
- "A08:2021"
|
|
750
|
+
severity_classification: critical
|
|
751
|
+
|
|
752
|
+
validation:
|
|
753
|
+
schema_check: true
|
|
754
|
+
keyword_match_threshold: 0.7
|
|
755
|
+
|
|
756
|
+
# =============================================================================
|
|
757
|
+
# SUCCESS CRITERIA
|
|
758
|
+
# =============================================================================
|
|
759
|
+
|
|
760
|
+
success_criteria:
|
|
761
|
+
# Overall pass rate (90% of tests must pass)
|
|
762
|
+
pass_rate: 0.9
|
|
763
|
+
|
|
764
|
+
# Critical tests must ALL pass (100%)
|
|
765
|
+
critical_pass_rate: 1.0
|
|
766
|
+
|
|
767
|
+
# Average reasoning quality score
|
|
768
|
+
avg_reasoning_quality: 0.75
|
|
769
|
+
|
|
770
|
+
# Maximum suite execution time (5 minutes)
|
|
771
|
+
max_execution_time_ms: 300000
|
|
772
|
+
|
|
773
|
+
# Maximum variance between model results (15%)
|
|
774
|
+
cross_model_variance: 0.15
|
|
775
|
+
|
|
776
|
+
# =============================================================================
|
|
777
|
+
# METADATA
|
|
778
|
+
# =============================================================================
|
|
779
|
+
|
|
780
|
+
metadata:
|
|
781
|
+
author: "qe-security-auditor"
|
|
782
|
+
created: "2026-02-02"
|
|
783
|
+
last_updated: "2026-02-02"
|
|
784
|
+
coverage_target: >
|
|
785
|
+
OWASP Top 10 2021: A01 (Broken Access Control), A02 (Cryptographic Failures),
|
|
786
|
+
A03 (Injection - SQL, XSS, SSTI, Command), A07 (Authentication Failures),
|
|
787
|
+
A08 (Software Integrity - Deserialization). Covers JavaScript/Node.js
|
|
788
|
+
Express apps and Python Flask apps. 15 test cases with 90% pass rate
|
|
789
|
+
requirement and 100% critical pass rate.
|