@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,136 @@
|
|
|
1
|
+
# Constant-Time Analysis: JavaScript and TypeScript
|
|
2
|
+
|
|
3
|
+
Analysis guidance for JavaScript and TypeScript. Uses V8 bytecode output from Node.js to detect timing-unsafe operations.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- **Node.js** (v14+) - for JavaScript analysis
|
|
8
|
+
- **TypeScript compiler** (tsc) - for TypeScript files (optional, uses npx fallback)
|
|
9
|
+
|
|
10
|
+
## Running the Analyzer
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# Analyze JavaScript
|
|
14
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.js
|
|
15
|
+
|
|
16
|
+
# Analyze TypeScript (transpiles first)
|
|
17
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.ts
|
|
18
|
+
|
|
19
|
+
# Include warning-level violations
|
|
20
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings crypto.js
|
|
21
|
+
|
|
22
|
+
# Filter to specific functions
|
|
23
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --func 'encrypt|sign' crypto.js
|
|
24
|
+
|
|
25
|
+
# JSON output for CI
|
|
26
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json crypto.js
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Dangerous Operations
|
|
30
|
+
|
|
31
|
+
### Bytecodes (Errors)
|
|
32
|
+
|
|
33
|
+
| Bytecode | Issue |
|
|
34
|
+
|----------|-------|
|
|
35
|
+
| Div | Variable-time execution based on operand values |
|
|
36
|
+
| Mod | Variable-time execution based on operand values |
|
|
37
|
+
| DivSmi | Division by small integer has variable-time execution |
|
|
38
|
+
| ModSmi | Modulo by small integer has variable-time execution |
|
|
39
|
+
|
|
40
|
+
### Functions (Errors)
|
|
41
|
+
|
|
42
|
+
| Function | Issue | Safe Alternative |
|
|
43
|
+
|----------|-------|------------------|
|
|
44
|
+
| `Math.sqrt()` | Variable latency based on operand values | Avoid in crypto |
|
|
45
|
+
| `Math.pow()` | Variable latency based on operand values | Avoid in crypto |
|
|
46
|
+
| `Math.random()` | Predictable | `crypto.getRandomValues()` |
|
|
47
|
+
| `eval()` | Unpredictable timing | Avoid entirely |
|
|
48
|
+
|
|
49
|
+
### Functions (Warnings)
|
|
50
|
+
|
|
51
|
+
| Function | Issue | Safe Alternative |
|
|
52
|
+
|----------|-------|------------------|
|
|
53
|
+
| `===` (strings) | Early-terminating | `crypto.timingSafeEqual()` |
|
|
54
|
+
| `indexOf()` | Early-terminating | Constant-time search |
|
|
55
|
+
| `includes()` | Early-terminating | Constant-time search |
|
|
56
|
+
| `startsWith()` | Early-terminating | `crypto.timingSafeEqual()` on prefix |
|
|
57
|
+
| `endsWith()` | Early-terminating | `crypto.timingSafeEqual()` on suffix |
|
|
58
|
+
| `JSON.stringify()` | Variable-length output | Fixed-length padding |
|
|
59
|
+
| `JSON.parse()` | Variable-time based on input | Fixed-length input |
|
|
60
|
+
| `btoa()` / `atob()` | Variable-length output | Fixed-length padding |
|
|
61
|
+
|
|
62
|
+
## Safe Patterns
|
|
63
|
+
|
|
64
|
+
### String Comparison (Node.js)
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// VULNERABLE: Early exit on mismatch
|
|
68
|
+
if (userToken === storedToken) { ... }
|
|
69
|
+
|
|
70
|
+
// SAFE: Constant-time comparison (Node.js)
|
|
71
|
+
const crypto = require('crypto');
|
|
72
|
+
if (crypto.timingSafeEqual(Buffer.from(userToken), Buffer.from(storedToken))) { ... }
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Random Number Generation
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// VULNERABLE: Predictable
|
|
79
|
+
const token = Math.random().toString(36);
|
|
80
|
+
|
|
81
|
+
// SAFE: Cryptographically secure (Node.js)
|
|
82
|
+
const crypto = require('crypto');
|
|
83
|
+
const token = crypto.randomBytes(16).toString('hex');
|
|
84
|
+
|
|
85
|
+
// SAFE: Browser
|
|
86
|
+
const array = new Uint8Array(16);
|
|
87
|
+
crypto.getRandomValues(array);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Division Operations
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
// VULNERABLE: Division has variable timing
|
|
94
|
+
const quotient = secret / divisor;
|
|
95
|
+
|
|
96
|
+
// SAFE: Use multiplication by inverse (if divisor is constant)
|
|
97
|
+
// Precompute: inverse = 1/divisor as fixed-point
|
|
98
|
+
const quotient = Math.floor(secret * inverse);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## TypeScript Notes
|
|
102
|
+
|
|
103
|
+
The analyzer:
|
|
104
|
+
1. Looks for `tsconfig.json` in parent directories
|
|
105
|
+
2. Transpiles TypeScript to JavaScript in a temp directory
|
|
106
|
+
3. Analyzes the transpiled JavaScript
|
|
107
|
+
4. Reports violations against the original TypeScript file
|
|
108
|
+
|
|
109
|
+
If tsc is not installed, the analyzer tries `npx tsc` as a fallback.
|
|
110
|
+
|
|
111
|
+
## Limitations
|
|
112
|
+
|
|
113
|
+
### V8 Bytecode Analysis
|
|
114
|
+
|
|
115
|
+
The analyzer uses `node --print-bytecode` to get V8 bytecode. This has limitations:
|
|
116
|
+
|
|
117
|
+
1. **JIT Compilation**: V8 may JIT-compile hot functions to native code with different timing characteristics
|
|
118
|
+
2. **Function Inlining**: Inlined functions may not appear in bytecode
|
|
119
|
+
3. **Deoptimization**: Code can be deoptimized back to bytecode
|
|
120
|
+
|
|
121
|
+
### Source-Level Detection
|
|
122
|
+
|
|
123
|
+
The analyzer also performs source-level pattern matching to detect:
|
|
124
|
+
- Division (`/`) and modulo (`%`) operators
|
|
125
|
+
- Dangerous function calls (`Math.random()`, etc.)
|
|
126
|
+
|
|
127
|
+
This catches issues that bytecode analysis might miss due to parsing limitations.
|
|
128
|
+
|
|
129
|
+
## Browser Considerations
|
|
130
|
+
|
|
131
|
+
The analyzer targets Node.js V8 bytecode. Browser JavaScript engines (SpiderMonkey, JavaScriptCore) have different bytecode formats and timing characteristics.
|
|
132
|
+
|
|
133
|
+
For browser-targeted code:
|
|
134
|
+
- The V8 analysis is still valuable as a baseline
|
|
135
|
+
- Consider additional testing in target browsers
|
|
136
|
+
- Use Web Crypto API for cryptographic operations
|
package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Constant-Time Analysis: Kotlin
|
|
2
|
+
|
|
3
|
+
Analysis guidance for Kotlin targeting Android and JVM platforms. Kotlin compiles to JVM bytecode, sharing the same runtime characteristics as Java.
|
|
4
|
+
|
|
5
|
+
## Understanding Kotlin Compilation
|
|
6
|
+
|
|
7
|
+
Kotlin compiles to JVM bytecode that runs on the same virtual machine as Java:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Source Code (.kt/.kts)
|
|
11
|
+
|
|
|
12
|
+
v
|
|
13
|
+
kotlinc (Kotlin Compiler)
|
|
14
|
+
|
|
|
15
|
+
v
|
|
16
|
+
Bytecode (.class files)
|
|
17
|
+
|
|
|
18
|
+
v
|
|
19
|
+
JIT Compiler (HotSpot/ART)
|
|
20
|
+
|
|
|
21
|
+
v
|
|
22
|
+
Native Code (at runtime)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Key implications for Android:**
|
|
26
|
+
|
|
27
|
+
1. **Android Runtime (ART)** - Android uses ART instead of HotSpot JVM
|
|
28
|
+
2. **AOT compilation** - ART compiles bytecode to native code at install time
|
|
29
|
+
3. **Same bytecode vulnerabilities** - Division/branch timing issues persist regardless of runtime
|
|
30
|
+
|
|
31
|
+
## Running the Analyzer
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Analyze Kotlin source
|
|
35
|
+
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.kt
|
|
36
|
+
|
|
37
|
+
# Include conditional branch warnings
|
|
38
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings CryptoUtils.kt
|
|
39
|
+
|
|
40
|
+
# Filter to specific functions
|
|
41
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --func 'sign|verify' CryptoUtils.kt
|
|
42
|
+
|
|
43
|
+
# CI-friendly JSON output
|
|
44
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json CryptoUtils.kt
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Note: The `--arch` and `--opt-level` flags do not apply to Kotlin as it compiles to JVM bytecode.
|
|
48
|
+
|
|
49
|
+
## Dangerous Bytecode Instructions
|
|
50
|
+
|
|
51
|
+
Kotlin compiles to the same JVM bytecode as Java:
|
|
52
|
+
|
|
53
|
+
| Category | Instructions | Risk |
|
|
54
|
+
|----------|--------------|------|
|
|
55
|
+
| Integer Division | `idiv`, `ldiv`, `irem`, `lrem` | Variable-time based on operand values |
|
|
56
|
+
| Floating Division | `fdiv`, `ddiv`, `frem`, `drem` | Variable latency |
|
|
57
|
+
| Conditional Branches | `ifeq`, `ifne`, `iflt`, `ifge`, `ifgt`, `ifle`, `if_icmp*` | Timing leak if condition depends on secrets |
|
|
58
|
+
| Table Lookups | `*aload`, `*astore`, `tableswitch`, `lookupswitch` | Cache timing if index depends on secrets |
|
|
59
|
+
|
|
60
|
+
## Constant-Time Patterns
|
|
61
|
+
|
|
62
|
+
### Replace Division
|
|
63
|
+
|
|
64
|
+
```kotlin
|
|
65
|
+
// VULNERABLE: Division instruction emitted
|
|
66
|
+
val q = secretValue / divisor
|
|
67
|
+
|
|
68
|
+
// SAFE: Barrett reduction (for fixed divisor)
|
|
69
|
+
// Precompute: mu = (1L shl 32) / divisor
|
|
70
|
+
val mu = (1L shl 32) / divisor
|
|
71
|
+
val q = ((secretValue.toLong() * mu) ushr 32).toInt()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Replace Branches
|
|
75
|
+
|
|
76
|
+
```kotlin
|
|
77
|
+
// VULNERABLE: Branch timing reveals secret
|
|
78
|
+
val result = if (secret != 0) a else b
|
|
79
|
+
|
|
80
|
+
// SAFE: Constant-time selection using bitwise ops
|
|
81
|
+
val mask = -(if (secret != 0) 1 else 0)
|
|
82
|
+
// Better: compute mask without branch
|
|
83
|
+
val mask = (secret or -secret) shr 31 // -1 if secret != 0, else 0
|
|
84
|
+
val result = (a and mask) or (b and mask.inv())
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Replace Comparisons
|
|
88
|
+
|
|
89
|
+
```kotlin
|
|
90
|
+
// VULNERABLE: contentEquals() may early-terminate
|
|
91
|
+
if (computed.contentEquals(expected)) { ... }
|
|
92
|
+
|
|
93
|
+
// SAFE: Use MessageDigest.isEqual() for constant-time comparison
|
|
94
|
+
import java.security.MessageDigest
|
|
95
|
+
if (MessageDigest.isEqual(computed, expected)) { ... }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Secure Random
|
|
99
|
+
|
|
100
|
+
```kotlin
|
|
101
|
+
// VULNERABLE: kotlin.random.Random is predictable
|
|
102
|
+
import kotlin.random.Random
|
|
103
|
+
val value = Random.nextInt()
|
|
104
|
+
|
|
105
|
+
// SAFE: Cryptographically secure
|
|
106
|
+
import java.security.SecureRandom
|
|
107
|
+
val secureRand = SecureRandom()
|
|
108
|
+
val value = secureRand.nextInt()
|
|
109
|
+
|
|
110
|
+
// Or use Kotlin's secure wrapper (requires kotlin-stdlib-jdk8)
|
|
111
|
+
import kotlin.random.asKotlinRandom
|
|
112
|
+
val secureKotlinRandom = SecureRandom().asKotlinRandom()
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Android-Specific Considerations
|
|
116
|
+
|
|
117
|
+
### Keystore Operations
|
|
118
|
+
|
|
119
|
+
```kotlin
|
|
120
|
+
// Use Android Keystore for cryptographic key storage
|
|
121
|
+
import android.security.keystore.KeyGenParameterSpec
|
|
122
|
+
import android.security.keystore.KeyProperties
|
|
123
|
+
|
|
124
|
+
val keyGenerator = KeyGenerator.getInstance(
|
|
125
|
+
KeyProperties.KEY_ALGORITHM_AES,
|
|
126
|
+
"AndroidKeyStore"
|
|
127
|
+
)
|
|
128
|
+
keyGenerator.init(
|
|
129
|
+
KeyGenParameterSpec.Builder(
|
|
130
|
+
"my_key",
|
|
131
|
+
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
|
|
132
|
+
)
|
|
133
|
+
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
|
|
134
|
+
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
|
|
135
|
+
.build()
|
|
136
|
+
)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Constant-Time Comparison on Android
|
|
140
|
+
|
|
141
|
+
```kotlin
|
|
142
|
+
// Android provides MessageDigest.isEqual()
|
|
143
|
+
import java.security.MessageDigest
|
|
144
|
+
|
|
145
|
+
fun constantTimeEquals(a: ByteArray, b: ByteArray): Boolean {
|
|
146
|
+
return MessageDigest.isEqual(a, b)
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Secure Random on Android
|
|
151
|
+
|
|
152
|
+
```kotlin
|
|
153
|
+
// SecureRandom works the same on Android
|
|
154
|
+
import java.security.SecureRandom
|
|
155
|
+
|
|
156
|
+
fun generateSecureToken(length: Int): ByteArray {
|
|
157
|
+
val random = SecureRandom()
|
|
158
|
+
val token = ByteArray(length)
|
|
159
|
+
random.nextBytes(token)
|
|
160
|
+
return token
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Kotlin-Specific Pitfalls
|
|
165
|
+
|
|
166
|
+
### Extension Functions on Primitives
|
|
167
|
+
|
|
168
|
+
```kotlin
|
|
169
|
+
// DANGEROUS: Division in extension function
|
|
170
|
+
fun Int.divideBy(divisor: Int) = this / divisor // Emits IDIV
|
|
171
|
+
|
|
172
|
+
// The inline modifier doesn't change bytecode behavior
|
|
173
|
+
inline fun Int.divideByInline(divisor: Int) = this / divisor // Still IDIV
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### When Expressions
|
|
177
|
+
|
|
178
|
+
```kotlin
|
|
179
|
+
// VULNERABLE: when compiles to tableswitch/lookupswitch
|
|
180
|
+
when (secretValue) {
|
|
181
|
+
0 -> handleZero()
|
|
182
|
+
1 -> handleOne()
|
|
183
|
+
else -> handleOther()
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Consider constant-time alternatives for secret-dependent dispatch
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Null Safety Checks
|
|
190
|
+
|
|
191
|
+
```kotlin
|
|
192
|
+
// Nullable operations may introduce branches
|
|
193
|
+
val result = secretNullable?.process() // Introduces null check branch
|
|
194
|
+
|
|
195
|
+
// Be aware of null-check timing when handling secrets
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Setup Requirements
|
|
199
|
+
|
|
200
|
+
### Kotlin Compiler
|
|
201
|
+
|
|
202
|
+
**macOS:**
|
|
203
|
+
```bash
|
|
204
|
+
brew install kotlin
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Ubuntu/Debian:**
|
|
208
|
+
```bash
|
|
209
|
+
sudo snap install kotlin --classic
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Windows:**
|
|
213
|
+
```bash
|
|
214
|
+
scoop install kotlin
|
|
215
|
+
# or
|
|
216
|
+
choco install kotlinc
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Android Development
|
|
220
|
+
|
|
221
|
+
For Android projects, the Kotlin compiler is typically bundled with Android Studio. Ensure your project's Kotlin version is up to date in `build.gradle.kts`:
|
|
222
|
+
|
|
223
|
+
```kotlin
|
|
224
|
+
plugins {
|
|
225
|
+
kotlin("jvm") version "1.9.0"
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Verification
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
kotlinc -version # Should show: kotlinc-jvm X.X.X
|
|
233
|
+
javap -version # Required for bytecode disassembly
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Common Mistakes
|
|
237
|
+
|
|
238
|
+
1. **Using kotlin.random.Random** - The default Random is not cryptographically secure; use `java.security.SecureRandom`
|
|
239
|
+
|
|
240
|
+
2. **Relying on == for byte arrays** - `==` compares references in Kotlin; use `contentEquals()` for value comparison, but neither is constant-time
|
|
241
|
+
|
|
242
|
+
3. **Infix functions for crypto** - Custom operators don't change timing characteristics of underlying operations
|
|
243
|
+
|
|
244
|
+
4. **Coroutines timing** - Suspending functions add scheduling overhead that may mask or introduce timing variations
|
|
245
|
+
|
|
246
|
+
5. **Sealed classes for dispatch** - Pattern matching on sealed classes compiles to switches that may leak timing
|
|
247
|
+
|
|
248
|
+
## Further Reading
|
|
249
|
+
|
|
250
|
+
- [Kotlin/JVM Interoperability](https://kotlinlang.org/docs/java-interop.html)
|
|
251
|
+
- [Android Keystore System](https://developer.android.com/training/articles/keystore)
|
|
252
|
+
- [Bouncy Castle for Kotlin](https://www.bouncycastle.org/java.html) - Constant-time crypto primitives
|
package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Constant-Time Analysis: PHP
|
|
2
|
+
|
|
3
|
+
Analysis guidance for PHP scripts. Uses the VLD extension or OPcache debug output to analyze Zend opcodes.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
### Installing VLD Extension
|
|
8
|
+
|
|
9
|
+
The VLD (Vulcan Logic Dumper) extension is required for detailed opcode analysis. OPcache fallback is available but provides less detail.
|
|
10
|
+
|
|
11
|
+
**Option 1: PECL Install (Recommended)**
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Query latest version from PECL
|
|
15
|
+
VLD_VERSION=$(curl -s https://pecl.php.net/package/vld | grep -oP 'vld-\K[0-9.]+(?=\.tgz)' | head -1)
|
|
16
|
+
echo "Latest VLD version: $VLD_VERSION"
|
|
17
|
+
|
|
18
|
+
# Install via PECL channel URL (avoids version detection issues)
|
|
19
|
+
pecl install channel://pecl.php.net/vld-${VLD_VERSION}
|
|
20
|
+
|
|
21
|
+
# Or if above fails, install with explicit channel:
|
|
22
|
+
pecl install https://pecl.php.net/get/vld-${VLD_VERSION}.tgz
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Option 2: Build from Source**
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Clone and build from GitHub
|
|
29
|
+
git clone https://github.com/derickr/vld.git
|
|
30
|
+
cd vld
|
|
31
|
+
phpize
|
|
32
|
+
./configure
|
|
33
|
+
make
|
|
34
|
+
sudo make install
|
|
35
|
+
|
|
36
|
+
# Add to php.ini
|
|
37
|
+
echo "extension=vld.so" | sudo tee -a $(php --ini | grep "Loaded Configuration" | cut -d: -f2 | tr -d ' ')
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Verify Installation**
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
php -m | grep -i vld
|
|
44
|
+
# Should output: vld
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### macOS with Homebrew PHP
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Homebrew PHP may need manual extension directory setup
|
|
51
|
+
PHP_EXT_DIR=$(php -i | grep extension_dir | awk '{print $3}')
|
|
52
|
+
echo "PHP extension directory: $PHP_EXT_DIR"
|
|
53
|
+
|
|
54
|
+
# After building VLD, copy the extension
|
|
55
|
+
sudo cp modules/vld.so "$PHP_EXT_DIR/"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Running the Analyzer
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Analyze PHP file
|
|
62
|
+
uv run {baseDir}/ct_analyzer/analyzer.py crypto.php
|
|
63
|
+
|
|
64
|
+
# Include warning-level violations
|
|
65
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --warnings crypto.php
|
|
66
|
+
|
|
67
|
+
# Filter to specific functions
|
|
68
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --func 'encrypt|decrypt' crypto.php
|
|
69
|
+
|
|
70
|
+
# JSON output for CI
|
|
71
|
+
uv run {baseDir}/ct_analyzer/analyzer.py --json crypto.php
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Dangerous Operations
|
|
75
|
+
|
|
76
|
+
### Opcodes (Errors)
|
|
77
|
+
|
|
78
|
+
| Opcode | Issue |
|
|
79
|
+
|--------|-------|
|
|
80
|
+
| DIV | Variable-time execution based on operand values |
|
|
81
|
+
| MOD | Variable-time execution based on operand values |
|
|
82
|
+
| POW | Variable-time execution |
|
|
83
|
+
|
|
84
|
+
### Functions (Errors)
|
|
85
|
+
|
|
86
|
+
| Function | Issue | Safe Alternative |
|
|
87
|
+
|----------|-------|------------------|
|
|
88
|
+
| `chr()` | Table lookup indexed by secret data | `pack('C', $int)` |
|
|
89
|
+
| `ord()` | Table lookup indexed by secret data | `unpack('C', $char)[1]` |
|
|
90
|
+
| `bin2hex()` | Table lookups indexed on secret data | Custom constant-time implementation |
|
|
91
|
+
| `hex2bin()` | Table lookups indexed on secret data | Custom constant-time implementation |
|
|
92
|
+
| `base64_encode()` | Table lookups indexed on secret data | Custom constant-time implementation |
|
|
93
|
+
| `base64_decode()` | Table lookups indexed on secret data | Custom constant-time implementation |
|
|
94
|
+
| `rand()` | Predictable | `random_int()` |
|
|
95
|
+
| `mt_rand()` | Predictable | `random_int()` |
|
|
96
|
+
| `array_rand()` | Uses mt_rand internally | `random_int()` |
|
|
97
|
+
| `uniqid()` | Predictable | `random_bytes()` |
|
|
98
|
+
| `shuffle()` | Uses mt_rand internally | Fisher-Yates with `random_int()` |
|
|
99
|
+
|
|
100
|
+
### Functions (Warnings)
|
|
101
|
+
|
|
102
|
+
| Function | Issue | Safe Alternative |
|
|
103
|
+
|----------|-------|------------------|
|
|
104
|
+
| `strcmp()` | Variable-time | `hash_equals()` |
|
|
105
|
+
| `strcasecmp()` | Variable-time | `hash_equals()` |
|
|
106
|
+
| `strncmp()` | Variable-time | `hash_equals()` |
|
|
107
|
+
| `substr_compare()` | Variable-time | `hash_equals()` |
|
|
108
|
+
| `serialize()` | Variable-length output | Fixed-length output |
|
|
109
|
+
| `json_encode()` | Variable-length output | Fixed-length output |
|
|
110
|
+
|
|
111
|
+
## Safe Patterns
|
|
112
|
+
|
|
113
|
+
### String Comparison
|
|
114
|
+
|
|
115
|
+
```php
|
|
116
|
+
// VULNERABLE: Early exit on mismatch
|
|
117
|
+
if ($user_token === $stored_token) { ... }
|
|
118
|
+
|
|
119
|
+
// SAFE: Constant-time comparison
|
|
120
|
+
if (hash_equals($stored_token, $user_token)) { ... }
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Random Number Generation
|
|
124
|
+
|
|
125
|
+
```php
|
|
126
|
+
// VULNERABLE: Predictable
|
|
127
|
+
$token = bin2hex(random_bytes(16)); // OK - random_bytes is secure
|
|
128
|
+
$index = mt_rand(0, count($array) - 1); // VULNERABLE
|
|
129
|
+
|
|
130
|
+
// SAFE: Cryptographically secure
|
|
131
|
+
$token = bin2hex(random_bytes(16));
|
|
132
|
+
$index = random_int(0, count($array) - 1);
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Character Operations
|
|
136
|
+
|
|
137
|
+
```php
|
|
138
|
+
// VULNERABLE: Table lookup timing
|
|
139
|
+
$byte = ord($secret_char);
|
|
140
|
+
$char = chr($secret_byte);
|
|
141
|
+
|
|
142
|
+
// SAFE: No table lookup
|
|
143
|
+
$byte = unpack('C', $secret_char)[1];
|
|
144
|
+
$char = pack('C', $secret_byte);
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Troubleshooting
|
|
148
|
+
|
|
149
|
+
### VLD Not Loading
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Check if extension is enabled
|
|
153
|
+
php -i | grep vld
|
|
154
|
+
|
|
155
|
+
# Check for loading errors
|
|
156
|
+
php -d display_errors=1 -d vld.active=1 -r "echo 'test';" 2>&1
|
|
157
|
+
|
|
158
|
+
# Common issue: wrong extension directory
|
|
159
|
+
php -i | grep extension_dir
|
|
160
|
+
ls $(php -r "echo ini_get('extension_dir');") | grep vld
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### OPcache Fallback
|
|
164
|
+
|
|
165
|
+
If VLD is unavailable, the analyzer falls back to OPcache debug output:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Manually test OPcache output
|
|
169
|
+
php -d opcache.enable_cli=1 -d opcache.opt_debug_level=0x10000 crypto.php 2>&1
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
OPcache provides less detailed output than VLD but still detects division/modulo opcodes.
|