@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
package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Constant-Time Analysis: Python
|
|
2
|
+
|
|
3
|
+
Analysis guidance for Python scripts. Uses the `dis` module to analyze CPython bytecode for timing-unsafe operations.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Python 3.10+ (bytecode format varies by version)
|
|
8
|
+
|
|
9
|
+
## Running the Analyzer
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Analyze Python file
|
|
13
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.py
|
|
14
|
+
|
|
15
|
+
# Include warning-level violations
|
|
16
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings crypto.py
|
|
17
|
+
|
|
18
|
+
# Filter to specific functions
|
|
19
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --func 'encrypt|sign' crypto.py
|
|
20
|
+
|
|
21
|
+
# JSON output for CI
|
|
22
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json crypto.py
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Dangerous Operations
|
|
26
|
+
|
|
27
|
+
### Bytecodes (Errors)
|
|
28
|
+
|
|
29
|
+
**Python < 3.11:**
|
|
30
|
+
|
|
31
|
+
| Bytecode | Issue |
|
|
32
|
+
|----------|-------|
|
|
33
|
+
| BINARY_TRUE_DIVIDE | Variable-time execution |
|
|
34
|
+
| BINARY_FLOOR_DIVIDE | Variable-time execution |
|
|
35
|
+
| BINARY_MODULO | Variable-time execution |
|
|
36
|
+
| INPLACE_TRUE_DIVIDE | Variable-time execution |
|
|
37
|
+
| INPLACE_FLOOR_DIVIDE | Variable-time execution |
|
|
38
|
+
| INPLACE_MODULO | Variable-time execution |
|
|
39
|
+
|
|
40
|
+
**Python 3.11+:**
|
|
41
|
+
|
|
42
|
+
| BINARY_OP Oparg | Operation | Issue |
|
|
43
|
+
|-----------------|-----------|-------|
|
|
44
|
+
| 11 | `/` | Variable-time execution |
|
|
45
|
+
| 12 | `//` | Variable-time execution |
|
|
46
|
+
| 6 | `%` | Variable-time execution |
|
|
47
|
+
| 24 | `/=` | Variable-time execution |
|
|
48
|
+
| 25 | `//=` | Variable-time execution |
|
|
49
|
+
| 19 | `%=` | Variable-time execution |
|
|
50
|
+
|
|
51
|
+
### Functions (Errors)
|
|
52
|
+
|
|
53
|
+
| Function | Issue | Safe Alternative |
|
|
54
|
+
|----------|-------|------------------|
|
|
55
|
+
| `random.random()` | Predictable | `secrets.token_bytes()` |
|
|
56
|
+
| `random.randint()` | Predictable | `secrets.randbelow()` |
|
|
57
|
+
| `random.randrange()` | Predictable | `secrets.randbelow()` |
|
|
58
|
+
| `random.choice()` | Predictable | `secrets.choice()` |
|
|
59
|
+
| `random.shuffle()` | Predictable | Custom with `secrets` |
|
|
60
|
+
| `random.sample()` | Predictable | Custom with `secrets` |
|
|
61
|
+
| `math.sqrt()` | Variable latency | Avoid in crypto |
|
|
62
|
+
| `math.pow()` | Variable latency | Avoid in crypto |
|
|
63
|
+
| `eval()` | Unpredictable timing | Avoid entirely |
|
|
64
|
+
| `exec()` | Unpredictable timing | Avoid entirely |
|
|
65
|
+
|
|
66
|
+
### Functions (Warnings)
|
|
67
|
+
|
|
68
|
+
| Function | Issue | Safe Alternative |
|
|
69
|
+
|----------|-------|------------------|
|
|
70
|
+
| `str.find()` | Early-terminating | Constant-time search |
|
|
71
|
+
| `str.index()` | Early-terminating | Constant-time search |
|
|
72
|
+
| `str.startswith()` | Early-terminating | `hmac.compare_digest()` |
|
|
73
|
+
| `str.endswith()` | Early-terminating | `hmac.compare_digest()` |
|
|
74
|
+
| `in` (strings) | Early-terminating | Constant-time search |
|
|
75
|
+
| `json.dumps()` | Variable-length output | Fixed-length padding |
|
|
76
|
+
| `json.loads()` | Variable-time | Fixed-length input |
|
|
77
|
+
| `base64.b64encode()` | Variable-length output | Fixed-length padding |
|
|
78
|
+
| `pickle.dumps()` | Variable-length output | Avoid for secrets |
|
|
79
|
+
| `pickle.loads()` | Variable-time, security risk | Avoid for secrets |
|
|
80
|
+
|
|
81
|
+
## Safe Patterns
|
|
82
|
+
|
|
83
|
+
### String Comparison
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
# VULNERABLE: Early exit on mismatch
|
|
87
|
+
if user_token == stored_token:
|
|
88
|
+
...
|
|
89
|
+
|
|
90
|
+
# SAFE: Constant-time comparison
|
|
91
|
+
import hmac
|
|
92
|
+
if hmac.compare_digest(user_token, stored_token):
|
|
93
|
+
...
|
|
94
|
+
|
|
95
|
+
# SAFE: For bytes
|
|
96
|
+
import secrets
|
|
97
|
+
if secrets.compare_digest(user_bytes, stored_bytes):
|
|
98
|
+
...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Random Number Generation
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
# VULNERABLE: Predictable
|
|
105
|
+
import random
|
|
106
|
+
token = random.randint(0, 2**128)
|
|
107
|
+
|
|
108
|
+
# SAFE: Cryptographically secure
|
|
109
|
+
import secrets
|
|
110
|
+
token = secrets.token_bytes(16)
|
|
111
|
+
token_int = secrets.randbits(128)
|
|
112
|
+
random_index = secrets.randbelow(len(items))
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Division Operations
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
# VULNERABLE: Division has variable timing
|
|
119
|
+
quotient = secret // divisor
|
|
120
|
+
|
|
121
|
+
# SAFE: Barrett reduction for constant divisors
|
|
122
|
+
# Precompute: mu = (1 << (2 * BITS)) // divisor
|
|
123
|
+
def barrett_reduce(value: int, divisor: int, mu: int, bits: int) -> int:
|
|
124
|
+
q = (value * mu) >> (2 * bits)
|
|
125
|
+
r = value - q * divisor
|
|
126
|
+
# Constant-time correction
|
|
127
|
+
mask = -(r >= divisor)
|
|
128
|
+
return r - (divisor & mask)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Python Version Notes
|
|
132
|
+
|
|
133
|
+
### Python 3.11+ Changes
|
|
134
|
+
|
|
135
|
+
Python 3.11 introduced the `BINARY_OP` bytecode that replaces individual binary operation bytecodes. The analyzer detects division/modulo by checking the oparg:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
BINARY_OP 11 (/) # True division
|
|
139
|
+
BINARY_OP 12 (//) # Floor division
|
|
140
|
+
BINARY_OP 6 (%) # Modulo
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Python 3.10 and Earlier
|
|
144
|
+
|
|
145
|
+
Uses separate bytecodes:
|
|
146
|
+
```
|
|
147
|
+
BINARY_TRUE_DIVIDE
|
|
148
|
+
BINARY_FLOOR_DIVIDE
|
|
149
|
+
BINARY_MODULO
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Cryptography Library Considerations
|
|
153
|
+
|
|
154
|
+
When using the `cryptography` library:
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# The cryptography library handles constant-time internally
|
|
158
|
+
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|
159
|
+
|
|
160
|
+
# SAFE: Library handles timing protection
|
|
161
|
+
aesgcm = AESGCM(key)
|
|
162
|
+
ciphertext = aesgcm.encrypt(nonce, plaintext, associated_data)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
For custom cryptographic code, ensure you:
|
|
166
|
+
1. Use `hmac.compare_digest()` for comparisons
|
|
167
|
+
2. Use `secrets` module for randomness
|
|
168
|
+
3. Avoid division/modulo on secret-derived values
|
|
169
|
+
4. Use fixed-length data representations
|
|
170
|
+
|
|
171
|
+
## Limitations
|
|
172
|
+
|
|
173
|
+
### CPython Bytecode Only
|
|
174
|
+
|
|
175
|
+
The analyzer targets CPython bytecode. Alternative implementations (PyPy, Jython, etc.) have different bytecode formats and timing characteristics.
|
|
176
|
+
|
|
177
|
+
### JIT Compilation
|
|
178
|
+
|
|
179
|
+
PyPy and Numba can JIT-compile Python to native code with potentially different timing behavior. Consider additional analysis for JIT-compiled code paths.
|
package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Constant-Time Analysis: Ruby
|
|
2
|
+
|
|
3
|
+
Analysis guidance for Ruby scripts. Uses YARV (Yet Another Ruby VM) instruction sequence dump to analyze bytecode for timing-unsafe operations.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Ruby 2.0+ (uses `ruby --dump=insns`)
|
|
8
|
+
|
|
9
|
+
## Running the Analyzer
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Analyze Ruby file
|
|
13
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.rb
|
|
14
|
+
|
|
15
|
+
# Include warning-level violations
|
|
16
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings crypto.rb
|
|
17
|
+
|
|
18
|
+
# Filter to specific functions
|
|
19
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --func 'encrypt|sign' crypto.rb
|
|
20
|
+
|
|
21
|
+
# JSON output for CI
|
|
22
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json crypto.rb
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Dangerous Operations
|
|
26
|
+
|
|
27
|
+
### Bytecodes (Errors)
|
|
28
|
+
|
|
29
|
+
| Bytecode | Issue |
|
|
30
|
+
|----------|-------|
|
|
31
|
+
| opt_div | Variable-time execution based on operand values |
|
|
32
|
+
| opt_mod | Variable-time execution based on operand values |
|
|
33
|
+
|
|
34
|
+
### Bytecodes (Warnings)
|
|
35
|
+
|
|
36
|
+
| Bytecode | Issue |
|
|
37
|
+
|----------|-------|
|
|
38
|
+
| opt_eq | May early-terminate on secret data |
|
|
39
|
+
| opt_neq | May early-terminate on secret data |
|
|
40
|
+
| opt_lt, opt_le, opt_gt, opt_ge | Comparison may leak timing |
|
|
41
|
+
| branchif, branchunless | Conditional branch on secrets |
|
|
42
|
+
| opt_aref | Array access may leak timing via cache |
|
|
43
|
+
| opt_aset | Array store may leak timing via cache |
|
|
44
|
+
| opt_lshift, opt_rshift | Bit shift timing may vary |
|
|
45
|
+
|
|
46
|
+
### Functions (Errors)
|
|
47
|
+
|
|
48
|
+
| Function | Issue | Safe Alternative |
|
|
49
|
+
|----------|-------|------------------|
|
|
50
|
+
| `rand()` | Predictable | `SecureRandom.random_bytes()` |
|
|
51
|
+
| `Random.new` | Predictable | `SecureRandom` |
|
|
52
|
+
| `srand()` | Sets predictable seed | `SecureRandom` |
|
|
53
|
+
| `Math.sqrt()` | Variable latency | Avoid in crypto |
|
|
54
|
+
|
|
55
|
+
### Functions (Warnings)
|
|
56
|
+
|
|
57
|
+
| Function | Issue | Safe Alternative |
|
|
58
|
+
|----------|-------|------------------|
|
|
59
|
+
| `include?()` | Early-terminating | Constant-time search |
|
|
60
|
+
| `index()` | Early-terminating | Constant-time search |
|
|
61
|
+
| `start_with?()` | Early-terminating | `Rack::Utils.secure_compare()` |
|
|
62
|
+
| `end_with?()` | Early-terminating | `Rack::Utils.secure_compare()` |
|
|
63
|
+
| `match()` | Variable-time | Avoid on secrets |
|
|
64
|
+
| `=~` | Variable-time regex | Avoid on secrets |
|
|
65
|
+
| `to_json()` | Variable-length output | Fixed-length padding |
|
|
66
|
+
| `Marshal.dump()` | Variable-length output | Avoid for secrets |
|
|
67
|
+
| `Marshal.load()` | Variable-time, security risk | Avoid for secrets |
|
|
68
|
+
|
|
69
|
+
## Safe Patterns
|
|
70
|
+
|
|
71
|
+
### String Comparison
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
# VULNERABLE: Early exit on mismatch
|
|
75
|
+
if user_token == stored_token
|
|
76
|
+
# ...
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# SAFE: Constant-time comparison (Rails/Rack)
|
|
80
|
+
require 'rack/utils'
|
|
81
|
+
if Rack::Utils.secure_compare(user_token, stored_token)
|
|
82
|
+
# ...
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# SAFE: ActiveSupport (Rails)
|
|
86
|
+
require 'active_support/security_utils'
|
|
87
|
+
if ActiveSupport::SecurityUtils.secure_compare(user_token, stored_token)
|
|
88
|
+
# ...
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# SAFE: OpenSSL (stdlib)
|
|
92
|
+
require 'openssl'
|
|
93
|
+
if OpenSSL.secure_compare(user_token, stored_token)
|
|
94
|
+
# ...
|
|
95
|
+
end
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Random Number Generation
|
|
99
|
+
|
|
100
|
+
```ruby
|
|
101
|
+
# VULNERABLE: Predictable
|
|
102
|
+
token = rand(2**128)
|
|
103
|
+
random_bytes = Random.new.bytes(16)
|
|
104
|
+
|
|
105
|
+
# SAFE: Cryptographically secure
|
|
106
|
+
require 'securerandom'
|
|
107
|
+
token = SecureRandom.random_bytes(16)
|
|
108
|
+
token_hex = SecureRandom.hex(16)
|
|
109
|
+
token_base64 = SecureRandom.base64(16)
|
|
110
|
+
random_number = SecureRandom.random_number(2**128)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Division Operations
|
|
114
|
+
|
|
115
|
+
```ruby
|
|
116
|
+
# VULNERABLE: Division has variable timing
|
|
117
|
+
quotient = secret / divisor
|
|
118
|
+
|
|
119
|
+
# SAFE: Barrett reduction for constant divisors
|
|
120
|
+
def barrett_reduce(value, divisor, mu, bits)
|
|
121
|
+
q = (value * mu) >> (2 * bits)
|
|
122
|
+
r = value - q * divisor
|
|
123
|
+
# Constant-time correction using bitwise operations
|
|
124
|
+
mask = -(r >= divisor ? 1 : 0)
|
|
125
|
+
r - (divisor & mask)
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Rails/Rack Integration
|
|
130
|
+
|
|
131
|
+
### Secure Compare
|
|
132
|
+
|
|
133
|
+
Rails and Rack provide constant-time comparison:
|
|
134
|
+
|
|
135
|
+
```ruby
|
|
136
|
+
# Rack (standalone)
|
|
137
|
+
Rack::Utils.secure_compare(a, b)
|
|
138
|
+
|
|
139
|
+
# Rails/ActiveSupport
|
|
140
|
+
ActiveSupport::SecurityUtils.secure_compare(a, b)
|
|
141
|
+
|
|
142
|
+
# OpenSSL (Ruby 2.5+)
|
|
143
|
+
OpenSSL.secure_compare(a, b)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### CSRF Token Comparison
|
|
147
|
+
|
|
148
|
+
```ruby
|
|
149
|
+
# Rails automatically uses secure_compare for CSRF tokens
|
|
150
|
+
# For custom token validation:
|
|
151
|
+
class ApplicationController < ActionController::Base
|
|
152
|
+
def verify_api_token
|
|
153
|
+
provided = request.headers['X-API-Token']
|
|
154
|
+
expected = current_user.api_token
|
|
155
|
+
|
|
156
|
+
# SAFE: Constant-time comparison
|
|
157
|
+
unless ActiveSupport::SecurityUtils.secure_compare(provided, expected)
|
|
158
|
+
head :unauthorized
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## YARV Bytecode Notes
|
|
165
|
+
|
|
166
|
+
The analyzer uses `ruby --dump=insns` to get YARV instruction sequences. Example output:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
== disasm: #<ISeq:vulnerable_function@test.rb:1 (1,0)-(5,3)>
|
|
170
|
+
local table (size: 2, argc: 2)
|
|
171
|
+
[ 2] value@0 [ 1] modulus@1
|
|
172
|
+
0000 getlocal_WC_0 value@0
|
|
173
|
+
0002 getlocal_WC_0 modulus@1
|
|
174
|
+
0004 opt_div <calldata!mid:/, argc:1>
|
|
175
|
+
0006 leave
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The `opt_div` instruction at offset 0004 is flagged as a timing vulnerability.
|
|
179
|
+
|
|
180
|
+
## Limitations
|
|
181
|
+
|
|
182
|
+
### MRI Ruby Only
|
|
183
|
+
|
|
184
|
+
The analyzer targets MRI (Matz's Ruby Interpreter) YARV bytecode. Alternative implementations (JRuby, TruffleRuby) have different bytecode formats:
|
|
185
|
+
|
|
186
|
+
- **JRuby**: Compiles to JVM bytecode
|
|
187
|
+
- **TruffleRuby**: Uses GraalVM intermediate representation
|
|
188
|
+
|
|
189
|
+
### Method Caching
|
|
190
|
+
|
|
191
|
+
Ruby's method dispatch involves caching that can affect timing. Even with constant-time operations, method lookup timing may leak information about code paths.
|
|
192
|
+
|
|
193
|
+
### Gem Dependencies
|
|
194
|
+
|
|
195
|
+
When auditing gems:
|
|
196
|
+
1. Check if the gem uses `SecureRandom` instead of `rand`
|
|
197
|
+
2. Verify string comparisons use `secure_compare`
|
|
198
|
+
3. Look for division/modulo operations on sensitive data
|
package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# Constant-Time Analysis: Swift
|
|
2
|
+
|
|
3
|
+
Analysis guidance for Swift targeting iOS, macOS, watchOS, and tvOS. Swift compiles to native code, making it subject to the same CPU-level timing side-channels as C, C++, Go, and Rust.
|
|
4
|
+
|
|
5
|
+
## Understanding Swift Compilation
|
|
6
|
+
|
|
7
|
+
Swift compiles directly to native machine code:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Source Code (.swift)
|
|
11
|
+
|
|
|
12
|
+
v
|
|
13
|
+
swiftc (Swift Compiler / LLVM)
|
|
14
|
+
|
|
|
15
|
+
v
|
|
16
|
+
Native Assembly
|
|
17
|
+
|
|
|
18
|
+
v
|
|
19
|
+
Machine Code (binary)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Key implications:**
|
|
23
|
+
|
|
24
|
+
1. **Same vulnerabilities as C** - Division, branches, and table lookups have data-dependent timing
|
|
25
|
+
2. **LLVM backend** - Swift uses LLVM, so analysis is similar to clang-compiled code
|
|
26
|
+
3. **Architecture matters** - x86_64 (Mac) and arm64 (iOS devices, Apple Silicon) have different instruction sets
|
|
27
|
+
|
|
28
|
+
## Running the Analyzer
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Analyze Swift for native architecture
|
|
32
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.swift
|
|
33
|
+
|
|
34
|
+
# Analyze for iOS device (arm64)
|
|
35
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.swift
|
|
36
|
+
|
|
37
|
+
# Analyze for Intel Mac
|
|
38
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.swift
|
|
39
|
+
|
|
40
|
+
# Test multiple optimization levels (RECOMMENDED)
|
|
41
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O0 crypto.swift
|
|
42
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O2 crypto.swift
|
|
43
|
+
|
|
44
|
+
# Include conditional branch warnings
|
|
45
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings crypto.swift
|
|
46
|
+
|
|
47
|
+
# CI-friendly JSON output
|
|
48
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json crypto.swift
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Dangerous Instructions by Architecture
|
|
52
|
+
|
|
53
|
+
### ARM64 (iOS devices, Apple Silicon Macs)
|
|
54
|
+
|
|
55
|
+
| Category | Instructions | Risk |
|
|
56
|
+
|----------|--------------|------|
|
|
57
|
+
| Division | `UDIV`, `SDIV` | Early termination optimization; variable-time |
|
|
58
|
+
| Floating-Point | `FDIV`, `FSQRT` | Variable latency based on operand values |
|
|
59
|
+
| Conditional Branches | `B.EQ`, `B.NE`, `CBZ`, `CBNZ`, etc. | Timing leak if condition depends on secrets |
|
|
60
|
+
|
|
61
|
+
### x86_64 (Intel Macs)
|
|
62
|
+
|
|
63
|
+
| Category | Instructions | Risk |
|
|
64
|
+
|----------|--------------|------|
|
|
65
|
+
| Division | `DIV`, `IDIV`, `DIVQ`, `IDIVQ` | Data-dependent timing |
|
|
66
|
+
| Floating-Point | `DIVSS`, `DIVSD`, `SQRTSS`, `SQRTSD` | Variable latency |
|
|
67
|
+
| Conditional Branches | `JE`, `JNE`, `JZ`, `JNZ`, etc. | Timing leak if condition depends on secrets |
|
|
68
|
+
|
|
69
|
+
## Constant-Time Patterns
|
|
70
|
+
|
|
71
|
+
### Replace Division
|
|
72
|
+
|
|
73
|
+
```swift
|
|
74
|
+
// VULNERABLE: Division instruction emitted
|
|
75
|
+
let q = secretValue / divisor
|
|
76
|
+
|
|
77
|
+
// SAFE: Barrett reduction (for fixed divisor)
|
|
78
|
+
// Precompute: mu = (1 << 32) / divisor
|
|
79
|
+
let mu: UInt64 = (1 << 32) / UInt64(divisor)
|
|
80
|
+
let q = Int32((UInt64(secretValue) &* mu) >> 32)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Replace Branches
|
|
84
|
+
|
|
85
|
+
```swift
|
|
86
|
+
// VULNERABLE: Branch timing reveals secret
|
|
87
|
+
let result = secret != 0 ? a : b
|
|
88
|
+
|
|
89
|
+
// SAFE: Constant-time selection using bitwise ops
|
|
90
|
+
let mask = Int32(bitPattern: UInt32(bitPattern: -Int32(secret != 0 ? 1 : 0)))
|
|
91
|
+
// Better approach with no branch:
|
|
92
|
+
let nonZero = (secret | -secret) >> 31 // -1 if secret != 0, else 0
|
|
93
|
+
let result = (a & nonZero) | (b & ~nonZero)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Replace Comparisons
|
|
97
|
+
|
|
98
|
+
```swift
|
|
99
|
+
// VULNERABLE: Standard equality may early-terminate
|
|
100
|
+
if computed == expected { ... }
|
|
101
|
+
|
|
102
|
+
// SAFE: Constant-time comparison
|
|
103
|
+
import CryptoKit // Available on iOS 13+, macOS 10.15+
|
|
104
|
+
|
|
105
|
+
// Use Data's built-in constant-time comparison for crypto
|
|
106
|
+
if computed.withUnsafeBytes({ cPtr in
|
|
107
|
+
expected.withUnsafeBytes { ePtr in
|
|
108
|
+
timingSafeCompare(cPtr, ePtr)
|
|
109
|
+
}
|
|
110
|
+
}) { ... }
|
|
111
|
+
|
|
112
|
+
// Manual constant-time comparison
|
|
113
|
+
func constantTimeCompare(_ a: [UInt8], _ b: [UInt8]) -> Bool {
|
|
114
|
+
guard a.count == b.count else { return false }
|
|
115
|
+
var result: UInt8 = 0
|
|
116
|
+
for i in 0..<a.count {
|
|
117
|
+
result |= a[i] ^ b[i]
|
|
118
|
+
}
|
|
119
|
+
return result == 0
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Secure Random
|
|
124
|
+
|
|
125
|
+
```swift
|
|
126
|
+
// VULNERABLE: Don't use for cryptographic purposes
|
|
127
|
+
import Foundation
|
|
128
|
+
let value = Int.random(in: 0..<100) // Uses arc4random, generally OK but not verified
|
|
129
|
+
|
|
130
|
+
// SAFE: Use CryptoKit (iOS 13+, macOS 10.15+)
|
|
131
|
+
import CryptoKit
|
|
132
|
+
|
|
133
|
+
// Generate secure random bytes
|
|
134
|
+
var randomBytes = [UInt8](repeating: 0, count: 32)
|
|
135
|
+
let status = SecRandomCopyBytes(kSecRandomDefault, randomBytes.count, &randomBytes)
|
|
136
|
+
guard status == errSecSuccess else { /* handle error */ }
|
|
137
|
+
|
|
138
|
+
// Or use SymmetricKey for key generation
|
|
139
|
+
let key = SymmetricKey(size: .bits256)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Apple Platform Considerations
|
|
143
|
+
|
|
144
|
+
### Using CryptoKit (Recommended)
|
|
145
|
+
|
|
146
|
+
CryptoKit provides constant-time implementations for common operations:
|
|
147
|
+
|
|
148
|
+
```swift
|
|
149
|
+
import CryptoKit
|
|
150
|
+
|
|
151
|
+
// HMAC (constant-time internally)
|
|
152
|
+
let key = SymmetricKey(size: .bits256)
|
|
153
|
+
let signature = HMAC<SHA256>.authenticationCode(for: data, using: key)
|
|
154
|
+
|
|
155
|
+
// AES-GCM encryption
|
|
156
|
+
let sealedBox = try AES.GCM.seal(plaintext, using: key)
|
|
157
|
+
|
|
158
|
+
// Curve25519 key agreement
|
|
159
|
+
let privateKey = Curve25519.KeyAgreement.PrivateKey()
|
|
160
|
+
let sharedSecret = try privateKey.sharedSecretFromKeyAgreement(with: peerPublicKey)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Security Framework
|
|
164
|
+
|
|
165
|
+
```swift
|
|
166
|
+
import Security
|
|
167
|
+
|
|
168
|
+
// Generate cryptographically secure random data
|
|
169
|
+
func secureRandomBytes(count: Int) -> Data? {
|
|
170
|
+
var bytes = [UInt8](repeating: 0, count: count)
|
|
171
|
+
let status = SecRandomCopyBytes(kSecRandomDefault, count, &bytes)
|
|
172
|
+
return status == errSecSuccess ? Data(bytes) : nil
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Keychain for secure storage
|
|
176
|
+
func storeInKeychain(key: Data, account: String) -> Bool {
|
|
177
|
+
let query: [String: Any] = [
|
|
178
|
+
kSecClass as String: kSecClassGenericPassword,
|
|
179
|
+
kSecAttrAccount as String: account,
|
|
180
|
+
kSecValueData as String: key
|
|
181
|
+
]
|
|
182
|
+
return SecItemAdd(query as CFDictionary, nil) == errSecSuccess
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Swift-Specific Pitfalls
|
|
187
|
+
|
|
188
|
+
### Optional Unwrapping
|
|
189
|
+
|
|
190
|
+
```swift
|
|
191
|
+
// Branching on optionals
|
|
192
|
+
if let secret = maybeSecret { // Introduces branch
|
|
193
|
+
process(secret)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Guard statements also branch
|
|
197
|
+
guard let secret = maybeSecret else { return }
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Pattern Matching
|
|
201
|
+
|
|
202
|
+
```swift
|
|
203
|
+
// Switch/case compiles to branching code
|
|
204
|
+
switch secretEnum {
|
|
205
|
+
case .optionA: handleA() // Branch
|
|
206
|
+
case .optionB: handleB() // Branch
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Array Subscripting
|
|
211
|
+
|
|
212
|
+
```swift
|
|
213
|
+
// Array access indexed by secret leaks via cache timing
|
|
214
|
+
let value = lookupTable[secretIndex] // Cache timing side-channel
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### String Operations
|
|
218
|
+
|
|
219
|
+
```swift
|
|
220
|
+
// String comparison is NOT constant-time
|
|
221
|
+
if secretString == expectedString { ... } // Variable-time
|
|
222
|
+
|
|
223
|
+
// Character iteration may also have timing variations
|
|
224
|
+
for char in secretString { ... }
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Setup Requirements
|
|
228
|
+
|
|
229
|
+
### Xcode (Recommended)
|
|
230
|
+
|
|
231
|
+
Install Xcode from the Mac App Store. The Swift compiler is included.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Verify installation
|
|
235
|
+
swiftc --version
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Swift Toolchain (Alternative)
|
|
239
|
+
|
|
240
|
+
Download from [swift.org](https://swift.org/download/) for standalone installation.
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Verify
|
|
244
|
+
swiftc --version
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Cross-Compilation
|
|
248
|
+
|
|
249
|
+
For analyzing code targeting different architectures:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# Analyze for iOS device
|
|
253
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.swift
|
|
254
|
+
|
|
255
|
+
# Analyze for iOS simulator
|
|
256
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.swift
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Common Mistakes
|
|
260
|
+
|
|
261
|
+
1. **Using Swift's == for byte comparison** - Standard equality comparison may early-terminate; use constant-time comparison
|
|
262
|
+
|
|
263
|
+
2. **Trusting CryptoKit for all operations** - CryptoKit provides constant-time primitives, but combining them incorrectly can introduce vulnerabilities
|
|
264
|
+
|
|
265
|
+
3. **String manipulation on secrets** - Swift strings have complex internal representations; timing varies with content
|
|
266
|
+
|
|
267
|
+
4. **Ignoring optimization levels** - Swift's optimizer can transform safe source code into unsafe assembly; test at multiple -O levels
|
|
268
|
+
|
|
269
|
+
5. **Platform availability** - CryptoKit requires iOS 13+/macOS 10.15+; older platforms need alternative implementations
|
|
270
|
+
|
|
271
|
+
## Testing on Different Architectures
|
|
272
|
+
|
|
273
|
+
Always test your cryptographic code on actual target architectures:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
# Apple Silicon Mac (arm64)
|
|
277
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.swift
|
|
278
|
+
|
|
279
|
+
# Cross-compile for Intel
|
|
280
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.swift
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Further Reading
|
|
284
|
+
|
|
285
|
+
- [Apple CryptoKit Documentation](https://developer.apple.com/documentation/cryptokit)
|
|
286
|
+
- [Apple Security Framework](https://developer.apple.com/documentation/security)
|
|
287
|
+
- [Swift.org Security](https://swift.org/blog/swift-5-release/)
|
|
288
|
+
- [OWASP iOS Security Guide](https://owasp.org/www-project-mobile-security-testing-guide/)
|