@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,190 @@
|
|
|
1
|
+
# Cryptographic API Footguns
|
|
2
|
+
|
|
3
|
+
Detailed patterns for identifying misuse-prone cryptographic interfaces.
|
|
4
|
+
|
|
5
|
+
## Algorithm Selection Anti-Patterns
|
|
6
|
+
|
|
7
|
+
### The "alg" Header Attack (JWT)
|
|
8
|
+
|
|
9
|
+
The JSON Web Token standard allows the token itself to specify which algorithm to use for verification. This is catastrophically wrong.
|
|
10
|
+
|
|
11
|
+
**Attack 1: "none" algorithm**
|
|
12
|
+
```json
|
|
13
|
+
{"alg": "none", "typ": "JWT"}
|
|
14
|
+
```
|
|
15
|
+
Many libraries accept this and skip signature verification entirely.
|
|
16
|
+
|
|
17
|
+
**Attack 2: Algorithm confusion (RS256 → HS256)**
|
|
18
|
+
- Server expects RSA signature, uses public key for verification
|
|
19
|
+
- Attacker changes algorithm to HMAC, uses *public key* as HMAC secret
|
|
20
|
+
- Public key is public, so attacker can forge valid signatures
|
|
21
|
+
|
|
22
|
+
**Root cause**: Trusting untrusted input to select security mechanisms.
|
|
23
|
+
|
|
24
|
+
**Fix**: Never let data dictate algorithm. Use one algorithm, hardcoded.
|
|
25
|
+
|
|
26
|
+
### Cipher Mode Parameters
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
# DANGEROUS: mode is selectable
|
|
30
|
+
def encrypt(plaintext, key, mode="ECB"): # ECB is never correct
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
# BAD: accepts any OpenSSL cipher string
|
|
34
|
+
cipher = OpenSSL::Cipher.new(user_selected_cipher)
|
|
35
|
+
|
|
36
|
+
# GOOD: no parameters
|
|
37
|
+
def encrypt(plaintext, key): # internally uses AES-256-GCM
|
|
38
|
+
...
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Detection**: Parameters named `mode`, `cipher`, `algorithm`, `hash_type`
|
|
42
|
+
|
|
43
|
+
### Hash Algorithm Downgrade
|
|
44
|
+
|
|
45
|
+
```php
|
|
46
|
+
// PHP's hash() accepts ANY algorithm
|
|
47
|
+
hash("crc32", $password); // Valid call, terrible security
|
|
48
|
+
hash("md5", $password); // Valid call, broken security
|
|
49
|
+
hash("sha256", $password); // Valid call, still wrong for passwords
|
|
50
|
+
|
|
51
|
+
// Password functions limit choices
|
|
52
|
+
password_hash($password, PASSWORD_ARGON2ID); // Better
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Pattern**: APIs that accept algorithm as string instead of restricting to safe subset.
|
|
56
|
+
|
|
57
|
+
## Key/Nonce/IV Confusion
|
|
58
|
+
|
|
59
|
+
### Indistinguishable Byte Arrays
|
|
60
|
+
|
|
61
|
+
```go
|
|
62
|
+
// All three are just []byte - easy to swap
|
|
63
|
+
func Encrypt(plaintext, key, nonce []byte) []byte
|
|
64
|
+
|
|
65
|
+
// Easy mistakes:
|
|
66
|
+
Encrypt(plaintext, nonce, key) // Swapped - compiles fine
|
|
67
|
+
Encrypt(plaintext, key, key) // Reused key as nonce - compiles fine
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Fix**: Distinct types
|
|
71
|
+
|
|
72
|
+
```go
|
|
73
|
+
type EncryptionKey [32]byte
|
|
74
|
+
type Nonce [24]byte
|
|
75
|
+
|
|
76
|
+
func Encrypt(plaintext []byte, key EncryptionKey, nonce Nonce) []byte
|
|
77
|
+
// Now type system catches swaps
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Nonce Reuse
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
# DANGEROUS: nonce parameter with no guidance
|
|
84
|
+
def encrypt(plaintext, key, nonce):
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
# Developer "simplifies" by reusing:
|
|
88
|
+
nonce = b'\x00' * 12
|
|
89
|
+
encrypt(msg1, key, nonce)
|
|
90
|
+
encrypt(msg2, key, nonce) # Catastrophic with GCM/ChaCha
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Fix**: Generate nonces internally, return them with ciphertext.
|
|
94
|
+
|
|
95
|
+
## Comparison Footguns
|
|
96
|
+
|
|
97
|
+
### Timing-Safe vs. Regular Comparison
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
# These look identical but have different security properties
|
|
101
|
+
if computed_mac == expected_mac: # VULNERABLE: timing attack
|
|
102
|
+
if hmac.compare_digest(computed_mac, expected_mac): # Safe
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**The problem**: Developers don't know to use special comparison. Default string equality is vulnerable.
|
|
106
|
+
|
|
107
|
+
**Detection**: Direct equality checks on MACs, signatures, hashes, tokens.
|
|
108
|
+
|
|
109
|
+
### Boolean Confusion
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
# Signature verification APIs
|
|
113
|
+
result = verify(signature, message, key)
|
|
114
|
+
|
|
115
|
+
# Some return True/False
|
|
116
|
+
if verify(...): # Must check return value
|
|
117
|
+
|
|
118
|
+
# Some raise exceptions
|
|
119
|
+
verify(...) # Failure = exception, no return to check
|
|
120
|
+
|
|
121
|
+
# Developers mixing these up = vulnerabilities
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Padding Oracle Enablers
|
|
125
|
+
|
|
126
|
+
### Raw Decryption APIs
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
# DANGEROUS: returns plaintext even if padding invalid
|
|
130
|
+
def decrypt(ciphertext, key):
|
|
131
|
+
# ... decrypt ...
|
|
132
|
+
return unpad(plaintext) # Throws on bad padding
|
|
133
|
+
|
|
134
|
+
# Attacker can distinguish:
|
|
135
|
+
# - Valid padding → success
|
|
136
|
+
# - Invalid padding → exception
|
|
137
|
+
|
|
138
|
+
# This distinction enables padding oracle attacks
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Fix**: Decrypt-then-MAC (or authenticated encryption). Never expose padding validity.
|
|
142
|
+
|
|
143
|
+
### Error Message Differentiation
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
# DANGEROUS error messages
|
|
147
|
+
"Invalid padding" # Padding oracle signal
|
|
148
|
+
"MAC verification failed" # Different error = oracle
|
|
149
|
+
"Decryption failed" # Good: single error for all failures
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Key Derivation Footguns
|
|
153
|
+
|
|
154
|
+
### Using Hashes Instead of KDFs
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# DANGEROUS: hash is not a KDF
|
|
158
|
+
key = hashlib.sha256(password.encode()).digest()
|
|
159
|
+
|
|
160
|
+
# Developer reasoning: "SHA-256 is secure"
|
|
161
|
+
# Reality: Fast hash enables brute force
|
|
162
|
+
|
|
163
|
+
# CORRECT: use actual KDF
|
|
164
|
+
key = hashlib.scrypt(password.encode(), salt=salt, n=2**14, r=8, p=1)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Password Storage Misuse
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
# DANGEROUS: encryption is not password storage
|
|
171
|
+
encrypted_password = encrypt(password, master_key)
|
|
172
|
+
# Compromise of master_key = all passwords exposed
|
|
173
|
+
|
|
174
|
+
# CORRECT: one-way hash with salt
|
|
175
|
+
hashed_password = argon2.hash(password)
|
|
176
|
+
# No key to steal; each password salted differently
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Safe API Design Checklist
|
|
180
|
+
|
|
181
|
+
For cryptographic APIs, verify:
|
|
182
|
+
|
|
183
|
+
- [ ] **No algorithm selection**: One safe algorithm, hardcoded
|
|
184
|
+
- [ ] **No mode selection**: GCM/ChaCha20-Poly1305 only, no ECB/CBC
|
|
185
|
+
- [ ] **Distinct types**: Keys, nonces, ciphertexts are different types
|
|
186
|
+
- [ ] **Internal nonce generation**: Don't require developer to provide
|
|
187
|
+
- [ ] **Authenticated encryption**: Encrypt-then-MAC or AEAD built in
|
|
188
|
+
- [ ] **Constant-time comparison**: Default or only comparison method
|
|
189
|
+
- [ ] **Uniform errors**: Same error for all decryption failures
|
|
190
|
+
- [ ] **KDF for passwords**: Argon2/scrypt/bcrypt, not raw hashes
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# C/C++ Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Integer Overflow is Undefined Behavior
|
|
4
|
+
|
|
5
|
+
```c
|
|
6
|
+
// DANGEROUS: Signed overflow is UB, compiler can optimize away checks
|
|
7
|
+
int x = INT_MAX;
|
|
8
|
+
if (x + 1 > x) { // Compiler may assume always true (UB)
|
|
9
|
+
// Overflow check optimized away!
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// DANGEROUS: Size calculations
|
|
13
|
+
size_t size = user_count * sizeof(struct User);
|
|
14
|
+
// If user_count * sizeof overflows, allocates tiny buffer
|
|
15
|
+
void *buf = malloc(size);
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**The Problem**: Signed integer overflow is undefined behavior. Compilers assume it never happens and optimize accordingly—including removing overflow checks.
|
|
19
|
+
|
|
20
|
+
**Detection**: Look for arithmetic on signed integers, especially in size calculations, loop bounds, and allocation sizes.
|
|
21
|
+
|
|
22
|
+
## Buffer Handling
|
|
23
|
+
|
|
24
|
+
```c
|
|
25
|
+
// DANGEROUS: No bounds checking
|
|
26
|
+
char buf[64];
|
|
27
|
+
strcpy(buf, user_input); // Classic overflow
|
|
28
|
+
sprintf(buf, "Hello %s", name); // Format + overflow
|
|
29
|
+
gets(buf); // Never use, removed in C11
|
|
30
|
+
|
|
31
|
+
// DANGEROUS: Off-by-one
|
|
32
|
+
char buf[64];
|
|
33
|
+
strncpy(buf, src, 64); // NOT null-terminated if src >= 64!
|
|
34
|
+
buf[63] = '\0'; // Must do manually
|
|
35
|
+
|
|
36
|
+
// DANGEROUS: snprintf return value
|
|
37
|
+
int ret = snprintf(buf, sizeof(buf), "%s", long_string);
|
|
38
|
+
// ret is length that WOULD be written, not actual length
|
|
39
|
+
// If ret >= sizeof(buf), output was truncated
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Safe Alternatives**:
|
|
43
|
+
- `strlcpy`, `strlcat` (BSD, not standard)
|
|
44
|
+
- `snprintf` with proper return value checking
|
|
45
|
+
- C11 Annex K `strcpy_s`, `sprintf_s` (limited support)
|
|
46
|
+
|
|
47
|
+
## Format Strings
|
|
48
|
+
|
|
49
|
+
```c
|
|
50
|
+
// DANGEROUS: User controls format
|
|
51
|
+
printf(user_input); // Format string attack
|
|
52
|
+
syslog(LOG_INFO, user_input); // Same problem
|
|
53
|
+
fprintf(stderr, user_input); // Same problem
|
|
54
|
+
|
|
55
|
+
// Attacker input: "%x%x%x%x" → leaks stack
|
|
56
|
+
// Attacker input: "%n" → writes to memory
|
|
57
|
+
|
|
58
|
+
// SAFE: Format as literal
|
|
59
|
+
printf("%s", user_input);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Detection**: Any `*printf` family function where the format argument is not a string literal.
|
|
63
|
+
|
|
64
|
+
## Memory Cleanup
|
|
65
|
+
|
|
66
|
+
```c
|
|
67
|
+
// DANGEROUS: Compiler may optimize away
|
|
68
|
+
char password[64];
|
|
69
|
+
// ... use password ...
|
|
70
|
+
memset(password, 0, sizeof(password)); // May be removed!
|
|
71
|
+
|
|
72
|
+
// The compiler sees: "writes to password, then password goes out of scope"
|
|
73
|
+
// Optimization: "dead store elimination" removes the memset
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Safe Alternatives**:
|
|
77
|
+
```c
|
|
78
|
+
// Option 1: explicit_bzero (BSD, glibc 2.25+)
|
|
79
|
+
explicit_bzero(password, sizeof(password));
|
|
80
|
+
|
|
81
|
+
// Option 2: SecureZeroMemory (Windows)
|
|
82
|
+
SecureZeroMemory(password, sizeof(password));
|
|
83
|
+
|
|
84
|
+
// Option 3: Volatile function pointer trick
|
|
85
|
+
static void *(*const volatile memset_ptr)(void *, int, size_t) = memset;
|
|
86
|
+
memset_ptr(password, 0, sizeof(password));
|
|
87
|
+
|
|
88
|
+
// Option 4: C11 memset_s (limited support)
|
|
89
|
+
memset_s(password, sizeof(password), 0, sizeof(password));
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Uninitialized Variables
|
|
93
|
+
|
|
94
|
+
```c
|
|
95
|
+
// DANGEROUS: Uninitialized stack variables
|
|
96
|
+
int result;
|
|
97
|
+
if (condition) {
|
|
98
|
+
result = compute();
|
|
99
|
+
}
|
|
100
|
+
return result; // Uninitialized if !condition
|
|
101
|
+
|
|
102
|
+
// DANGEROUS: Uninitialized struct padding
|
|
103
|
+
struct {
|
|
104
|
+
char a; // 1 byte
|
|
105
|
+
// 3 bytes padding (uninitialized)
|
|
106
|
+
int b; // 4 bytes
|
|
107
|
+
} s;
|
|
108
|
+
s.a = 'x';
|
|
109
|
+
s.b = 42;
|
|
110
|
+
send(sock, &s, sizeof(s), 0); // Leaks 3 bytes of stack
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Fix**: Use `= {0}` initialization or `memset`.
|
|
114
|
+
|
|
115
|
+
## Double Free and Use-After-Free
|
|
116
|
+
|
|
117
|
+
```c
|
|
118
|
+
// DANGEROUS: Double free
|
|
119
|
+
free(ptr);
|
|
120
|
+
// ... later ...
|
|
121
|
+
free(ptr); // Heap corruption
|
|
122
|
+
|
|
123
|
+
// DANGEROUS: Use after free
|
|
124
|
+
free(ptr);
|
|
125
|
+
ptr->value = 42; // Writing to freed memory
|
|
126
|
+
|
|
127
|
+
// DANGEROUS: Returning pointer to local
|
|
128
|
+
char *get_greeting() {
|
|
129
|
+
char buf[64] = "hello";
|
|
130
|
+
return buf; // Stack pointer invalid after return
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Mitigations**:
|
|
135
|
+
- Set pointer to NULL after free: `free(ptr); ptr = NULL;`
|
|
136
|
+
- Use static analysis (Coverity, cppcheck)
|
|
137
|
+
- Use AddressSanitizer in testing
|
|
138
|
+
|
|
139
|
+
## Signal Handler Issues
|
|
140
|
+
|
|
141
|
+
```c
|
|
142
|
+
// DANGEROUS: Non-async-signal-safe functions in handler
|
|
143
|
+
void handler(int sig) {
|
|
144
|
+
printf("Got signal\n"); // NOT async-signal-safe
|
|
145
|
+
malloc(100); // NOT async-signal-safe
|
|
146
|
+
free(ptr); // NOT async-signal-safe
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Async-signal-safe: write(), _exit(), signal()
|
|
150
|
+
// Most functions including printf, malloc, free are NOT safe
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Time-of-Check to Time-of-Use (TOCTOU)
|
|
154
|
+
|
|
155
|
+
```c
|
|
156
|
+
// DANGEROUS: File state can change between check and use
|
|
157
|
+
if (access(filename, W_OK) == 0) {
|
|
158
|
+
// Attacker replaces file with symlink here
|
|
159
|
+
fd = open(filename, O_WRONLY); // Opens different file
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Fix**: Open first, then check permissions on the file descriptor.
|
|
164
|
+
|
|
165
|
+
## Variadic Function Pitfalls
|
|
166
|
+
|
|
167
|
+
```c
|
|
168
|
+
// DANGEROUS: Wrong format specifier
|
|
169
|
+
printf("%d", (long long)value); // %d expects int, not long long
|
|
170
|
+
printf("%s", 42); // Interprets 42 as pointer
|
|
171
|
+
|
|
172
|
+
// DANGEROUS: Missing sentinel
|
|
173
|
+
execl("/bin/ls", "ls", "-l", NULL); // NULL required!
|
|
174
|
+
execl("/bin/ls", "ls", "-l"); // Missing NULL = UB
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Macro Pitfalls
|
|
178
|
+
|
|
179
|
+
```c
|
|
180
|
+
// DANGEROUS: Macro arguments evaluated multiple times
|
|
181
|
+
#define SQUARE(x) ((x) * (x))
|
|
182
|
+
int a = 5;
|
|
183
|
+
SQUARE(a++); // Expands to ((a++) * (a++)) - increments twice!
|
|
184
|
+
|
|
185
|
+
// DANGEROUS: Operator precedence
|
|
186
|
+
#define ADD(a, b) a + b
|
|
187
|
+
int x = ADD(1, 2) * 3; // Expands to 1 + 2 * 3 = 7, not 9
|
|
188
|
+
|
|
189
|
+
// SAFER: Fully parenthesize
|
|
190
|
+
#define ADD(a, b) ((a) + (b))
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Detection Patterns
|
|
194
|
+
|
|
195
|
+
Search for these patterns in C/C++ code:
|
|
196
|
+
|
|
197
|
+
| Pattern | Risk |
|
|
198
|
+
|---------|------|
|
|
199
|
+
| `strcpy`, `strcat`, `gets`, `sprintf` | Buffer overflow |
|
|
200
|
+
| `printf(var)` where var is not literal | Format string |
|
|
201
|
+
| `memset` before variable goes out of scope | Dead store elimination |
|
|
202
|
+
| `free(ptr)` without `ptr = NULL` | Double free risk |
|
|
203
|
+
| `malloc` without overflow check on size | Integer overflow |
|
|
204
|
+
| Arithmetic on `int` near INT_MAX | Signed overflow UB |
|
|
205
|
+
| `strncpy` without explicit null termination | Missing terminator |
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# C# Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Nullable Reference Types
|
|
4
|
+
|
|
5
|
+
```csharp
|
|
6
|
+
// DANGEROUS: NRT is opt-in and warnings-only by default
|
|
7
|
+
// Project must enable: <Nullable>enable</Nullable>
|
|
8
|
+
|
|
9
|
+
string? nullable = null;
|
|
10
|
+
string nonNull = nullable; // Warning, but compiles!
|
|
11
|
+
nonNull.Length; // NullReferenceException at runtime
|
|
12
|
+
|
|
13
|
+
// DANGEROUS: Suppression operator
|
|
14
|
+
string value = possiblyNull!; // Suppresses warning, doesn't fix bug
|
|
15
|
+
|
|
16
|
+
// DANGEROUS: Default enabled doesn't mean enforced
|
|
17
|
+
// Many legacy codebases have NRT enabled with thousands of warnings ignored
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Fix**: Enable NRT AND treat warnings as errors:
|
|
21
|
+
```xml
|
|
22
|
+
<Nullable>enable</Nullable>
|
|
23
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Default Struct Values
|
|
27
|
+
|
|
28
|
+
```csharp
|
|
29
|
+
// DANGEROUS: Structs have default(T) that may be invalid
|
|
30
|
+
struct Connection {
|
|
31
|
+
public string Host; // Default: null
|
|
32
|
+
public int Port; // Default: 0
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var conn = default(Connection);
|
|
36
|
+
// conn.Host is null, conn.Port is 0 - probably invalid state
|
|
37
|
+
|
|
38
|
+
// DANGEROUS: Array of structs
|
|
39
|
+
var connections = new Connection[10];
|
|
40
|
+
// All 10 are default(Connection) - invalid state
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Fix**: Use constructors, or make structs readonly with init validation.
|
|
44
|
+
|
|
45
|
+
## IDisposable Leaks
|
|
46
|
+
|
|
47
|
+
```csharp
|
|
48
|
+
// DANGEROUS: Resources not disposed on exception
|
|
49
|
+
var conn = new SqlConnection(connectionString);
|
|
50
|
+
conn.Open();
|
|
51
|
+
// Exception here = connection never closed
|
|
52
|
+
Process(conn);
|
|
53
|
+
conn.Dispose();
|
|
54
|
+
|
|
55
|
+
// DANGEROUS: Nested disposables
|
|
56
|
+
var outer = new Outer(); // Creates inner disposable
|
|
57
|
+
// Exception before outer.Dispose() = inner leaked
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Fix**: Use `using` statement or declaration:
|
|
61
|
+
```csharp
|
|
62
|
+
using var conn = new SqlConnection(connectionString);
|
|
63
|
+
conn.Open();
|
|
64
|
+
// Disposed even on exception
|
|
65
|
+
|
|
66
|
+
using (var conn = new SqlConnection(...)) {
|
|
67
|
+
// Scoped disposal
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Async/Await Pitfalls
|
|
72
|
+
|
|
73
|
+
```csharp
|
|
74
|
+
// DANGEROUS: async void - exceptions can't be caught
|
|
75
|
+
async void FireAndForget() {
|
|
76
|
+
throw new Exception("Lost!"); // Crashes the process
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// DANGEROUS: Deadlock with .Result
|
|
80
|
+
async Task DoWork() {
|
|
81
|
+
await Task.Delay(100);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void Caller() {
|
|
85
|
+
DoWork().Result; // Deadlock in UI/ASP.NET contexts!
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// DANGEROUS: Forgetting to await
|
|
89
|
+
async Task Process() {
|
|
90
|
+
DoWorkAsync(); // Not awaited - runs in background
|
|
91
|
+
// Exceptions lost, no completion guarantee
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Fix**: Always return Task, use `ConfigureAwait(false)` in libraries:
|
|
96
|
+
```csharp
|
|
97
|
+
async Task DoWorkAsync() {
|
|
98
|
+
await Task.Delay(100).ConfigureAwait(false);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## LINQ Deferred Execution
|
|
103
|
+
|
|
104
|
+
```csharp
|
|
105
|
+
// DANGEROUS: LINQ queries are lazy
|
|
106
|
+
var query = items.Where(x => x.IsValid);
|
|
107
|
+
// Nothing executed yet!
|
|
108
|
+
|
|
109
|
+
items.Add(newItem); // Added after query defined
|
|
110
|
+
foreach (var item in query) {
|
|
111
|
+
// newItem IS included - query executes here
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// DANGEROUS: Multiple enumeration
|
|
115
|
+
var filtered = items.Where(x => ExpensiveCheck(x));
|
|
116
|
+
var count = filtered.Count(); // Executes query
|
|
117
|
+
var first = filtered.First(); // Executes query AGAIN
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Fix**: Materialize with `.ToList()` or `.ToArray()` when needed.
|
|
121
|
+
|
|
122
|
+
## String Comparison
|
|
123
|
+
|
|
124
|
+
```csharp
|
|
125
|
+
// DANGEROUS: Culture-sensitive comparison by default
|
|
126
|
+
"stra\u00dfe".Equals("strasse"); // Depends on culture!
|
|
127
|
+
|
|
128
|
+
// DANGEROUS: Turkish-I problem
|
|
129
|
+
"INFO".ToLower() == "info" // FALSE in Turkish culture!
|
|
130
|
+
// Turkish: I → ı (dotless i), İ → i
|
|
131
|
+
|
|
132
|
+
// DANGEROUS: Ordinal vs linguistic
|
|
133
|
+
string.Compare("a", "A"); // Culture-dependent
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Fix**: Use ordinal comparison for identifiers:
|
|
137
|
+
```csharp
|
|
138
|
+
string.Equals(a, b, StringComparison.Ordinal);
|
|
139
|
+
string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Boxing and Unboxing
|
|
143
|
+
|
|
144
|
+
```csharp
|
|
145
|
+
// DANGEROUS: Hidden boxing with value types
|
|
146
|
+
int value = 42;
|
|
147
|
+
object boxed = value; // Boxing allocation
|
|
148
|
+
int unboxed = (int)boxed; // Unboxing
|
|
149
|
+
|
|
150
|
+
// DANGEROUS: Interface boxing
|
|
151
|
+
struct Point : IComparable<Point> { ... }
|
|
152
|
+
IComparable<Point> comparable = point; // Boxed!
|
|
153
|
+
|
|
154
|
+
// DANGEROUS: LINQ with value types
|
|
155
|
+
var ints = new[] { 1, 2, 3 };
|
|
156
|
+
ints.Where(x => x > 1); // Closure may box
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Equality Implementation
|
|
160
|
+
|
|
161
|
+
```csharp
|
|
162
|
+
// DANGEROUS: Incorrect equality implementation
|
|
163
|
+
class MyClass {
|
|
164
|
+
public int Id;
|
|
165
|
+
|
|
166
|
+
public override bool Equals(object obj) {
|
|
167
|
+
return Id == ((MyClass)obj).Id; // Throws if obj is null or wrong type
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// DANGEROUS: Missing GetHashCode
|
|
171
|
+
// Objects that are Equal MUST have same hash code
|
|
172
|
+
// But: public override int GetHashCode() => ... // Missing!
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Fix**: Implement correctly or use records (C# 9+):
|
|
177
|
+
```csharp
|
|
178
|
+
record MyRecord(int Id); // Equality implemented correctly
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Lock Pitfalls
|
|
182
|
+
|
|
183
|
+
```csharp
|
|
184
|
+
// DANGEROUS: Locking on public object
|
|
185
|
+
public object SyncRoot = new object();
|
|
186
|
+
lock (SyncRoot) { } // External code can deadlock
|
|
187
|
+
|
|
188
|
+
// DANGEROUS: Locking on this
|
|
189
|
+
lock (this) { } // External code can lock same object
|
|
190
|
+
|
|
191
|
+
// DANGEROUS: Locking on Type
|
|
192
|
+
lock (typeof(MyClass)) { } // Type objects are shared across AppDomains
|
|
193
|
+
|
|
194
|
+
// DANGEROUS: Locking on string
|
|
195
|
+
lock ("mylock") { } // String interning makes this shared!
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Fix**: Lock on private readonly object:
|
|
199
|
+
```csharp
|
|
200
|
+
private readonly object _lock = new object();
|
|
201
|
+
lock (_lock) { }
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Finalizers
|
|
205
|
+
|
|
206
|
+
```csharp
|
|
207
|
+
// DANGEROUS: Finalizer delays GC and can resurrect objects
|
|
208
|
+
class Problematic {
|
|
209
|
+
~Problematic() {
|
|
210
|
+
// This code runs on finalizer thread
|
|
211
|
+
// Can't access other managed objects safely
|
|
212
|
+
GlobalList.Add(this); // Resurrection!
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// DANGEROUS: Finalizer without dispose pattern
|
|
217
|
+
// Object stays in memory longer (finalization queue)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Fix**: Implement dispose pattern, avoid finalizers:
|
|
221
|
+
```csharp
|
|
222
|
+
class Proper : IDisposable {
|
|
223
|
+
private bool _disposed;
|
|
224
|
+
|
|
225
|
+
public void Dispose() {
|
|
226
|
+
Dispose(true);
|
|
227
|
+
GC.SuppressFinalize(this);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
protected virtual void Dispose(bool disposing) {
|
|
231
|
+
if (_disposed) return;
|
|
232
|
+
if (disposing) { /* managed cleanup */ }
|
|
233
|
+
// unmanaged cleanup
|
|
234
|
+
_disposed = true;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Event Handler Memory Leaks
|
|
240
|
+
|
|
241
|
+
```csharp
|
|
242
|
+
// DANGEROUS: Event handlers keep objects alive
|
|
243
|
+
class Publisher {
|
|
244
|
+
public event EventHandler Changed;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
class Subscriber {
|
|
248
|
+
public Subscriber(Publisher pub) {
|
|
249
|
+
pub.Changed += OnChanged; // Subscriber now rooted by Publisher
|
|
250
|
+
// Even if Subscriber should be collected, it won't be
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Fix**: Unsubscribe in Dispose or use weak events.
|
|
256
|
+
|
|
257
|
+
## Serialization
|
|
258
|
+
|
|
259
|
+
```csharp
|
|
260
|
+
// DANGEROUS: BinaryFormatter is insecure
|
|
261
|
+
var formatter = new BinaryFormatter();
|
|
262
|
+
formatter.Deserialize(untrustedStream); // RCE vulnerability
|
|
263
|
+
|
|
264
|
+
// Microsoft: "BinaryFormatter is dangerous and is not recommended"
|
|
265
|
+
// Similar issues with NetDataContractSerializer, SoapFormatter
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Fix**: Use JSON, XML with known types, or protobuf.
|
|
269
|
+
|
|
270
|
+
## Detection Patterns
|
|
271
|
+
|
|
272
|
+
| Pattern | Risk |
|
|
273
|
+
|---------|------|
|
|
274
|
+
| `string? x = null; string y = x;` | NRT warning ignored |
|
|
275
|
+
| `possiblyNull!` | Null suppression |
|
|
276
|
+
| `new Connection[n]` for structs | Invalid default state |
|
|
277
|
+
| `SqlConnection` without `using` | Resource leak |
|
|
278
|
+
| `async void` | Unhandled exceptions |
|
|
279
|
+
| `.Result` or `.Wait()` on Task | Deadlock |
|
|
280
|
+
| Missing `await` before async call | Fire and forget |
|
|
281
|
+
| `.Where()` without materialization | Multiple enumeration |
|
|
282
|
+
| `string.Equals` without StringComparison | Culture bugs |
|
|
283
|
+
| `lock (this)` or `lock (typeof(...))` | Deadlock risk |
|
|
284
|
+
| `BinaryFormatter` | Deserialization RCE |
|
|
285
|
+
| Event subscription without unsubscription | Memory leak |
|