@elizaos/skills 2.0.0-alpha.3
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/README.md +126 -0
- package/package.json +53 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +96 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/bird/SKILL.md +224 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +203 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +578 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +77 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +74 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +102 -0
- package/skills/local-places/pyproject.toml +21 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +51 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
- package/skills/security-ask-questions-if-underspecified/README.md +24 -0
- package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
- package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
- package/skills/security-audit-context-building/README.md +58 -0
- package/skills/security-audit-context-building/commands/audit-context.md +21 -0
- package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
- package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
- package/skills/security-building-secure-contracts/README.md +241 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
- package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
- package/skills/security-burpsuite-project-parser/.claude-plugin/plugin.json +10 -0
- package/skills/security-burpsuite-project-parser/README.md +103 -0
- package/skills/security-burpsuite-project-parser/commands/burp-search.md +18 -0
- package/skills/security-burpsuite-project-parser/skills/SKILL.md +358 -0
- package/skills/security-burpsuite-project-parser/skills/scripts/burp-search.sh +99 -0
- package/skills/security-claude-in-chrome-troubleshooting/.claude-plugin/plugin.json +8 -0
- package/skills/security-claude-in-chrome-troubleshooting/README.md +31 -0
- package/skills/security-claude-in-chrome-troubleshooting/skills/claude-in-chrome-troubleshooting/SKILL.md +251 -0
- package/skills/security-constant-time-analysis/.claude-plugin/plugin.json +9 -0
- package/skills/security-constant-time-analysis/README.md +381 -0
- package/skills/security-constant-time-analysis/commands/ct-check.md +20 -0
- package/skills/security-constant-time-analysis/ct_analyzer/__init__.py +49 -0
- package/skills/security-constant-time-analysis/ct_analyzer/analyzer.py +1284 -0
- package/skills/security-constant-time-analysis/ct_analyzer/script_analyzers.py +3081 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/__init__.py +1 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_analyzer.py +1397 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/bn_excerpt.js +205 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_constant_time.c +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c +74 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.go +78 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.rs +92 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.cs +174 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.java +161 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.kt +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.php +140 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.py +252 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.rb +188 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.swift +199 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.ts +154 -0
- package/skills/security-constant-time-analysis/pyproject.toml +52 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/README.md +90 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/SKILL.md +219 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/compiled.md +129 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/javascript.md +136 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md +252 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md +172 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md +179 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md +198 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md +288 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/vm-compiled.md +354 -0
- package/skills/security-constant-time-analysis/uv.lock +8 -0
- package/skills/security-culture-index/.claude-plugin/plugin.json +8 -0
- package/skills/security-culture-index/README.md +79 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/SKILL.md +293 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/anti-patterns.md +255 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/conversation-starters.md +408 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/interview-trait-signals.md +253 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/motivators.md +158 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/patterns-archetypes.md +147 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/primary-traits.md +307 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/secondary-traits.md +228 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/team-composition.md +148 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/check_deps.py +108 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/__init__.py +20 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/constants.py +122 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/extract.py +187 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/models.py +16 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/opencv_extractor.py +520 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/extract_pdf.py +237 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/pyproject.toml +18 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/burnout-report.md +113 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/comparison-report.md +103 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/hiring-profile.md +127 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/individual-report.md +85 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/predicted-profile.md +165 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/team-report.md +109 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/analyze-team.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/coach-manager.md +267 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/compare-profiles.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/define-hiring-profile.md +220 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/detect-burnout.md +206 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/extract-from-pdf.md +121 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interpret-individual.md +183 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interview-debrief.md +234 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/mediate-conflict.md +306 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/plan-onboarding.md +322 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/predict-from-interview.md +250 -0
- package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
- package/skills/security-differential-review/README.md +109 -0
- package/skills/security-differential-review/commands/diff-review.md +21 -0
- package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
- package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
- package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
- package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
- package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
- package/skills/security-dwarf-expert/.claude-plugin/plugin.json +10 -0
- package/skills/security-dwarf-expert/README.md +38 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/SKILL.md +93 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/coding.md +31 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/dwarfdump.md +50 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/readelf.md +8 -0
- package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
- package/skills/security-entry-point-analyzer/README.md +74 -0
- package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
- package/skills/security-firebase-apk-scanner/.claude-plugin/plugin.json +10 -0
- package/skills/security-firebase-apk-scanner/README.md +85 -0
- package/skills/security-firebase-apk-scanner/commands/scan-apk.md +18 -0
- package/skills/security-firebase-apk-scanner/scanner.sh +1408 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/SKILL.md +197 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/references/vulnerabilities.md +803 -0
- package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
- package/skills/security-fix-review/README.md +118 -0
- package/skills/security-fix-review/commands/fix-review.md +24 -0
- package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
- package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
- package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
- package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
- package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
- package/skills/security-insecure-defaults/README.md +45 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
- package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
- package/skills/security-modern-python/README.md +58 -0
- package/skills/security-modern-python/hooks/hooks.json +16 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
- package/skills/security-modern-python/hooks/test_helper.bash +75 -0
- package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
- package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
- package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
- package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
- package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
- package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
- package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
- package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
- package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
- package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
- package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
- package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
- package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
- package/skills/security-property-based-testing/README.md +47 -0
- package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
- package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
- package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
- package/skills/semgrep-rule-creator/README.md +43 -0
- package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
- package/skills/semgrep-rule-variant-creator/.claude-plugin/plugin.json +9 -0
- package/skills/semgrep-rule-variant-creator/README.md +86 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
- package/skills/sharp-edges/README.md +48 -0
- package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
- package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
- package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
- package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
- package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
- package/skills/spec-to-code-compliance/README.md +67 -0
- package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/static-analysis/README.md +59 -0
- package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
- package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
- package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
- package/skills/testing-handbook-skills/README.md +241 -0
- package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
- package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
- package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
- package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
- package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
- package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
- package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
- package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
- package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
- package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
- package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
- package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
- package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
- package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
- package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
- package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +135 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/variant-analysis/README.md +41 -0
- package/skills/variant-analysis/commands/variants.md +23 -0
- package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
- package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +54 -0
- package/skills/yara-authoring/.claude-plugin/plugin.json +9 -0
- package/skills/yara-authoring/README.md +131 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/SKILL.md +645 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Mac_ProtonRAT_Jan25.yar +99 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_NPM_SupplyChain_Jan25.yar +170 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Win_Remcos_Jan25.yar +103 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_CRX_SuspiciousPermissions.yar +134 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_JS_Obfuscation_Jan25.yar +185 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/crx-module.md +214 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/dex-module.md +383 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/performance.md +333 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/strings.md +433 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/style-guide.md +257 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/testing.md +399 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/atom_analyzer.py +526 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/pyproject.toml +25 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/yara_lint.py +631 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/workflows/rule-development.md +493 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Real-World Case Studies
|
|
2
|
+
|
|
3
|
+
Analysis of sharp edges in widely-used libraries. These aren't implementation bugs—they're design decisions that make secure usage difficult.
|
|
4
|
+
|
|
5
|
+
## GNU Multiple Precision Arithmetic Library (GMP)
|
|
6
|
+
|
|
7
|
+
GMP is used extensively for cryptographic implementations (RSA, Paillier, ElGamal, etc.) despite being fundamentally unsuitable for cryptography.
|
|
8
|
+
|
|
9
|
+
### Sharp Edge: Variable-Time Operations
|
|
10
|
+
|
|
11
|
+
**The Problem**: GMP operations are not constant-time. Timing varies based on input values.
|
|
12
|
+
|
|
13
|
+
```c
|
|
14
|
+
// DANGEROUS: Timing leaks secret exponent bits
|
|
15
|
+
mpz_powm(result, base, secret_exponent, modulus);
|
|
16
|
+
|
|
17
|
+
// Each bit of secret_exponent affects timing differently
|
|
18
|
+
// Attacker can recover secret_exponent via timing analysis
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Why This Matters**:
|
|
22
|
+
- Paillier encryption uses `mpz_powm` with secret keys
|
|
23
|
+
- RSA implementations using GMP leak private key bits
|
|
24
|
+
- Even "blinded" implementations often have residual timing leaks
|
|
25
|
+
|
|
26
|
+
**Detection Pattern**: Any use of GMP (`mpz_*` functions) with secret values:
|
|
27
|
+
- `mpz_powm`, `mpz_powm_sec` (the "sec" version is still not fully constant-time)
|
|
28
|
+
- `mpz_mul`, `mpz_mod` with secret operands
|
|
29
|
+
- `mpz_cmp` for secret comparison
|
|
30
|
+
|
|
31
|
+
**Real Vulnerabilities**:
|
|
32
|
+
- CVE-2018-16152: Timing attack on strongSwan IKEv2
|
|
33
|
+
- Numerous academic papers demonstrating key recovery from GMP-based crypto
|
|
34
|
+
|
|
35
|
+
### Sharp Edge: Memory Not Securely Cleared
|
|
36
|
+
|
|
37
|
+
```c
|
|
38
|
+
mpz_t secret_key;
|
|
39
|
+
mpz_init(secret_key);
|
|
40
|
+
// ... use secret_key ...
|
|
41
|
+
mpz_clear(secret_key); // Memory NOT securely wiped
|
|
42
|
+
// Secret data may persist in freed memory
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**The Problem**: `mpz_clear` doesn't zero memory before freeing. Secrets persist.
|
|
46
|
+
|
|
47
|
+
### Sharp Edge: Confusing Import/Export API
|
|
48
|
+
|
|
49
|
+
```c
|
|
50
|
+
// What does this do?
|
|
51
|
+
mpz_export(buf, &count, order, size, endian, nails, op);
|
|
52
|
+
|
|
53
|
+
// Parameters:
|
|
54
|
+
// - order: 1 = most significant word first, -1 = least significant
|
|
55
|
+
// - endian: 1 = big, -1 = little, 0 = native
|
|
56
|
+
// - nails: bits to skip at top of each word (?!)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**The Problem**: Seven parameters, three of which control byte ordering in different ways. Easy to get wrong, hard to verify correctness.
|
|
60
|
+
|
|
61
|
+
### Mitigation
|
|
62
|
+
|
|
63
|
+
For cryptographic use, prefer:
|
|
64
|
+
- **libsodium** for common operations
|
|
65
|
+
- **OpenSSL BIGNUM** (has constant-time variants)
|
|
66
|
+
- **libgmp with mpz_powm_sec** (partial mitigation, not complete)
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## OpenSSL
|
|
71
|
+
|
|
72
|
+
The canonical example of a powerful but footgun-laden cryptographic library.
|
|
73
|
+
|
|
74
|
+
### Sharp Edge: SSL_CTX_set_verify Callback
|
|
75
|
+
|
|
76
|
+
```c
|
|
77
|
+
// DANGEROUS: Easy to write callback that always returns 1
|
|
78
|
+
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);
|
|
79
|
+
|
|
80
|
+
int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) {
|
|
81
|
+
// Developer thinks: "I'll add logging here"
|
|
82
|
+
log_certificate(ctx);
|
|
83
|
+
return 1; // OOPS: Always accepts, ignoring preverify_ok!
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**The Problem**: The callback's return value determines whether verification succeeds. Developers often:
|
|
88
|
+
- Return 1 (success) unconditionally while "just adding logging"
|
|
89
|
+
- Forget that returning non-zero bypasses all verification
|
|
90
|
+
- Copy-paste examples that return 1 for "debugging"
|
|
91
|
+
|
|
92
|
+
**Correct Pattern**:
|
|
93
|
+
```c
|
|
94
|
+
int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) {
|
|
95
|
+
if (!preverify_ok) {
|
|
96
|
+
// Log failure details
|
|
97
|
+
log_verification_failure(ctx);
|
|
98
|
+
}
|
|
99
|
+
return preverify_ok; // Preserve original decision
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Sharp Edge: Error Handling via ERR_get_error
|
|
104
|
+
|
|
105
|
+
```c
|
|
106
|
+
// DANGEROUS: Error easily ignored
|
|
107
|
+
EVP_EncryptFinal_ex(ctx, outbuf, &outlen);
|
|
108
|
+
// Did it succeed? Who knows!
|
|
109
|
+
|
|
110
|
+
// Correct but verbose:
|
|
111
|
+
if (EVP_EncryptFinal_ex(ctx, outbuf, &outlen) != 1) {
|
|
112
|
+
unsigned long err = ERR_get_error();
|
|
113
|
+
char buf[256];
|
|
114
|
+
ERR_error_string_n(err, buf, sizeof(buf));
|
|
115
|
+
// Handle error...
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**The Problem**:
|
|
120
|
+
- Functions return 1 for success (not 0!)
|
|
121
|
+
- Errors accumulate in a thread-local queue
|
|
122
|
+
- Easy to forget to check, easy to check wrong way
|
|
123
|
+
- Error queue must be cleared or errors persist
|
|
124
|
+
|
|
125
|
+
### Sharp Edge: RAND_bytes vs RAND_pseudo_bytes
|
|
126
|
+
|
|
127
|
+
```c
|
|
128
|
+
// These look almost identical:
|
|
129
|
+
RAND_bytes(buf, len); // Cryptographically secure
|
|
130
|
+
RAND_pseudo_bytes(buf, len); // NOT guaranteed secure!
|
|
131
|
+
|
|
132
|
+
// Worse: RAND_pseudo_bytes returns 1 even when insecure
|
|
133
|
+
int rc = RAND_pseudo_bytes(buf, len);
|
|
134
|
+
// rc == 1 means "success", not "cryptographically random"
|
|
135
|
+
// rc == 0 means "success but not crypto-strength" (!!)
|
|
136
|
+
// rc == -1 means "not supported"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**The Problem**: Function names differ by one word; return values are confusing; the insecure function is not clearly marked dangerous.
|
|
140
|
+
|
|
141
|
+
### Sharp Edge: Memory Ownership Confusion
|
|
142
|
+
|
|
143
|
+
```c
|
|
144
|
+
// Who frees this?
|
|
145
|
+
X509 *cert = SSL_get_peer_certificate(ssl);
|
|
146
|
+
// Answer: YOU do (it's a copy)
|
|
147
|
+
|
|
148
|
+
// Who frees this?
|
|
149
|
+
X509 *cert = SSL_get0_peer_certificate(ssl); // OpenSSL 3.0+
|
|
150
|
+
// Answer: NOBODY (it's a reference)
|
|
151
|
+
|
|
152
|
+
// The difference: "get" vs "get0"
|
|
153
|
+
// This convention is NOT obvious or consistently applied
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**The Problem**: Memory ownership indicated by subtle naming conventions that aren't documented together and aren't consistent across the API.
|
|
157
|
+
|
|
158
|
+
### Sharp Edge: EVP_CIPHER_CTX Reuse
|
|
159
|
+
|
|
160
|
+
```c
|
|
161
|
+
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
|
162
|
+
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv);
|
|
163
|
+
EVP_EncryptUpdate(ctx, out, &outlen, in, inlen);
|
|
164
|
+
EVP_EncryptFinal_ex(ctx, out + outlen, &tmplen);
|
|
165
|
+
|
|
166
|
+
// DANGEROUS: Reusing ctx without reset
|
|
167
|
+
EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv2); // New IV only
|
|
168
|
+
// Some state from previous encryption may persist!
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**The Problem**: Context reuse rules are complex and vary by cipher mode.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Python's `pickle`
|
|
176
|
+
|
|
177
|
+
### Sharp Edge: Arbitrary Code Execution by Design
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
import pickle
|
|
181
|
+
|
|
182
|
+
# DANGEROUS: Deserializes arbitrary Python objects
|
|
183
|
+
data = pickle.loads(untrusted_input)
|
|
184
|
+
|
|
185
|
+
# Attacker sends:
|
|
186
|
+
# b"cos\nsystem\n(S'rm -rf /'\ntR."
|
|
187
|
+
# Result: Executes shell command
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**The Problem**: `pickle` is not a data format—it's a code execution format. There is no safe way to unpickle untrusted data, but:
|
|
191
|
+
- The function looks like a data parser
|
|
192
|
+
- The name suggests food preservation, not danger
|
|
193
|
+
- Many developers don't realize the risk
|
|
194
|
+
|
|
195
|
+
**Mitigation**: Use `json` for data. If you need pickle, use `hmac` to authenticate before unpickling (but even then, prefer safer formats).
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## YAML Libraries
|
|
200
|
+
|
|
201
|
+
### Sharp Edge: Code Execution via Tags
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
import yaml
|
|
205
|
+
|
|
206
|
+
# DANGEROUS: yaml.load() executes arbitrary code
|
|
207
|
+
data = yaml.load(untrusted_input)
|
|
208
|
+
|
|
209
|
+
# Attacker sends:
|
|
210
|
+
# !!python/object/apply:os.system ['rm -rf /']
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**The Problem**: YAML's tag system allows arbitrary object instantiation. The "safe" loader is:
|
|
214
|
+
```python
|
|
215
|
+
data = yaml.safe_load(untrusted_input) # Safe
|
|
216
|
+
data = yaml.load(untrusted_input, Loader=yaml.SafeLoader) # Also safe
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
But the dangerous version is the obvious one (`yaml.load()`).
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## PHP's `strcmp` for Password Comparison
|
|
224
|
+
|
|
225
|
+
### Sharp Edge: Type Juggling Bypass
|
|
226
|
+
|
|
227
|
+
```php
|
|
228
|
+
// DANGEROUS: Type juggling attack
|
|
229
|
+
if (strcmp($_POST['password'], $stored_password) == 0) {
|
|
230
|
+
authenticate();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Attacker sends: password[]=anything
|
|
234
|
+
// strcmp(array, string) returns NULL
|
|
235
|
+
// NULL == 0 is TRUE in PHP!
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**The Problem**:
|
|
239
|
+
- `strcmp` returns `NULL` on type error, not `-1` or `1`
|
|
240
|
+
- PHP's `==` operator coerces `NULL` to `0`
|
|
241
|
+
- `NULL == 0` evaluates to `TRUE`
|
|
242
|
+
- Authentication bypassed
|
|
243
|
+
|
|
244
|
+
**Fix**:
|
|
245
|
+
```php
|
|
246
|
+
if (hash_equals($stored_hash, hash('sha256', $_POST['password']))) {
|
|
247
|
+
// Use hash_equals for timing-safe comparison
|
|
248
|
+
// AND proper password hashing (not shown)
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Analysis Template
|
|
255
|
+
|
|
256
|
+
When examining a library for sharp edges:
|
|
257
|
+
|
|
258
|
+
### Input → Expected Output
|
|
259
|
+
|
|
260
|
+
| Input | Expected | Actual | Vulnerability |
|
|
261
|
+
|-------|----------|--------|---------------|
|
|
262
|
+
| `verify_ssl=false` | Clear warning | Silent acceptance | Config cliff |
|
|
263
|
+
| `password=""` | Rejection | Login success | Empty bypass |
|
|
264
|
+
| `algorithm="none"` | Error | Signature skipped | Downgrade |
|
|
265
|
+
| `timeout=-1` | Error | Infinite timeout | Magic value |
|
|
266
|
+
|
|
267
|
+
### Library Comparison
|
|
268
|
+
|
|
269
|
+
| Feature | Dangerous Library | Safer Alternative |
|
|
270
|
+
|---------|------------------|-------------------|
|
|
271
|
+
| Bignum crypto | GMP | libsodium, OpenSSL BIGNUM |
|
|
272
|
+
| TLS | Raw OpenSSL | Higher-level wrappers |
|
|
273
|
+
| Serialization | pickle, YAML | JSON, protobuf |
|
|
274
|
+
| Password compare | strcmp | hash_equals, secrets.compare_digest |
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Configuration Security Patterns
|
|
2
|
+
|
|
3
|
+
Dangerous configuration patterns that enable security failures.
|
|
4
|
+
|
|
5
|
+
## Zero/Empty/Null Semantics
|
|
6
|
+
|
|
7
|
+
### The Lifetime Zero Problem
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
# What does 0 mean?
|
|
11
|
+
session_timeout: 0 # Infinite timeout? Immediate expiry? Disabled?
|
|
12
|
+
token_lifetime: 0 # Never expires? Already expired? Use default?
|
|
13
|
+
max_attempts: 0 # No attempts allowed? Unlimited attempts?
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Real-world failures:**
|
|
17
|
+
- OTP libraries where `lifetime=0` means "accept any OTP regardless of age"
|
|
18
|
+
- Rate limiters where `max_attempts=0` disables rate limiting
|
|
19
|
+
- Session managers where `timeout=0` means "session never expires"
|
|
20
|
+
|
|
21
|
+
**Detection**: Any numeric security parameter that accepts 0.
|
|
22
|
+
|
|
23
|
+
**Fix**: Explicit constants, validation, or separate enable/disable flag.
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
# BAD
|
|
27
|
+
def verify_otp(code: str, lifetime: int = 300):
|
|
28
|
+
if lifetime <= 0:
|
|
29
|
+
return True # What??
|
|
30
|
+
|
|
31
|
+
# GOOD
|
|
32
|
+
def verify_otp(code: str, lifetime: int = 300):
|
|
33
|
+
if lifetime <= 0:
|
|
34
|
+
raise ValueError("lifetime must be positive")
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Empty String Bypass
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
# Passwords
|
|
41
|
+
if user_password == stored_hash: # What if stored_hash is ""?
|
|
42
|
+
|
|
43
|
+
# API keys
|
|
44
|
+
if api_key == config.api_key: # What if config is empty?
|
|
45
|
+
grant_access()
|
|
46
|
+
|
|
47
|
+
# The empty string equals the empty string
|
|
48
|
+
"" == "" # True - authentication bypassed
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Detection**: String comparisons for authentication without empty checks.
|
|
52
|
+
|
|
53
|
+
### Null as "Skip"
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// DANGEROUS: null means "skip verification"
|
|
57
|
+
function verifySignature(data, signature, publicKey) {
|
|
58
|
+
if (!publicKey) return true; // No key = trust everything?
|
|
59
|
+
return crypto.verify(data, signature, publicKey);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// DANGEROUS: null means "any value"
|
|
63
|
+
function checkRole(user, requiredRole) {
|
|
64
|
+
if (!requiredRole) return true; // No requirement = allow all?
|
|
65
|
+
return user.roles.includes(requiredRole);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Boolean Traps
|
|
70
|
+
|
|
71
|
+
### Security-Disabling Flags
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
# Every one of these has caused real vulnerabilities
|
|
75
|
+
verify_ssl: false
|
|
76
|
+
validate_certificate: false
|
|
77
|
+
check_signature: false
|
|
78
|
+
require_auth: false
|
|
79
|
+
enable_csrf_protection: false
|
|
80
|
+
sanitize_input: false
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Pattern**: Any boolean that disables a security control.
|
|
84
|
+
|
|
85
|
+
**The typo problem:**
|
|
86
|
+
```yaml
|
|
87
|
+
verify_ssl: fasle # Typo - what does the parser do?
|
|
88
|
+
verify_ssl: "false" # String "false" - truthy in many languages!
|
|
89
|
+
verify_ssl: 0 # Integer 0 - falsy, but is it valid?
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Double Negatives
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
# Confusing
|
|
96
|
+
disable_auth: false # Auth enabled? Let me re-read...
|
|
97
|
+
skip_validation: false # Validation runs? Think carefully...
|
|
98
|
+
|
|
99
|
+
# Clear
|
|
100
|
+
auth_enabled: true
|
|
101
|
+
validate_input: true
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Magic Values
|
|
105
|
+
|
|
106
|
+
### Sentinel Values in Security Parameters
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
# What do these mean?
|
|
110
|
+
max_retries: -1 # Infinite? Error? Use default?
|
|
111
|
+
cache_ttl: -1 # Never expire? Disabled?
|
|
112
|
+
timeout_seconds: -1 # Wait forever? Use system default?
|
|
113
|
+
|
|
114
|
+
# Real vulnerability: connection pool with max_connections: -1
|
|
115
|
+
# meant "unlimited" - enabled DoS via connection exhaustion
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Special String Values
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
# Dangerous patterns
|
|
122
|
+
allowed_origins: "*" # CORS wildcard
|
|
123
|
+
allowed_hosts: "any" # Bypass host validation
|
|
124
|
+
log_level: "none" # Disable security logging
|
|
125
|
+
password_policy: "disabled" # No password requirements
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Detection**: String configs that accept wildcards or "disable" keywords.
|
|
129
|
+
|
|
130
|
+
## Combination Hazards
|
|
131
|
+
|
|
132
|
+
### Conflicting Settings
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
# Both true - which wins?
|
|
136
|
+
require_authentication: true
|
|
137
|
+
allow_anonymous_access: true
|
|
138
|
+
|
|
139
|
+
# Both specified - conflict
|
|
140
|
+
session_cookie_secure: true
|
|
141
|
+
force_http: true # HTTP can't use Secure cookies
|
|
142
|
+
|
|
143
|
+
# Mutually exclusive
|
|
144
|
+
encryption_key: "..."
|
|
145
|
+
encryption_disabled: true
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Precedence Confusion
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
# In config file
|
|
152
|
+
verify_ssl: true
|
|
153
|
+
|
|
154
|
+
# But overrideable by environment?
|
|
155
|
+
VERIFY_SSL=false # Which wins?
|
|
156
|
+
|
|
157
|
+
# And command line?
|
|
158
|
+
--no-verify-ssl # Now there are three sources
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Fix**: Document precedence clearly; warn on conflicts; fail on contradictions.
|
|
162
|
+
|
|
163
|
+
## Environment Variable Hazards
|
|
164
|
+
|
|
165
|
+
### Sensitive Values in Environment
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Common but problematic
|
|
169
|
+
export DATABASE_PASSWORD="secret"
|
|
170
|
+
export API_KEY="sk_live_xxx"
|
|
171
|
+
|
|
172
|
+
# Risks:
|
|
173
|
+
# - Visible in process listings (ps aux)
|
|
174
|
+
# - Inherited by child processes
|
|
175
|
+
# - Logged in error dumps
|
|
176
|
+
# - Visible in container inspection
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Override Attacks
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
# Application trusts environment
|
|
183
|
+
debug = os.environ.get("DEBUG", "false") == "true"
|
|
184
|
+
|
|
185
|
+
# Attacker with environment access:
|
|
186
|
+
export DEBUG=true # Enables verbose logging of secrets
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Detection**: Security settings controllable via environment without validation.
|
|
190
|
+
|
|
191
|
+
## Path Traversal via Config
|
|
192
|
+
|
|
193
|
+
### Unrestricted Path Configuration
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
# User-controlled paths
|
|
197
|
+
log_file: "../../../etc/passwd"
|
|
198
|
+
upload_dir: "/etc/nginx/conf.d/"
|
|
199
|
+
template_dir: "../../../etc/shadow"
|
|
200
|
+
|
|
201
|
+
# Even "read-only" paths can leak secrets
|
|
202
|
+
config_include: "/etc/shadow"
|
|
203
|
+
certificate_file: "/proc/self/environ"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Fix**: Validate paths; restrict to allowed directories; resolve and check.
|
|
207
|
+
|
|
208
|
+
## Unvalidated Constructor Parameters
|
|
209
|
+
|
|
210
|
+
Configuration/parameter classes that accept security-relevant values without validation create "time bombs" - the insecure value is accepted silently at construction, then explodes later during use.
|
|
211
|
+
|
|
212
|
+
### Algorithm Selection Without Allowlist
|
|
213
|
+
|
|
214
|
+
```php
|
|
215
|
+
// DANGEROUS: Accepts any string including weak algorithms
|
|
216
|
+
readonly class ServerConfig {
|
|
217
|
+
public function __construct(
|
|
218
|
+
public string $hashAlgo = 'sha256', // Accepts 'md5', 'crc32', 'adler32'
|
|
219
|
+
public string $cipher = 'aes-256-gcm', // Accepts 'des', 'rc4'
|
|
220
|
+
) {}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Caller can pass insecure values:
|
|
224
|
+
new ServerConfig(hashAlgo: 'md5'); // Silently accepted!
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Detection**: Constructor parameters named `algo`, `algorithm`, `hash*`, `cipher`, `mode`, `*_type` that accept strings without validation.
|
|
228
|
+
|
|
229
|
+
**Fix**: Validate against an explicit allowlist at construction:
|
|
230
|
+
|
|
231
|
+
```php
|
|
232
|
+
public function __construct(public string $hashAlgo = 'sha256') {
|
|
233
|
+
if (!in_array($hashAlgo, ['sha256', 'sha384', 'sha512'], true)) {
|
|
234
|
+
throw new InvalidArgumentException("Disallowed hash algorithm: $hashAlgo");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Timing Parameters Without Bounds
|
|
240
|
+
|
|
241
|
+
```php
|
|
242
|
+
// DANGEROUS: No minimum or maximum bounds
|
|
243
|
+
readonly class AuthConfig {
|
|
244
|
+
public function __construct(
|
|
245
|
+
public int $otpLifetime = 120, // Accepts 0 (immediate expiry? infinite?)
|
|
246
|
+
public int $sessionTimeout = 3600, // Accepts -1 (what does this mean?)
|
|
247
|
+
public int $maxRetries = 5, // Accepts 0 (no retries? unlimited?)
|
|
248
|
+
) {}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// All of these are silently accepted:
|
|
252
|
+
new AuthConfig(otpLifetime: 0); // OTP always expired or never expires?
|
|
253
|
+
new AuthConfig(otpLifetime: 999999); // ~11 days - replay attacks!
|
|
254
|
+
new AuthConfig(maxRetries: -1); // Unlimited retries = brute force
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Detection**: Numeric constructor parameters for `*lifetime`, `*timeout`, `*ttl`, `*duration`, `max_*`, `min_*`, `*_seconds`, `*_attempts` without range validation.
|
|
258
|
+
|
|
259
|
+
**Fix**: Enforce both minimum AND maximum bounds:
|
|
260
|
+
|
|
261
|
+
```php
|
|
262
|
+
public function __construct(public int $otpLifetime = 120) {
|
|
263
|
+
if ($otpLifetime < 2) {
|
|
264
|
+
throw new InvalidArgumentException("OTP lifetime too short (min: 2 seconds)");
|
|
265
|
+
}
|
|
266
|
+
if ($otpLifetime > 300) {
|
|
267
|
+
throw new InvalidArgumentException("OTP lifetime too long (max: 300 seconds)");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Hostname/URL Parameters Without Validation
|
|
273
|
+
|
|
274
|
+
```php
|
|
275
|
+
// DANGEROUS: No format validation
|
|
276
|
+
readonly class NetworkConfig {
|
|
277
|
+
public function __construct(
|
|
278
|
+
public string $hostname = 'localhost', // Accepts anything
|
|
279
|
+
public string $callbackUrl = '', // Accepts malformed URLs
|
|
280
|
+
) {}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Silently accepted:
|
|
284
|
+
new NetworkConfig(hostname: '../../../etc/passwd');
|
|
285
|
+
new NetworkConfig(hostname: 'localhost; rm -rf /');
|
|
286
|
+
new NetworkConfig(callbackUrl: 'javascript:alert(1)');
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Detection**: String constructor parameters named `host`, `hostname`, `domain`, `*_url`, `*_uri`, `endpoint`, `callback*` without validation.
|
|
290
|
+
|
|
291
|
+
**Fix**: Validate format at construction:
|
|
292
|
+
|
|
293
|
+
```php
|
|
294
|
+
public function __construct(public string $hostname = 'localhost') {
|
|
295
|
+
if (!filter_var($hostname, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) {
|
|
296
|
+
throw new InvalidArgumentException("Invalid hostname: $hostname");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### The "Sensible Default" Trap
|
|
302
|
+
|
|
303
|
+
Having a secure default does NOT protect you - callers can override it:
|
|
304
|
+
|
|
305
|
+
```php
|
|
306
|
+
// Default is secure...
|
|
307
|
+
public function __construct(
|
|
308
|
+
public string $hashAlgo = 'sha256' // Good default!
|
|
309
|
+
) {}
|
|
310
|
+
|
|
311
|
+
// ...but callers can still shoot themselves
|
|
312
|
+
$config = new Config(hashAlgo: 'md5'); // Oops
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**The rule**: If a parameter affects security, validate it. Defaults only help developers who don't specify a value; validation protects everyone.
|
|
316
|
+
|
|
317
|
+
## Configuration Validation Checklist
|
|
318
|
+
|
|
319
|
+
For configuration schemas, verify:
|
|
320
|
+
|
|
321
|
+
- [ ] **Zero/empty rejected**: Numeric security params require positive values
|
|
322
|
+
- [ ] **No empty passwords/keys**: Empty string authentication forbidden
|
|
323
|
+
- [ ] **No security-disabling booleans**: Or require confirmation/separate config
|
|
324
|
+
- [ ] **No magic values**: -1 and wildcards have defined, safe meanings
|
|
325
|
+
- [ ] **Conflict detection**: Contradictory settings produce errors
|
|
326
|
+
- [ ] **Precedence documented**: Clear order when multiple sources exist
|
|
327
|
+
- [ ] **Path validation**: User-provided paths restricted to safe directories
|
|
328
|
+
- [ ] **Type strictness**: "false" string not silently converted to boolean
|
|
329
|
+
- [ ] **Deprecation warnings**: Insecure legacy options warn loudly
|
|
330
|
+
- [ ] **Algorithm allowlist**: Crypto algorithm params validated against safe options
|
|
331
|
+
- [ ] **Timing bounds**: Lifetime/timeout params have both min AND max limits
|
|
332
|
+
- [ ] **Hostname/URL validation**: Network addresses validated at construction
|
|
333
|
+
- [ ] **Constructor validation**: All security params validated, not just defaulted
|