@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,740 @@
|
|
|
1
|
+
## 6. Vulnerability Checklist (9 Patterns)
|
|
2
|
+
|
|
3
|
+
### 6.1 INCORRECT GetSigners() ⚠️ CRITICAL
|
|
4
|
+
|
|
5
|
+
**Description**: Mismatch between address returned by `GetSigners()` and address actually used in handler allows unauthorized actions via signer impersonation.
|
|
6
|
+
|
|
7
|
+
**Detection Patterns**:
|
|
8
|
+
```go
|
|
9
|
+
// VULNERABLE: GetSigners returns one address, handler uses different field
|
|
10
|
+
type MsgExample struct {
|
|
11
|
+
Signer string // Returned by GetSigners()
|
|
12
|
+
Author string // Actually used in handler
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
func (msg MsgExample) GetSigners() []sdk.AccAddress {
|
|
16
|
+
return []sdk.AccAddress{sdk.AccAddress(msg.Signer)}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Handler uses Author instead!
|
|
20
|
+
func handleMsgExample(ctx sdk.Context, msg MsgExample) error {
|
|
21
|
+
// WRONG: Using msg.Author instead of verified signer
|
|
22
|
+
return keeper.DoAction(ctx, msg.Author, msg.Data)
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**What to Check**:
|
|
27
|
+
- [ ] `GetSigners()` returns address that is actually used in handler
|
|
28
|
+
- [ ] No multiple address fields in message (signer, author, owner, from, etc.)
|
|
29
|
+
- [ ] Handler only uses addresses from `GetSigners()`
|
|
30
|
+
- [ ] User-provided addresses not stored without validation
|
|
31
|
+
|
|
32
|
+
**Mitigation**:
|
|
33
|
+
```go
|
|
34
|
+
// SECURE: Single address field, used consistently
|
|
35
|
+
type MsgExample struct {
|
|
36
|
+
Signer string // Only address field
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
func (msg MsgExample) GetSigners() []sdk.AccAddress {
|
|
40
|
+
return []sdk.AccAddress{sdk.AccAddress(msg.Signer)}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func handleMsgExample(ctx sdk.Context, msg MsgExample) error {
|
|
44
|
+
// Use the verified signer address
|
|
45
|
+
signers := msg.GetSigners()
|
|
46
|
+
return keeper.DoAction(ctx, signers[0], msg.Data)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Testing**:
|
|
51
|
+
- Unit test with different signer/author values
|
|
52
|
+
- Verify only GetSigners() address has authorization
|
|
53
|
+
- Sanity tests for all message types
|
|
54
|
+
|
|
55
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/incorrect_signer
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### 4.2 NON-DETERMINISM ⚠️ CRITICAL - CHAIN HALT
|
|
60
|
+
|
|
61
|
+
**Description**: Non-deterministic code in consensus causes different validators to produce different state roots, halting the chain. This is the most severe Cosmos vulnerability.
|
|
62
|
+
|
|
63
|
+
**Detection Patterns**:
|
|
64
|
+
|
|
65
|
+
#### Pattern 1: Map Iteration
|
|
66
|
+
```go
|
|
67
|
+
// VULNERABLE: Iterating over Go map (random order)
|
|
68
|
+
assets := make(map[string]sdk.Coin)
|
|
69
|
+
for assetID, coin := range assets { // NON-DETERMINISTIC!
|
|
70
|
+
keeper.ProcessAsset(ctx, assetID, coin)
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### Pattern 2: Platform-Dependent Types
|
|
75
|
+
```go
|
|
76
|
+
// VULNERABLE: Platform-dependent integer types
|
|
77
|
+
var amount int // Size differs: 32-bit vs 64-bit systems
|
|
78
|
+
var price float64 // Float arithmetic is non-deterministic
|
|
79
|
+
|
|
80
|
+
// Serialization produces different bytes on different architectures
|
|
81
|
+
bz := someSerializer(amount) // Different on 32-bit vs 64-bit!
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### Pattern 3: Goroutines and Concurrency
|
|
85
|
+
```go
|
|
86
|
+
// VULNERABLE: Goroutines have non-deterministic execution order
|
|
87
|
+
go processTransaction(tx1)
|
|
88
|
+
go processTransaction(tx2)
|
|
89
|
+
// Order of state updates is non-deterministic!
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### Pattern 4: Select Statements
|
|
93
|
+
```go
|
|
94
|
+
// VULNERABLE: Select with multiple ready channels
|
|
95
|
+
select {
|
|
96
|
+
case msg := <-ch1: // Non-deterministic choice
|
|
97
|
+
process(msg)
|
|
98
|
+
case msg := <-ch2:
|
|
99
|
+
process(msg)
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### Pattern 5: Other Sources
|
|
104
|
+
```go
|
|
105
|
+
// VULNERABLE: Other non-determinism sources
|
|
106
|
+
rand.Intn(100) // Random numbers
|
|
107
|
+
time.Now() // Local system time (use ctx.BlockTime())
|
|
108
|
+
&obj // Memory addresses
|
|
109
|
+
json.Marshal(map) // Map serialization order
|
|
110
|
+
filepath.Walk() // Filesystem traversal order
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**What to Check**:
|
|
114
|
+
- [ ] NO `range` over maps in any consensus code
|
|
115
|
+
- [ ] NO `int`, `uint`, `float32`, `float64` types (use `int32`, `int64`, `sdk.Int`, `sdk.Dec`)
|
|
116
|
+
- [ ] NO goroutines in message handlers or ABCI methods
|
|
117
|
+
- [ ] NO `select` statements with multiple channels
|
|
118
|
+
- [ ] NO `rand` package usage (use deterministic PRF)
|
|
119
|
+
- [ ] NO `time.Now()` (use `ctx.BlockTime()` or `ctx.BlockHeight()`)
|
|
120
|
+
- [ ] NO memory address usage (`&obj`, pointer comparisons)
|
|
121
|
+
- [ ] NO non-deterministic serialization
|
|
122
|
+
|
|
123
|
+
**Mitigation**:
|
|
124
|
+
```go
|
|
125
|
+
// SECURE: Deterministic iteration
|
|
126
|
+
// Option 1: Sort map keys
|
|
127
|
+
keys := make([]string, 0, len(assets))
|
|
128
|
+
for k := range assets {
|
|
129
|
+
keys = append(keys, k)
|
|
130
|
+
}
|
|
131
|
+
sort.Strings(keys) // Deterministic order
|
|
132
|
+
for _, k := range keys {
|
|
133
|
+
keeper.ProcessAsset(ctx, k, assets[k])
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Option 2: Use ordered data structure
|
|
137
|
+
// Use sdk.KVStore with ordered iteration
|
|
138
|
+
|
|
139
|
+
// SECURE: Platform-independent types
|
|
140
|
+
var amount int64 // Explicit 64-bit
|
|
141
|
+
var amount sdk.Int // Arbitrary precision integer
|
|
142
|
+
var price sdk.Dec // Decimal type for consensus
|
|
143
|
+
|
|
144
|
+
// SECURE: Use block time, not system time
|
|
145
|
+
timestamp := ctx.BlockTime() // Deterministic
|
|
146
|
+
height := ctx.BlockHeight() // Deterministic
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Tool Detection**:
|
|
150
|
+
```bash
|
|
151
|
+
# Use CodeQL custom rules
|
|
152
|
+
codeql database create --language=go
|
|
153
|
+
codeql query run cosmos-non-determinism.ql
|
|
154
|
+
|
|
155
|
+
# Look for patterns
|
|
156
|
+
grep -r "range.*map\[" x/
|
|
157
|
+
grep -r "go func" x/
|
|
158
|
+
grep -r "time.Now()" x/
|
|
159
|
+
grep -r "float64\|float32" x/
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/non_determinism
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### 4.3 MESSAGES PRIORITY ⚠️ HIGH
|
|
167
|
+
|
|
168
|
+
**Description**: Missing prioritization of critical messages (oracle updates, emergency pause, governance) allows front-running and censorship during network congestion.
|
|
169
|
+
|
|
170
|
+
**Detection Patterns**:
|
|
171
|
+
```go
|
|
172
|
+
// VULNERABLE: No priority for critical oracle update
|
|
173
|
+
func (app *App) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
|
|
174
|
+
// All messages treated equally, oracle updates can be delayed
|
|
175
|
+
return app.BaseApp.CheckTx(req)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// VULNERABLE: Emergency pause has same priority as normal txs
|
|
179
|
+
// During congestion, pause message may not be included in time
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**What to Check**:
|
|
183
|
+
- [ ] Oracle/price feed updates have high priority
|
|
184
|
+
- [ ] Emergency pause/circuit breaker messages prioritized
|
|
185
|
+
- [ ] Critical governance proposals prioritized
|
|
186
|
+
- [ ] CheckTx returns higher priority for critical message types
|
|
187
|
+
- [ ] High fees required for priority transactions (prevent spam)
|
|
188
|
+
|
|
189
|
+
**Mitigation**:
|
|
190
|
+
```go
|
|
191
|
+
// SECURE: Prioritize critical messages in CheckTx
|
|
192
|
+
func (app *App) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
|
|
193
|
+
tx, err := app.txDecoder(req.Tx)
|
|
194
|
+
if err != nil {
|
|
195
|
+
return sdkerrors.ResponseCheckTx(err, 0, 0, app.trace)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
msgs := tx.GetMsgs()
|
|
199
|
+
priority := int64(0)
|
|
200
|
+
|
|
201
|
+
for _, msg := range msgs {
|
|
202
|
+
switch msg.(type) {
|
|
203
|
+
case *oracle.MsgUpdatePrice:
|
|
204
|
+
// Verify sender is authorized oracle
|
|
205
|
+
if isAuthorizedOracle(msg.GetSigners()[0]) {
|
|
206
|
+
priority = 1000000 // Highest priority
|
|
207
|
+
}
|
|
208
|
+
case *crisis.MsgPause:
|
|
209
|
+
// Verify sender is admin
|
|
210
|
+
if isAdmin(msg.GetSigners()[0]) {
|
|
211
|
+
priority = 1000000 // Highest priority
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return abci.ResponseCheckTx{
|
|
217
|
+
Code: 0,
|
|
218
|
+
Priority: priority,
|
|
219
|
+
// High priority messages pay higher fees to prevent spam
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/messages_priority
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### 4.4 SLOW ABCI METHODS ⚠️ CRITICAL - CHAIN HALT
|
|
229
|
+
|
|
230
|
+
**Description**: Computationally expensive `BeginBlocker` or `EndBlocker` with unbounded loops can exceed block time limits, halting the chain.
|
|
231
|
+
|
|
232
|
+
**Detection Patterns**:
|
|
233
|
+
```go
|
|
234
|
+
// VULNERABLE: Unbounded loop in EndBlocker
|
|
235
|
+
func EndBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
236
|
+
// Iterates over ALL users - could be millions!
|
|
237
|
+
k.IterateAllUsers(ctx, func(user User) bool {
|
|
238
|
+
reward := k.CalculateReward(ctx, user) // Complex calculation
|
|
239
|
+
k.DistributeReward(ctx, user, reward)
|
|
240
|
+
return false
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// VULNERABLE: Nested loops in BeginBlocker
|
|
245
|
+
func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
246
|
+
pools := k.GetAllPools(ctx) // 1000+ pools
|
|
247
|
+
for _, pool := range pools {
|
|
248
|
+
assets := k.GetPoolAssets(ctx, pool.ID) // 100+ assets each
|
|
249
|
+
for _, asset := range assets {
|
|
250
|
+
k.UpdatePrice(ctx, pool, asset) // Expensive calculation
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// VULNERABLE: Unbounded state iteration
|
|
256
|
+
func (k Keeper) ProcessExpiredOrders(ctx sdk.Context) {
|
|
257
|
+
// No limit on number of orders processed per block!
|
|
258
|
+
k.IterateExpiredOrders(ctx, func(order Order) bool {
|
|
259
|
+
k.CancelOrder(ctx, order)
|
|
260
|
+
return false // Processes ALL expired orders
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**What to Check**:
|
|
266
|
+
- [ ] BeginBlocker has bounded computational complexity
|
|
267
|
+
- [ ] EndBlocker has bounded computational complexity
|
|
268
|
+
- [ ] NO nested loops over unbounded collections
|
|
269
|
+
- [ ] NO iterations over all users/pools/assets
|
|
270
|
+
- [ ] Batch operations have size limits
|
|
271
|
+
- [ ] Stress tests with maximum expected data
|
|
272
|
+
|
|
273
|
+
**Mitigation**:
|
|
274
|
+
```go
|
|
275
|
+
// SECURE: Process limited batch per block
|
|
276
|
+
func EndBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
277
|
+
maxProcessed := 100 // Process max 100 users per block
|
|
278
|
+
|
|
279
|
+
iterator := k.GetUnprocessedUsers(ctx)
|
|
280
|
+
defer iterator.Close()
|
|
281
|
+
|
|
282
|
+
count := 0
|
|
283
|
+
for ; iterator.Valid() && count < maxProcessed; iterator.Next() {
|
|
284
|
+
user := k.UnmarshalUser(iterator.Value())
|
|
285
|
+
reward := k.CalculateReward(ctx, user)
|
|
286
|
+
k.DistributeReward(ctx, user, reward)
|
|
287
|
+
k.MarkProcessed(ctx, user)
|
|
288
|
+
count++
|
|
289
|
+
}
|
|
290
|
+
// Remaining users processed in subsequent blocks
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// SECURE: Limit nested iterations
|
|
294
|
+
func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
295
|
+
// Process only active pools (limited set)
|
|
296
|
+
activePools := k.GetActivePools(ctx) // Max 50 pools
|
|
297
|
+
for _, pool := range activePools {
|
|
298
|
+
// Process only top assets (limited set)
|
|
299
|
+
topAssets := k.GetTopPoolAssets(ctx, pool.ID, 10)
|
|
300
|
+
for _, asset := range topAssets {
|
|
301
|
+
k.UpdatePrice(ctx, pool, asset)
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**Testing**:
|
|
308
|
+
```go
|
|
309
|
+
// Benchmark ABCI methods
|
|
310
|
+
func BenchmarkEndBlocker(b *testing.B) {
|
|
311
|
+
// Test with maximum expected state
|
|
312
|
+
ctx := setupMaximumState() // 1M users, 10K pools, etc.
|
|
313
|
+
|
|
314
|
+
b.ResetTimer()
|
|
315
|
+
for i := 0; i < b.N; i++ {
|
|
316
|
+
EndBlocker(ctx, keeper)
|
|
317
|
+
}
|
|
318
|
+
// Must complete in < 1 second
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/abci_method_slow
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
### 4.5 ABCI METHODS PANIC ⚠️ CRITICAL - CHAIN HALT
|
|
327
|
+
|
|
328
|
+
**Description**: Unexpected panics in `BeginBlocker` or `EndBlocker` immediately stop the blockchain. Many Cosmos SDK types panic on invalid operations.
|
|
329
|
+
|
|
330
|
+
**Detection Patterns**:
|
|
331
|
+
|
|
332
|
+
#### Pattern 1: Panic-Prone Coin Operations
|
|
333
|
+
```go
|
|
334
|
+
// VULNERABLE: NewCoins panics on invalid coins
|
|
335
|
+
func EndBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
336
|
+
// Panics if amount is negative or denom is invalid!
|
|
337
|
+
coins := sdk.NewCoins(sdk.NewCoin(userDenom, userAmount))
|
|
338
|
+
k.MintCoins(ctx, coins)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// VULNERABLE: Coin arithmetic panics
|
|
342
|
+
reward := sdk.NewCoin("uatom", sdk.NewInt(-100)) // PANIC: negative amount
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
#### Pattern 2: Dec/Int Operations
|
|
346
|
+
```go
|
|
347
|
+
// VULNERABLE: NewDec panics on invalid string
|
|
348
|
+
func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
349
|
+
price := sdk.NewDec(priceString) // PANIC if priceString is invalid!
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// VULNERABLE: Division by zero
|
|
353
|
+
ratio := amount.Quo(sdk.ZeroInt()) // PANIC!
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
#### Pattern 3: SetParamSet
|
|
357
|
+
```go
|
|
358
|
+
// VULNERABLE: SetParamSet panics on validation failure
|
|
359
|
+
func (k Keeper) UpdateParams(ctx sdk.Context, params Params) {
|
|
360
|
+
// PANIC if params are invalid!
|
|
361
|
+
k.paramSpace.SetParamSet(ctx, ¶ms)
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
#### Pattern 4: Array Out of Bounds
|
|
366
|
+
```go
|
|
367
|
+
// VULNERABLE: No bounds checking
|
|
368
|
+
func processValidators(validators []Validator) {
|
|
369
|
+
top := validators[0] // PANIC if empty slice!
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
**What to Check**:
|
|
374
|
+
- [ ] All `sdk.NewCoins()`, `sdk.NewCoin()` calls validated
|
|
375
|
+
- [ ] All `sdk.NewDec()`, `sdk.NewInt()` calls validated
|
|
376
|
+
- [ ] Division operations check for zero divisor
|
|
377
|
+
- [ ] `SetParamSet` called only with validated params
|
|
378
|
+
- [ ] Array/slice access has bounds checking
|
|
379
|
+
- [ ] User input validated before use in panic-prone operations
|
|
380
|
+
|
|
381
|
+
**Mitigation**:
|
|
382
|
+
```go
|
|
383
|
+
// SECURE: Validate before panic-prone operations
|
|
384
|
+
func EndBlocker(ctx sdk.Context, k keeper.Keeper) {
|
|
385
|
+
// Validate denom and amount
|
|
386
|
+
if err := sdk.ValidateDenom(userDenom); err != nil {
|
|
387
|
+
ctx.Logger().Error("invalid denom", "error", err)
|
|
388
|
+
return
|
|
389
|
+
}
|
|
390
|
+
if userAmount.IsNegative() {
|
|
391
|
+
ctx.Logger().Error("negative amount")
|
|
392
|
+
return
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
coins := sdk.NewCoins(sdk.NewCoin(userDenom, userAmount))
|
|
396
|
+
k.MintCoins(ctx, coins)
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// SECURE: Use safe constructors
|
|
400
|
+
func (k Keeper) UpdatePrice(ctx sdk.Context, priceStr string) error {
|
|
401
|
+
// Safe: Returns error instead of panicking
|
|
402
|
+
price, err := sdk.NewDecFromStr(priceStr)
|
|
403
|
+
if err != nil {
|
|
404
|
+
return err
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Check for zero before division
|
|
408
|
+
if divisor.IsZero() {
|
|
409
|
+
return errors.New("division by zero")
|
|
410
|
+
}
|
|
411
|
+
ratio := amount.Quo(divisor)
|
|
412
|
+
|
|
413
|
+
return nil
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// SECURE: Bounds checking
|
|
417
|
+
func processValidators(validators []Validator) {
|
|
418
|
+
if len(validators) == 0 {
|
|
419
|
+
return
|
|
420
|
+
}
|
|
421
|
+
top := validators[0] // Safe
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Tool Detection**:
|
|
426
|
+
```bash
|
|
427
|
+
# Use CodeQL to find panic-prone operations
|
|
428
|
+
codeql query run find-unvalidated-sdk-operations.ql
|
|
429
|
+
|
|
430
|
+
# Manual review
|
|
431
|
+
grep -r "sdk.NewDec\|sdk.NewInt\|sdk.NewCoins" x/
|
|
432
|
+
grep -r "\.Quo\|\.Div" x/
|
|
433
|
+
grep -r "SetParamSet" x/
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/abci_method_panics
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
### 4.6 BROKEN BOOKKEEPING ⚠️ HIGH
|
|
441
|
+
|
|
442
|
+
**Description**: Custom internal accounting alongside `x/bank` module becomes inconsistent when direct token transfers bypass internal bookkeeping.
|
|
443
|
+
|
|
444
|
+
**Detection Patterns**:
|
|
445
|
+
```go
|
|
446
|
+
// VULNERABLE: Internal bookkeeping separate from x/bank
|
|
447
|
+
type Keeper struct {
|
|
448
|
+
// Internal tracking of balances
|
|
449
|
+
userBalances map[string]sdk.Coins // NOT synchronized with x/bank!
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
func (k Keeper) Deposit(ctx sdk.Context, user string, amount sdk.Coins) {
|
|
453
|
+
// Updates internal bookkeeping
|
|
454
|
+
k.userBalances[user] = k.userBalances[user].Add(amount...)
|
|
455
|
+
|
|
456
|
+
// Also updates x/bank
|
|
457
|
+
k.bankKeeper.SendCoins(ctx, sender, moduleAccount, amount)
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// PROBLEM: Direct IBC transfer bypasses internal bookkeeping!
|
|
461
|
+
// User receives tokens via IBC -> x/bank updated but userBalances not updated
|
|
462
|
+
// Invariant violated: sum(userBalances) != bankKeeper.GetSupply()
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**What to Check**:
|
|
466
|
+
- [ ] No custom balance tracking alongside x/bank
|
|
467
|
+
- [ ] OR custom tracking uses blocklist to prevent unexpected transfers
|
|
468
|
+
- [ ] Invariant checks compare internal accounting to x/bank
|
|
469
|
+
- [ ] IBC transfers handled correctly
|
|
470
|
+
- [ ] Module accounts use SendEnabled parameter
|
|
471
|
+
|
|
472
|
+
**Mitigation**:
|
|
473
|
+
```go
|
|
474
|
+
// OPTION 1: Use blocklist to prevent unexpected transfers
|
|
475
|
+
func (k Keeper) BeforeTokenTransfer(ctx sdk.Context, from, to string) error {
|
|
476
|
+
// Block all transfers except through our module
|
|
477
|
+
if !k.IsAuthorizedTransfer(ctx, from, to) {
|
|
478
|
+
return errors.New("direct transfers blocked")
|
|
479
|
+
}
|
|
480
|
+
return nil
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// OPTION 2: Use SendEnabled parameter
|
|
484
|
+
// In x/bank params, set SendEnabled = false for your token
|
|
485
|
+
// All transfers must go through your module
|
|
486
|
+
|
|
487
|
+
// OPTION 3: Don't maintain separate bookkeeping
|
|
488
|
+
// Use x/bank as source of truth, query when needed
|
|
489
|
+
func (k Keeper) GetUserBalance(ctx sdk.Context, user string) sdk.Coins {
|
|
490
|
+
addr := sdk.AccAddress(user)
|
|
491
|
+
return k.bankKeeper.GetAllBalances(ctx, addr)
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
**Invariant Testing**:
|
|
496
|
+
```go
|
|
497
|
+
// Invariant: Internal accounting matches x/bank
|
|
498
|
+
func (k Keeper) InvariantCheck(ctx sdk.Context) error {
|
|
499
|
+
internalTotal := sdk.NewCoins()
|
|
500
|
+
for _, balance := range k.userBalances {
|
|
501
|
+
internalTotal = internalTotal.Add(balance...)
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
moduleBalance := k.bankKeeper.GetAllBalances(ctx, k.moduleAccount)
|
|
505
|
+
|
|
506
|
+
if !internalTotal.IsEqual(moduleBalance) {
|
|
507
|
+
return fmt.Errorf("bookkeeping mismatch: internal=%v bank=%v",
|
|
508
|
+
internalTotal, moduleBalance)
|
|
509
|
+
}
|
|
510
|
+
return nil
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/broken_bookkeeping
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
### 4.7 ROUNDING ERRORS ⚠️ MEDIUM
|
|
519
|
+
|
|
520
|
+
**Description**: `sdk.Dec` type has precision issues and lacks associativity, causing rounding errors that can be exploited or cause incorrect calculations.
|
|
521
|
+
|
|
522
|
+
**Detection Patterns**:
|
|
523
|
+
```go
|
|
524
|
+
// VULNERABLE: Division before multiplication (loses precision)
|
|
525
|
+
sharePrice := totalValue.Quo(totalShares) // Division first
|
|
526
|
+
userValue := sharePrice.Mul(userShares) // Multiplication second
|
|
527
|
+
// User gets less value due to rounding down in division
|
|
528
|
+
|
|
529
|
+
// VULNERABLE: sdk.Dec associativity issues
|
|
530
|
+
a := sdk.NewDec(1)
|
|
531
|
+
b := sdk.NewDec(10)
|
|
532
|
+
c := sdk.NewDec(100)
|
|
533
|
+
|
|
534
|
+
result1 := a.Mul(b).Quo(c) // (1 * 10) / 100 = 0.1
|
|
535
|
+
result2 := a.Quo(c).Mul(b) // (1 / 100) * 10 = 0.1 (but different precision!)
|
|
536
|
+
// result1 != result2 due to precision handling
|
|
537
|
+
|
|
538
|
+
// VULNERABLE: Repeated rounding favors users
|
|
539
|
+
for _, user := range users {
|
|
540
|
+
reward := totalReward.Quo(sdk.NewDec(len(users))) // Round each time
|
|
541
|
+
k.MintReward(ctx, user, reward)
|
|
542
|
+
}
|
|
543
|
+
// Total minted > totalReward due to rounding up
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
**What to Check**:
|
|
547
|
+
- [ ] Multiplication before division pattern used
|
|
548
|
+
- [ ] Rounding direction favors protocol, not users
|
|
549
|
+
- [ ] No repeated rounding in loops
|
|
550
|
+
- [ ] Consistent calculation order across all operations
|
|
551
|
+
- [ ] Consider using integer arithmetic with scaling factor
|
|
552
|
+
|
|
553
|
+
**Mitigation**:
|
|
554
|
+
```go
|
|
555
|
+
// SECURE: Multiply before divide (preserves precision)
|
|
556
|
+
userValue := totalValue.Mul(userShares).Quo(totalShares)
|
|
557
|
+
// Full precision maintained until final division
|
|
558
|
+
|
|
559
|
+
// SECURE: Round in favor of system
|
|
560
|
+
// When distributing rewards, round down (users get slightly less)
|
|
561
|
+
reward := totalReward.Mul(userShares).QuoTruncate(totalShares)
|
|
562
|
+
|
|
563
|
+
// When calculating fees, round up (users pay slightly more)
|
|
564
|
+
fee := amount.Mul(feeRate).QuoCeil(sdk.NewDec(10000))
|
|
565
|
+
|
|
566
|
+
// SECURE: Distribute with remainder handling
|
|
567
|
+
totalDistributed := sdk.ZeroDec()
|
|
568
|
+
for i, user := range users {
|
|
569
|
+
if i == len(users)-1 {
|
|
570
|
+
// Last user gets remainder to ensure sum is exact
|
|
571
|
+
reward = totalReward.Sub(totalDistributed)
|
|
572
|
+
} else {
|
|
573
|
+
reward = totalReward.Quo(sdk.NewDec(len(users)))
|
|
574
|
+
totalDistributed = totalDistributed.Add(reward)
|
|
575
|
+
}
|
|
576
|
+
k.MintReward(ctx, user, reward)
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/rounding_errors
|
|
581
|
+
|
|
582
|
+
---
|
|
583
|
+
|
|
584
|
+
### 4.8 UNREGISTERED MESSAGE HANDLER ⚠️ MEDIUM (Legacy Issue)
|
|
585
|
+
|
|
586
|
+
**Description**: Message types defined in proto but not registered in `NewHandler` function cause messages to be accepted but silently ignored (pre-Cosmos SDK v0.47).
|
|
587
|
+
|
|
588
|
+
**Detection Patterns**:
|
|
589
|
+
```go
|
|
590
|
+
// VULNERABLE: Message defined but not in handler (legacy Msg Service)
|
|
591
|
+
// In types/msgs.proto
|
|
592
|
+
message MsgWithdraw {
|
|
593
|
+
string sender = 1;
|
|
594
|
+
string amount = 2;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// In handler.go
|
|
598
|
+
func NewHandler(k keeper.Keeper) sdk.Handler {
|
|
599
|
+
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
|
600
|
+
switch msg := msg.(type) {
|
|
601
|
+
case *types.MsgDeposit:
|
|
602
|
+
return handleMsgDeposit(ctx, k, msg)
|
|
603
|
+
// Missing: case *types.MsgWithdraw
|
|
604
|
+
default:
|
|
605
|
+
return nil, sdkerrors.ErrUnknownRequest
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**What to Check**:
|
|
612
|
+
- [ ] Using Cosmos SDK v0.47+ with automatic handler registration
|
|
613
|
+
- [ ] OR all message types in proto have corresponding handler case
|
|
614
|
+
- [ ] Integration tests call all message types
|
|
615
|
+
- [ ] CI checks for unregistered messages
|
|
616
|
+
|
|
617
|
+
**Mitigation**:
|
|
618
|
+
```go
|
|
619
|
+
// OPTION 1: Use modern SDK (v0.47+) - handlers auto-registered
|
|
620
|
+
// In msg_server.go
|
|
621
|
+
type msgServer struct {
|
|
622
|
+
Keeper
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
func (s msgServer) Deposit(ctx context.Context, msg *types.MsgDeposit) (*types.MsgDepositResponse, error) {
|
|
626
|
+
// Handler automatically registered via protobuf service
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
func (s msgServer) Withdraw(ctx context.Context, msg *types.MsgWithdraw) (*types.MsgWithdrawResponse, error) {
|
|
630
|
+
// Handler automatically registered
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// OPTION 2: Verify all messages registered (legacy)
|
|
634
|
+
func NewHandler(k keeper.Keeper) sdk.Handler {
|
|
635
|
+
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
|
636
|
+
switch msg := msg.(type) {
|
|
637
|
+
case *types.MsgDeposit:
|
|
638
|
+
return handleMsgDeposit(ctx, k, msg)
|
|
639
|
+
case *types.MsgWithdraw: // Ensure all messages present!
|
|
640
|
+
return handleMsgWithdraw(ctx, k, msg)
|
|
641
|
+
default:
|
|
642
|
+
return nil, sdkerrors.ErrUnknownRequest
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
**Testing**:
|
|
649
|
+
```go
|
|
650
|
+
// Integration test for all message types
|
|
651
|
+
func TestAllMessageTypes(t *testing.T) {
|
|
652
|
+
// Get all message types from proto
|
|
653
|
+
messageTypes := getAllProtoMessageTypes()
|
|
654
|
+
|
|
655
|
+
for _, msgType := range messageTypes {
|
|
656
|
+
// Verify message can be submitted and processed
|
|
657
|
+
result, err := app.DeliverTx(ctx, msgType)
|
|
658
|
+
require.NoError(t, err)
|
|
659
|
+
require.NotNil(t, result)
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/message_handler_missing
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
### 4.9 MISSING ERROR HANDLER ⚠️ HIGH
|
|
669
|
+
|
|
670
|
+
**Description**: Ignoring error return values from keeper methods (especially `bankKeeper.SendCoins`) allows invalid operations to silently succeed.
|
|
671
|
+
|
|
672
|
+
**Detection Patterns**:
|
|
673
|
+
```go
|
|
674
|
+
// VULNERABLE: Ignored error from SendCoins
|
|
675
|
+
func (k Keeper) Withdraw(ctx sdk.Context, user string, amount sdk.Coins) {
|
|
676
|
+
// Error ignored! Withdrawal appears successful even if SendCoins fails
|
|
677
|
+
k.bankKeeper.SendCoins(ctx, moduleAccount, user, amount)
|
|
678
|
+
|
|
679
|
+
// Update state assuming withdrawal succeeded
|
|
680
|
+
k.DecrementBalance(ctx, user, amount)
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// VULNERABLE: Deferred error handling too late
|
|
684
|
+
func (k Keeper) ProcessBatch(ctx sdk.Context, txs []Transaction) {
|
|
685
|
+
for _, tx := range txs {
|
|
686
|
+
err := k.ProcessTransaction(ctx, tx)
|
|
687
|
+
// Error not checked, continues processing!
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
**What to Check**:
|
|
693
|
+
- [ ] ALL keeper method calls check error return values
|
|
694
|
+
- [ ] `bankKeeper.SendCoins()` errors always handled
|
|
695
|
+
- [ ] State updates only occur after successful operation
|
|
696
|
+
- [ ] Errors propagated to caller
|
|
697
|
+
- [ ] Use linters to detect ignored errors (errcheck)
|
|
698
|
+
|
|
699
|
+
**Mitigation**:
|
|
700
|
+
```go
|
|
701
|
+
// SECURE: Check all errors
|
|
702
|
+
func (k Keeper) Withdraw(ctx sdk.Context, user string, amount sdk.Coins) error {
|
|
703
|
+
// Check error from SendCoins
|
|
704
|
+
if err := k.bankKeeper.SendCoins(ctx, moduleAccount, user, amount); err != nil {
|
|
705
|
+
return err // Withdrawal failed, no state change
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// Only update state if SendCoins succeeded
|
|
709
|
+
k.DecrementBalance(ctx, user, amount)
|
|
710
|
+
return nil
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// SECURE: Stop processing on first error
|
|
714
|
+
func (k Keeper) ProcessBatch(ctx sdk.Context, txs []Transaction) error {
|
|
715
|
+
for _, tx := range txs {
|
|
716
|
+
if err := k.ProcessTransaction(ctx, tx); err != nil {
|
|
717
|
+
return fmt.Errorf("transaction failed: %w", err)
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
return nil
|
|
721
|
+
}
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
**Linter Configuration**:
|
|
725
|
+
```yaml
|
|
726
|
+
# .golangci.yml
|
|
727
|
+
linters:
|
|
728
|
+
enable:
|
|
729
|
+
- errcheck # Detect unchecked errors
|
|
730
|
+
- goerr113 # Error handling rules
|
|
731
|
+
|
|
732
|
+
linters-settings:
|
|
733
|
+
errcheck:
|
|
734
|
+
check-blank: true # Flag _ = err
|
|
735
|
+
check-type-assertions: true
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
**References**: building-secure-contracts/not-so-smart-contracts/cosmos/missing_error_handler
|
|
739
|
+
|
|
740
|
+
---
|