@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,595 @@
|
|
|
1
|
+
## 6. Vulnerability Checklist (3 Patterns)
|
|
2
|
+
|
|
3
|
+
### 6.1 INTEGER AS BOOLEAN ⚠️ HIGH
|
|
4
|
+
|
|
5
|
+
**Description**: FunC uses integers for boolean values (0 = false, -1 = true). The bitwise NOT operator `~` on non-standard boolean values (positive integers) produces unexpected results, causing logic errors.
|
|
6
|
+
|
|
7
|
+
**Background**:
|
|
8
|
+
- FunC `true` = -1 (all bits set: `0xFFFFFFFF...`)
|
|
9
|
+
- FunC `false` = 0 (all bits clear: `0x00000000...`)
|
|
10
|
+
- `~` is bitwise NOT: `~0 = -1`, `~(-1) = 0`
|
|
11
|
+
- But `~1 = -2` (not 0!), `~2 = -3` (not 0!)
|
|
12
|
+
|
|
13
|
+
**Detection Patterns**:
|
|
14
|
+
```func
|
|
15
|
+
;; VULNERABLE: Using positive integers as booleans
|
|
16
|
+
int is_active = 1; ;; WRONG: Should be -1 for true, 0 for false
|
|
17
|
+
|
|
18
|
+
if (is_active) {
|
|
19
|
+
;; This works - 1 is truthy
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (~ is_active) {
|
|
23
|
+
;; PROBLEM: ~1 = -2, which is still truthy!
|
|
24
|
+
;; This branch will ALWAYS execute, not just when is_active is false
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
;; VULNERABLE: Returning positive integers as booleans
|
|
28
|
+
int is_valid(int value) {
|
|
29
|
+
if (value > 100) {
|
|
30
|
+
return 1; ;; WRONG: Should return -1
|
|
31
|
+
}
|
|
32
|
+
return 0; ;; Correct for false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int valid = is_valid(150); ;; Returns 1
|
|
36
|
+
if (~ valid) {
|
|
37
|
+
;; PROBLEM: ~1 = -2 (truthy), this executes when it shouldn't!
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
;; VULNERABLE: Boolean arithmetic
|
|
41
|
+
int flag1 = 1; ;; Wrong true value
|
|
42
|
+
int flag2 = 1; ;; Wrong true value
|
|
43
|
+
int both_true = flag1 & flag2; ;; 1 & 1 = 1 (works)
|
|
44
|
+
int neither_true = (~ flag1) & (~ flag2); ;; ~1 & ~1 = -2 & -2 = -2 (WRONG!)
|
|
45
|
+
;; Expected 0 (false), got -2 (truthy)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**What to Check**:
|
|
49
|
+
- [ ] All boolean values use 0 (false) or -1 (true)
|
|
50
|
+
- [ ] NO positive integers (1, 2, etc.) used as booleans
|
|
51
|
+
- [ ] Functions returning booleans return -1 (not 1) for true
|
|
52
|
+
- [ ] Boolean logic with `~`, `&`, `|` uses correct values
|
|
53
|
+
- [ ] Conditions test against 0 explicitly where needed
|
|
54
|
+
|
|
55
|
+
**Mitigation**:
|
|
56
|
+
```func
|
|
57
|
+
;; SECURE: Use correct boolean values
|
|
58
|
+
const int TRUE = -1; ;; All bits set
|
|
59
|
+
const int FALSE = 0; ;; All bits clear
|
|
60
|
+
|
|
61
|
+
int is_active = TRUE; ;; Correct
|
|
62
|
+
|
|
63
|
+
if (is_active) {
|
|
64
|
+
;; Works correctly
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (~ is_active) {
|
|
68
|
+
;; Works correctly: ~(-1) = 0 (falsy)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
;; SECURE: Return correct boolean values
|
|
72
|
+
int is_valid(int value) method_id {
|
|
73
|
+
if (value > 100) {
|
|
74
|
+
return TRUE; ;; -1 for true
|
|
75
|
+
}
|
|
76
|
+
return FALSE; ;; 0 for false
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
int valid = is_valid(150);
|
|
80
|
+
if (~ valid) {
|
|
81
|
+
;; Correct: ~(-1) = 0 (falsy), this doesn't execute
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
;; SECURE: Boolean operations with correct values
|
|
85
|
+
int flag1 = TRUE; ;; -1
|
|
86
|
+
int flag2 = TRUE; ;; -1
|
|
87
|
+
int both_true = flag1 & flag2; ;; -1 & -1 = -1 (TRUE)
|
|
88
|
+
int neither_true = (~ flag1) & (~ flag2); ;; 0 & 0 = 0 (FALSE)
|
|
89
|
+
|
|
90
|
+
;; SECURE: Explicit comparisons when needed
|
|
91
|
+
int status_code = get_status(); ;; Returns 0, 1, 2, etc.
|
|
92
|
+
|
|
93
|
+
;; Instead of treating as boolean:
|
|
94
|
+
if (status_code) { } ;; Ambiguous!
|
|
95
|
+
|
|
96
|
+
;; Explicitly compare:
|
|
97
|
+
if (status_code != 0) { } ;; Clear intent
|
|
98
|
+
if (status_code == 1) { } ;; Even better
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Common Mistake Patterns**:
|
|
102
|
+
```func
|
|
103
|
+
;; MISTAKE 1: Loading boolean from storage/message
|
|
104
|
+
slice cs = get_data().begin_parse();
|
|
105
|
+
int flag = cs~load_uint(1); ;; Returns 0 or 1, not 0 or -1!
|
|
106
|
+
|
|
107
|
+
;; FIX: Convert to proper boolean
|
|
108
|
+
int flag_bool = flag ? TRUE : FALSE;
|
|
109
|
+
|
|
110
|
+
;; MISTAKE 2: Comparing with 1 instead of TRUE
|
|
111
|
+
int is_owner = sender == owner_address; ;; Returns 0 or -1 (correct)
|
|
112
|
+
|
|
113
|
+
if (is_owner == 1) { ;; WRONG: will never match
|
|
114
|
+
;; This never executes!
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
;; FIX: Compare with TRUE or just use directly
|
|
118
|
+
if (is_owner == TRUE) { } ;; Correct
|
|
119
|
+
if (is_owner) { } ;; Also correct
|
|
120
|
+
|
|
121
|
+
;; MISTAKE 3: Returning count as boolean
|
|
122
|
+
int count_items() {
|
|
123
|
+
return items.length; ;; Returns 0, 1, 2, 3... (not boolean!)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
int has_items = count_items();
|
|
127
|
+
if (~ has_items) {
|
|
128
|
+
;; WRONG: ~1 = -2 (truthy), ~2 = -3 (truthy), etc.
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
;; FIX: Return proper boolean or use explicit comparison
|
|
132
|
+
int has_items() {
|
|
133
|
+
return items.length > 0 ? TRUE : FALSE;
|
|
134
|
+
}
|
|
135
|
+
;; OR
|
|
136
|
+
int count = count_items();
|
|
137
|
+
if (count == 0) { } ;; Explicit comparison
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Testing**:
|
|
141
|
+
```func
|
|
142
|
+
;; Test boolean logic
|
|
143
|
+
int test_boolean_logic() {
|
|
144
|
+
int t = TRUE;
|
|
145
|
+
int f = FALSE;
|
|
146
|
+
|
|
147
|
+
;; Basic logic
|
|
148
|
+
throw_unless(100, t == -1);
|
|
149
|
+
throw_unless(101, f == 0);
|
|
150
|
+
|
|
151
|
+
;; Negation
|
|
152
|
+
throw_unless(102, ~t == f);
|
|
153
|
+
throw_unless(103, ~f == t);
|
|
154
|
+
|
|
155
|
+
;; AND logic
|
|
156
|
+
throw_unless(104, t & t == t);
|
|
157
|
+
throw_unless(105, t & f == f);
|
|
158
|
+
throw_unless(106, f & f == f);
|
|
159
|
+
|
|
160
|
+
;; OR logic
|
|
161
|
+
throw_unless(107, t | t == t);
|
|
162
|
+
throw_unless(108, t | f == t);
|
|
163
|
+
throw_unless(109, f | f == f);
|
|
164
|
+
|
|
165
|
+
return TRUE;
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**References**: building-secure-contracts/not-so-smart-contracts/ton/integer_as_boolean
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### 4.2 FAKE JETTON CONTRACT ⚠️ CRITICAL
|
|
174
|
+
|
|
175
|
+
**Description**: The `transfer_notification` operation can be sent by any contract. Without sender validation, attackers can send fake transfer notifications claiming to have transferred tokens that were never sent.
|
|
176
|
+
|
|
177
|
+
**Background**:
|
|
178
|
+
- Jetton (TON's token standard) uses `transfer_notification` to notify recipients
|
|
179
|
+
- Real flow: User → Jetton Wallet → Receiver (with notification)
|
|
180
|
+
- Attack: Attacker → Receiver (fake notification, no Jetton Wallet involved)
|
|
181
|
+
|
|
182
|
+
**Detection Patterns**:
|
|
183
|
+
```func
|
|
184
|
+
;; VULNERABLE: No sender validation in transfer_notification
|
|
185
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
186
|
+
slice cs = in_msg_full.begin_parse();
|
|
187
|
+
int flags = cs~load_uint(4);
|
|
188
|
+
slice sender_address = cs~load_msg_addr();
|
|
189
|
+
|
|
190
|
+
int op = in_msg_body~load_uint(32);
|
|
191
|
+
|
|
192
|
+
if (op == op::transfer_notification) {
|
|
193
|
+
;; WRONG: No validation of sender_address!
|
|
194
|
+
int jetton_amount = in_msg_body~load_coins();
|
|
195
|
+
slice from_user = in_msg_body~load_msg_addr();
|
|
196
|
+
slice forward_payload = in_msg_body;
|
|
197
|
+
|
|
198
|
+
;; Process as if jettons were received
|
|
199
|
+
;; Attacker can claim any jetton_amount without actually sending tokens!
|
|
200
|
+
credit_user(from_user, jetton_amount);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
;; VULNERABLE: Validating user address but not Jetton wallet
|
|
205
|
+
if (op == op::transfer_notification) {
|
|
206
|
+
int jetton_amount = in_msg_body~load_coins();
|
|
207
|
+
slice from_user = in_msg_body~load_msg_addr();
|
|
208
|
+
|
|
209
|
+
;; Validates from_user but not sender!
|
|
210
|
+
throw_unless(error::unauthorized, equal_slices(from_user, authorized_user));
|
|
211
|
+
|
|
212
|
+
;; WRONG: Anyone can send this message claiming to be from authorized_user
|
|
213
|
+
credit_user(from_user, jetton_amount);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
;; VULNERABLE: Trusting forward_payload data
|
|
217
|
+
if (op == op::transfer_notification) {
|
|
218
|
+
int jetton_amount = in_msg_body~load_coins();
|
|
219
|
+
slice from_user = in_msg_body~load_msg_addr();
|
|
220
|
+
slice forward_payload = in_msg_body;
|
|
221
|
+
|
|
222
|
+
;; Parse data from forward_payload
|
|
223
|
+
int token_id = forward_payload~load_uint(32);
|
|
224
|
+
|
|
225
|
+
;; WRONG: Attacker controls all this data!
|
|
226
|
+
;; Can claim any token_id, any jetton_amount
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**What to Check**:
|
|
231
|
+
- [ ] `transfer_notification` handler validates sender address
|
|
232
|
+
- [ ] Sender must be expected Jetton wallet address
|
|
233
|
+
- [ ] Jetton wallet addresses stored during initialization
|
|
234
|
+
- [ ] Cannot trust forward_payload without sender validation
|
|
235
|
+
- [ ] User address in notification is NOT sufficient validation
|
|
236
|
+
|
|
237
|
+
**Mitigation**:
|
|
238
|
+
```func
|
|
239
|
+
;; SECURE: Store expected Jetton wallet address at initialization
|
|
240
|
+
global slice jetton_wallet_address;
|
|
241
|
+
|
|
242
|
+
() load_data() impure {
|
|
243
|
+
slice ds = get_data().begin_parse();
|
|
244
|
+
jetton_wallet_address = ds~load_msg_addr();
|
|
245
|
+
;; Load other data
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
() save_data() impure {
|
|
249
|
+
set_data(begin_cell()
|
|
250
|
+
.store_slice(jetton_wallet_address)
|
|
251
|
+
;; Store other data
|
|
252
|
+
.end_cell());
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
;; Initialize with Jetton wallet address
|
|
256
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
257
|
+
load_data();
|
|
258
|
+
|
|
259
|
+
slice cs = in_msg_full.begin_parse();
|
|
260
|
+
int flags = cs~load_uint(4);
|
|
261
|
+
slice sender_address = cs~load_msg_addr();
|
|
262
|
+
|
|
263
|
+
int op = in_msg_body~load_uint(32);
|
|
264
|
+
|
|
265
|
+
if (op == op::transfer_notification) {
|
|
266
|
+
;; CRITICAL: Validate sender is expected Jetton wallet
|
|
267
|
+
throw_unless(error::wrong_jetton_wallet,
|
|
268
|
+
equal_slices(sender_address, jetton_wallet_address));
|
|
269
|
+
|
|
270
|
+
;; Now safe to trust the notification
|
|
271
|
+
int jetton_amount = in_msg_body~load_coins();
|
|
272
|
+
slice from_user = in_msg_body~load_msg_addr();
|
|
273
|
+
slice forward_payload = in_msg_body;
|
|
274
|
+
|
|
275
|
+
;; Can safely credit user
|
|
276
|
+
credit_user(from_user, jetton_amount);
|
|
277
|
+
|
|
278
|
+
;; Can safely parse forward_payload
|
|
279
|
+
if (~ forward_payload.slice_empty?()) {
|
|
280
|
+
int token_id = forward_payload~load_uint(32);
|
|
281
|
+
;; Use token_id
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
;; SECURE: Multiple Jetton support with dictionary
|
|
287
|
+
global cell jetton_wallets; ;; Dictionary: jetton_type -> wallet_address
|
|
288
|
+
|
|
289
|
+
() load_data() impure {
|
|
290
|
+
slice ds = get_data().begin_parse();
|
|
291
|
+
jetton_wallets = ds~load_dict();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
295
|
+
load_data();
|
|
296
|
+
|
|
297
|
+
slice cs = in_msg_full.begin_parse();
|
|
298
|
+
int flags = cs~load_uint(4);
|
|
299
|
+
slice sender_address = cs~load_msg_addr();
|
|
300
|
+
|
|
301
|
+
int op = in_msg_body~load_uint(32);
|
|
302
|
+
|
|
303
|
+
if (op == op::transfer_notification) {
|
|
304
|
+
int jetton_amount = in_msg_body~load_coins();
|
|
305
|
+
slice from_user = in_msg_body~load_msg_addr();
|
|
306
|
+
slice forward_payload = in_msg_body;
|
|
307
|
+
|
|
308
|
+
;; Parse jetton type from forward_payload
|
|
309
|
+
int jetton_type = forward_payload~load_uint(8);
|
|
310
|
+
|
|
311
|
+
;; Look up expected wallet address for this jetton type
|
|
312
|
+
(slice expected_wallet, int found) = jetton_wallets.udict_get?(256, jetton_type);
|
|
313
|
+
|
|
314
|
+
;; Validate sender matches expected wallet
|
|
315
|
+
throw_unless(error::unauthorized_jetton,
|
|
316
|
+
found & equal_slices(sender_address, expected_wallet));
|
|
317
|
+
|
|
318
|
+
;; Safe to process
|
|
319
|
+
credit_user_jetton(from_user, jetton_type, jetton_amount);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Admin Function to Set Jetton Wallet**:
|
|
325
|
+
```func
|
|
326
|
+
;; Only owner can set/update Jetton wallet address
|
|
327
|
+
if (op == op::set_jetton_wallet) {
|
|
328
|
+
throw_unless(error::unauthorized, equal_slices(sender_address, owner_address));
|
|
329
|
+
|
|
330
|
+
slice new_jetton_wallet = in_msg_body~load_msg_addr();
|
|
331
|
+
jetton_wallet_address = new_jetton_wallet;
|
|
332
|
+
|
|
333
|
+
save_data();
|
|
334
|
+
return ();
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Testing**:
|
|
339
|
+
```typescript
|
|
340
|
+
// Test fake transfer notification is rejected
|
|
341
|
+
it("should reject fake transfer notification", async () => {
|
|
342
|
+
const attacker = await blockchain.treasury("attacker");
|
|
343
|
+
|
|
344
|
+
// Attacker sends fake transfer_notification directly
|
|
345
|
+
const result = await contract.sendInternalMessage(attacker.getSender(), {
|
|
346
|
+
op: OP_CODES.TRANSFER_NOTIFICATION,
|
|
347
|
+
jettonAmount: toNano("1000"),
|
|
348
|
+
fromUser: user.address,
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
expect(result.transactions).toHaveTransaction({
|
|
352
|
+
from: attacker.address,
|
|
353
|
+
to: contract.address,
|
|
354
|
+
success: false, // Should be rejected
|
|
355
|
+
exitCode: ERROR_CODES.WRONG_JETTON_WALLET,
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
// Test real Jetton wallet notification is accepted
|
|
360
|
+
it("should accept real jetton transfer", async () => {
|
|
361
|
+
// Send from actual Jetton wallet
|
|
362
|
+
const result = await contract.sendInternalMessage(jettonWallet.address, {
|
|
363
|
+
op: OP_CODES.TRANSFER_NOTIFICATION,
|
|
364
|
+
jettonAmount: toNano("100"),
|
|
365
|
+
fromUser: user.address,
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
expect(result.transactions).toHaveTransaction({
|
|
369
|
+
from: jettonWallet.address,
|
|
370
|
+
to: contract.address,
|
|
371
|
+
success: true,
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**References**: building-secure-contracts/not-so-smart-contracts/ton/fake_jetton_contract
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
### 4.3 FORWARD TON WITHOUT GAS CHECK ⚠️ HIGH
|
|
381
|
+
|
|
382
|
+
**Description**: Allowing users to specify `forward_ton_amount` in outgoing messages without validating sufficient gas can drain the contract's TON balance. User pays small gas but specifies large forward amount from contract balance.
|
|
383
|
+
|
|
384
|
+
**Detection Patterns**:
|
|
385
|
+
```func
|
|
386
|
+
;; VULNERABLE: User-specified forward_ton_amount without validation
|
|
387
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
388
|
+
int op = in_msg_body~load_uint(32);
|
|
389
|
+
|
|
390
|
+
if (op == op::transfer) {
|
|
391
|
+
slice to_address = in_msg_body~load_msg_addr();
|
|
392
|
+
int amount = in_msg_body~load_coins();
|
|
393
|
+
int forward_ton_amount = in_msg_body~load_coins(); ;; USER CONTROLLED!
|
|
394
|
+
|
|
395
|
+
;; WRONG: No check that msg_value covers forward_ton_amount
|
|
396
|
+
;; Contract pays from its own balance!
|
|
397
|
+
|
|
398
|
+
var msg = begin_cell()
|
|
399
|
+
.store_uint(0x18, 6)
|
|
400
|
+
.store_slice(to_address)
|
|
401
|
+
.store_coins(forward_ton_amount) ;; Drains contract balance!
|
|
402
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
403
|
+
.end_cell();
|
|
404
|
+
|
|
405
|
+
send_raw_message(msg, 1);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
;; VULNERABLE: No gas validation for operations
|
|
410
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
411
|
+
int op = in_msg_body~load_uint(32);
|
|
412
|
+
|
|
413
|
+
if (op == op::claim_reward) {
|
|
414
|
+
slice user = in_msg_body~load_msg_addr();
|
|
415
|
+
int forward_amount = in_msg_body~load_coins();
|
|
416
|
+
|
|
417
|
+
;; Calculate reward
|
|
418
|
+
int reward = calculate_reward(user);
|
|
419
|
+
|
|
420
|
+
;; WRONG: Sends user-specified forward_amount
|
|
421
|
+
;; No validation that msg_value >= tx_fee + forward_amount
|
|
422
|
+
var msg = begin_cell()
|
|
423
|
+
.store_uint(0x18, 6)
|
|
424
|
+
.store_slice(user)
|
|
425
|
+
.store_coins(forward_amount + reward)
|
|
426
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
427
|
+
.end_cell();
|
|
428
|
+
|
|
429
|
+
send_raw_message(msg, 1); ;; Contract pays gas!
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**What to Check**:
|
|
435
|
+
- [ ] User cannot specify arbitrary forward TON amounts
|
|
436
|
+
- [ ] IF forward amount is user-specified: validate `msg_value >= tx_fee + forward_ton_amount`
|
|
437
|
+
- [ ] Prefer fixed/bounded forward amounts
|
|
438
|
+
- [ ] Contract balance protected from drainage
|
|
439
|
+
- [ ] Gas costs accounted for in all operations
|
|
440
|
+
|
|
441
|
+
**Mitigation**:
|
|
442
|
+
```func
|
|
443
|
+
;; SECURE: Fixed forward amounts (PREFERRED)
|
|
444
|
+
const int FORWARD_TON_AMOUNT = 50000000; ;; 0.05 TON (fixed)
|
|
445
|
+
const int TX_FEE = 10000000; ;; 0.01 TON estimated fee
|
|
446
|
+
|
|
447
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
448
|
+
int op = in_msg_body~load_uint(32);
|
|
449
|
+
|
|
450
|
+
if (op == op::transfer) {
|
|
451
|
+
slice to_address = in_msg_body~load_msg_addr();
|
|
452
|
+
int amount = in_msg_body~load_coins();
|
|
453
|
+
|
|
454
|
+
;; Use fixed forward amount
|
|
455
|
+
;; No user control, no drainage risk
|
|
456
|
+
|
|
457
|
+
var msg = begin_cell()
|
|
458
|
+
.store_uint(0x18, 6)
|
|
459
|
+
.store_slice(to_address)
|
|
460
|
+
.store_coins(FORWARD_TON_AMOUNT) ;; Fixed amount
|
|
461
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
462
|
+
;; Store message body
|
|
463
|
+
.end_cell();
|
|
464
|
+
|
|
465
|
+
send_raw_message(msg, 1);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
;; SECURE: Validate msg_value covers all costs (if user-specified)
|
|
470
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
471
|
+
int op = in_msg_body~load_uint(32);
|
|
472
|
+
|
|
473
|
+
if (op == op::transfer_with_forward) {
|
|
474
|
+
slice to_address = in_msg_body~load_msg_addr();
|
|
475
|
+
int amount = in_msg_body~load_coins();
|
|
476
|
+
int forward_ton_amount = in_msg_body~load_coins();
|
|
477
|
+
|
|
478
|
+
;; CRITICAL: Validate msg_value covers tx fee + forward amount
|
|
479
|
+
throw_unless(error::insufficient_gas,
|
|
480
|
+
msg_value >= TX_FEE + forward_ton_amount);
|
|
481
|
+
|
|
482
|
+
var msg = begin_cell()
|
|
483
|
+
.store_uint(0x18, 6)
|
|
484
|
+
.store_slice(to_address)
|
|
485
|
+
.store_coins(forward_ton_amount)
|
|
486
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
487
|
+
.end_cell();
|
|
488
|
+
|
|
489
|
+
;; Safe: user provided sufficient gas
|
|
490
|
+
send_raw_message(msg, 1);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
;; SECURE: Bounded forward amounts
|
|
495
|
+
const int MAX_FORWARD_TON = 100000000; ;; 0.1 TON maximum
|
|
496
|
+
|
|
497
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
498
|
+
int op = in_msg_body~load_uint(32);
|
|
499
|
+
|
|
500
|
+
if (op == op::claim_with_notification) {
|
|
501
|
+
slice user = in_msg_body~load_msg_addr();
|
|
502
|
+
int forward_ton_amount = in_msg_body~load_coins();
|
|
503
|
+
|
|
504
|
+
;; Enforce maximum forward amount
|
|
505
|
+
throw_unless(error::forward_amount_too_high,
|
|
506
|
+
forward_ton_amount <= MAX_FORWARD_TON);
|
|
507
|
+
|
|
508
|
+
;; Validate msg_value covers costs
|
|
509
|
+
throw_unless(error::insufficient_gas,
|
|
510
|
+
msg_value >= TX_FEE + forward_ton_amount);
|
|
511
|
+
|
|
512
|
+
;; Calculate reward from contract logic
|
|
513
|
+
int reward = calculate_reward(user);
|
|
514
|
+
|
|
515
|
+
var msg = begin_cell()
|
|
516
|
+
.store_uint(0x18, 6)
|
|
517
|
+
.store_slice(user)
|
|
518
|
+
.store_coins(reward) ;; Reward from contract
|
|
519
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
520
|
+
;; Message body
|
|
521
|
+
.end_cell();
|
|
522
|
+
|
|
523
|
+
;; Send with user's gas
|
|
524
|
+
send_raw_message(msg, 64); ;; Flag 64: use all remaining gas from incoming message
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
;; SECURE: Don't allow user to specify forward amount at all
|
|
529
|
+
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
|
|
530
|
+
int op = in_msg_body~load_uint(32);
|
|
531
|
+
|
|
532
|
+
if (op == op::withdraw) {
|
|
533
|
+
slice user = in_msg_body~load_msg_addr();
|
|
534
|
+
|
|
535
|
+
;; No forward_ton_amount parameter
|
|
536
|
+
;; Use contract's calculated amount only
|
|
537
|
+
|
|
538
|
+
int withdrawal_amount = calculate_withdrawal(user);
|
|
539
|
+
|
|
540
|
+
var msg = begin_cell()
|
|
541
|
+
.store_uint(0x18, 6)
|
|
542
|
+
.store_slice(user)
|
|
543
|
+
.store_coins(withdrawal_amount) ;; Contract controlled
|
|
544
|
+
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
|
|
545
|
+
.end_cell();
|
|
546
|
+
|
|
547
|
+
send_raw_message(msg, 1);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
**Send Message Flags Reference**:
|
|
553
|
+
```func
|
|
554
|
+
;; send_raw_message flag values:
|
|
555
|
+
;; 0 - Normal send, pay fees from message value
|
|
556
|
+
;; 1 - Pay fees separately from contract balance
|
|
557
|
+
;; 64 - Return remaining value from incoming message
|
|
558
|
+
;; 128 - Carry all remaining balance
|
|
559
|
+
|
|
560
|
+
;; Safe patterns:
|
|
561
|
+
send_raw_message(msg, 64); ;; Use incoming msg_value for fees
|
|
562
|
+
send_raw_message(msg, 0); ;; Fees from message value itself
|
|
563
|
+
|
|
564
|
+
;; Dangerous with user input:
|
|
565
|
+
send_raw_message(msg, 1); ;; Fees from contract - validate msg_value!
|
|
566
|
+
send_raw_message(msg, 128); ;; Never use with user-controlled amounts!
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
**Testing**:
|
|
570
|
+
```typescript
|
|
571
|
+
// Test cannot drain contract with large forward amount
|
|
572
|
+
it("should reject large forward amount without sufficient gas", async () => {
|
|
573
|
+
const result = await contract.sendInternalMessage(user.getSender(), {
|
|
574
|
+
value: toNano("0.01"), // Only 0.01 TON provided
|
|
575
|
+
body: {
|
|
576
|
+
op: OP_CODES.TRANSFER,
|
|
577
|
+
toAddress: recipient.address,
|
|
578
|
+
amount: toNano("100"),
|
|
579
|
+
forwardTonAmount: toNano("10"), // Trying to forward 10 TON!
|
|
580
|
+
},
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
expect(result.transactions).toHaveTransaction({
|
|
584
|
+
success: false,
|
|
585
|
+
exitCode: ERROR_CODES.INSUFFICIENT_GAS,
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// Contract balance should not decrease
|
|
589
|
+
expect(await contract.getBalance()).toEqual(initialBalance);
|
|
590
|
+
});
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
**References**: building-secure-contracts/not-so-smart-contracts/ton/forward_value_without_check
|
|
594
|
+
|
|
595
|
+
---
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "burpsuite-project-parser",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Search and extract data from Burp Suite project files (.burp) directly from the command line for use in Claude",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Will Vandevanter",
|
|
7
|
+
"email": "opensource@trailofbits.com",
|
|
8
|
+
"url": "https://github.com/trailofbits"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Burp Suite Project Parser
|
|
2
|
+
|
|
3
|
+
Search and extract data from Burp Suite project files (.burp) for use in Claude
|
|
4
|
+
|
|
5
|
+
**Author:** Will Vandevanter
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- **Burp Suite Professional** - Required for project file support
|
|
10
|
+
- **burpsuite-project-file-parser extension** - Must be installed in Burp Suite (Available: https://github.com/BuffaloWill/burpsuite-project-file-parser)
|
|
11
|
+
- **jq** (optional) - Recommended for formatting/filtering JSON output
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
Use this skill when you need to get the following from a Burp project:
|
|
16
|
+
- Search response headers or bodies using regex patterns
|
|
17
|
+
- Extract security audit findings and vulnerabilities
|
|
18
|
+
- Dump proxy history or site map data for analysis
|
|
19
|
+
- Programmatically analyze HTTP traffic captured by Burp Suite
|
|
20
|
+
|
|
21
|
+
Trigger phrases: "search the burp project", "find in burp file", "what vulnerabilities in the burp", "get audit items from burp"
|
|
22
|
+
|
|
23
|
+
## What It Does
|
|
24
|
+
|
|
25
|
+
This skill provides CLI access to Burp Suite project files through the burpsuite-project-file-parser extension:
|
|
26
|
+
|
|
27
|
+
1. **Search headers/bodies** - Find specific patterns in captured HTTP traffic using regex
|
|
28
|
+
2. **Extract audit items** - Get all security findings with severity, confidence, and URLs
|
|
29
|
+
3. **Dump traffic data** - Export proxy history and site map entries as JSON
|
|
30
|
+
4. **Filter output** - Use sub-component filters to optimize performance on large projects
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
/plugin install trailofbits/skills/plugins/burpsuite-project-parser
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
Base command:
|
|
41
|
+
```bash
|
|
42
|
+
scripts/burp-search.sh /path/to/project.burp [FLAGS]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Available Commands
|
|
46
|
+
|
|
47
|
+
| Command | Description | Output |
|
|
48
|
+
|---------|-------------|--------|
|
|
49
|
+
| `auditItems` | Extract all security findings | JSON: name, severity, confidence, host, port, protocol, url |
|
|
50
|
+
| `proxyHistory` | Dump all captured HTTP traffic | Complete request/response data |
|
|
51
|
+
| `siteMap` | Dump all site map entries | Site structure |
|
|
52
|
+
| `responseHeader='.*regex.*'` | Search response headers | JSON: url, header |
|
|
53
|
+
| `responseBody='.*regex.*'` | Search response bodies | Matching content |
|
|
54
|
+
|
|
55
|
+
### Sub-Component Filters
|
|
56
|
+
|
|
57
|
+
For large projects, filter to specific data to improve performance:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
proxyHistory.request.headers # Only request headers
|
|
61
|
+
proxyHistory.request.body # Only request body
|
|
62
|
+
proxyHistory.response.headers # Only response headers
|
|
63
|
+
proxyHistory.response.body # Only response body
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Same patterns work with `siteMap.*`
|
|
67
|
+
|
|
68
|
+
## Examples
|
|
69
|
+
|
|
70
|
+
Search for CORS headers:
|
|
71
|
+
```bash
|
|
72
|
+
scripts/burp-search.sh project.burp "responseHeader='.*Access-Control.*'"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Get all high-severity findings:
|
|
76
|
+
```bash
|
|
77
|
+
scripts/burp-search.sh project.burp auditItems | jq 'select(.severity == "High")'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Find server signatures:
|
|
81
|
+
```bash
|
|
82
|
+
scripts/burp-search.sh project.burp "responseHeader='.*(nginx|Apache|Servlet).*'"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Extract request URLs from proxy history:
|
|
86
|
+
```bash
|
|
87
|
+
scripts/burp-search.sh project.burp proxyHistory.request.headers | jq -r '.request.url'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Search for HTML forms:
|
|
91
|
+
```bash
|
|
92
|
+
scripts/burp-search.sh project.burp "responseBody='.*<form.*action.*'"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Output Format
|
|
96
|
+
|
|
97
|
+
All output is JSON, one object per line. Pipe to `jq` for formatting or use `grep` for filtering:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
scripts/burp-search.sh project.burp auditItems | jq .
|
|
101
|
+
scripts/burp-search.sh project.burp auditItems | grep -i "sql injection"
|
|
102
|
+
```
|
|
103
|
+
|