@elizaos/skills 2.0.0-alpha.10
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/dist/formatter.d.ts +44 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +182 -0
- package/dist/frontmatter.d.ts +39 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +105 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/loader.d.ts +33 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +362 -0
- package/dist/resolver.d.ts +18 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +90 -0
- package/dist/types.d.ts +201 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +57 -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/SKILL.md +85 -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/SKILL.md +297 -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/SKILL.md +67 -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-differential-review/.claude-plugin/plugin.json +10 -0
- package/skills/security-differential-review/README.md +109 -0
- package/skills/security-differential-review/SKILL.md +220 -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-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/SKILL.md +251 -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-fix-review/.claude-plugin/plugin.json +13 -0
- package/skills/security-fix-review/README.md +118 -0
- package/skills/security-fix-review/SKILL.md +264 -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/SKILL.md +117 -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/SKILL.md +333 -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/SKILL.md +109 -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/SKILL.md +168 -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/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/SKILL.md +292 -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/SKILL.md +349 -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/SKILL.md +91 -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/SKILL.md +104 -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/SKILL.md +142 -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
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Configuration Security Patterns
|
|
2
|
+
|
|
3
|
+
Dangerous configuration patterns that enable security failures.
|
|
4
|
+
|
|
5
|
+
## Zero/Empty/Null Semantics
|
|
6
|
+
|
|
7
|
+
### The Lifetime Zero Problem
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
# What does 0 mean?
|
|
11
|
+
session_timeout: 0 # Infinite timeout? Immediate expiry? Disabled?
|
|
12
|
+
token_lifetime: 0 # Never expires? Already expired? Use default?
|
|
13
|
+
max_attempts: 0 # No attempts allowed? Unlimited attempts?
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Real-world failures:**
|
|
17
|
+
- OTP libraries where `lifetime=0` means "accept any OTP regardless of age"
|
|
18
|
+
- Rate limiters where `max_attempts=0` disables rate limiting
|
|
19
|
+
- Session managers where `timeout=0` means "session never expires"
|
|
20
|
+
|
|
21
|
+
**Detection**: Any numeric security parameter that accepts 0.
|
|
22
|
+
|
|
23
|
+
**Fix**: Explicit constants, validation, or separate enable/disable flag.
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
# BAD
|
|
27
|
+
def verify_otp(code: str, lifetime: int = 300):
|
|
28
|
+
if lifetime <= 0:
|
|
29
|
+
return True # What??
|
|
30
|
+
|
|
31
|
+
# GOOD
|
|
32
|
+
def verify_otp(code: str, lifetime: int = 300):
|
|
33
|
+
if lifetime <= 0:
|
|
34
|
+
raise ValueError("lifetime must be positive")
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Empty String Bypass
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
# Passwords
|
|
41
|
+
if user_password == stored_hash: # What if stored_hash is ""?
|
|
42
|
+
|
|
43
|
+
# API keys
|
|
44
|
+
if api_key == config.api_key: # What if config is empty?
|
|
45
|
+
grant_access()
|
|
46
|
+
|
|
47
|
+
# The empty string equals the empty string
|
|
48
|
+
"" == "" # True - authentication bypassed
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Detection**: String comparisons for authentication without empty checks.
|
|
52
|
+
|
|
53
|
+
### Null as "Skip"
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// DANGEROUS: null means "skip verification"
|
|
57
|
+
function verifySignature(data, signature, publicKey) {
|
|
58
|
+
if (!publicKey) return true; // No key = trust everything?
|
|
59
|
+
return crypto.verify(data, signature, publicKey);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// DANGEROUS: null means "any value"
|
|
63
|
+
function checkRole(user, requiredRole) {
|
|
64
|
+
if (!requiredRole) return true; // No requirement = allow all?
|
|
65
|
+
return user.roles.includes(requiredRole);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Boolean Traps
|
|
70
|
+
|
|
71
|
+
### Security-Disabling Flags
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
# Every one of these has caused real vulnerabilities
|
|
75
|
+
verify_ssl: false
|
|
76
|
+
validate_certificate: false
|
|
77
|
+
check_signature: false
|
|
78
|
+
require_auth: false
|
|
79
|
+
enable_csrf_protection: false
|
|
80
|
+
sanitize_input: false
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Pattern**: Any boolean that disables a security control.
|
|
84
|
+
|
|
85
|
+
**The typo problem:**
|
|
86
|
+
```yaml
|
|
87
|
+
verify_ssl: fasle # Typo - what does the parser do?
|
|
88
|
+
verify_ssl: "false" # String "false" - truthy in many languages!
|
|
89
|
+
verify_ssl: 0 # Integer 0 - falsy, but is it valid?
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Double Negatives
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
# Confusing
|
|
96
|
+
disable_auth: false # Auth enabled? Let me re-read...
|
|
97
|
+
skip_validation: false # Validation runs? Think carefully...
|
|
98
|
+
|
|
99
|
+
# Clear
|
|
100
|
+
auth_enabled: true
|
|
101
|
+
validate_input: true
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Magic Values
|
|
105
|
+
|
|
106
|
+
### Sentinel Values in Security Parameters
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
# What do these mean?
|
|
110
|
+
max_retries: -1 # Infinite? Error? Use default?
|
|
111
|
+
cache_ttl: -1 # Never expire? Disabled?
|
|
112
|
+
timeout_seconds: -1 # Wait forever? Use system default?
|
|
113
|
+
|
|
114
|
+
# Real vulnerability: connection pool with max_connections: -1
|
|
115
|
+
# meant "unlimited" - enabled DoS via connection exhaustion
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Special String Values
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
# Dangerous patterns
|
|
122
|
+
allowed_origins: "*" # CORS wildcard
|
|
123
|
+
allowed_hosts: "any" # Bypass host validation
|
|
124
|
+
log_level: "none" # Disable security logging
|
|
125
|
+
password_policy: "disabled" # No password requirements
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Detection**: String configs that accept wildcards or "disable" keywords.
|
|
129
|
+
|
|
130
|
+
## Combination Hazards
|
|
131
|
+
|
|
132
|
+
### Conflicting Settings
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
# Both true - which wins?
|
|
136
|
+
require_authentication: true
|
|
137
|
+
allow_anonymous_access: true
|
|
138
|
+
|
|
139
|
+
# Both specified - conflict
|
|
140
|
+
session_cookie_secure: true
|
|
141
|
+
force_http: true # HTTP can't use Secure cookies
|
|
142
|
+
|
|
143
|
+
# Mutually exclusive
|
|
144
|
+
encryption_key: "..."
|
|
145
|
+
encryption_disabled: true
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Precedence Confusion
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
# In config file
|
|
152
|
+
verify_ssl: true
|
|
153
|
+
|
|
154
|
+
# But overrideable by environment?
|
|
155
|
+
VERIFY_SSL=false # Which wins?
|
|
156
|
+
|
|
157
|
+
# And command line?
|
|
158
|
+
--no-verify-ssl # Now there are three sources
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Fix**: Document precedence clearly; warn on conflicts; fail on contradictions.
|
|
162
|
+
|
|
163
|
+
## Environment Variable Hazards
|
|
164
|
+
|
|
165
|
+
### Sensitive Values in Environment
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Common but problematic
|
|
169
|
+
export DATABASE_PASSWORD="secret"
|
|
170
|
+
export API_KEY="sk_live_xxx"
|
|
171
|
+
|
|
172
|
+
# Risks:
|
|
173
|
+
# - Visible in process listings (ps aux)
|
|
174
|
+
# - Inherited by child processes
|
|
175
|
+
# - Logged in error dumps
|
|
176
|
+
# - Visible in container inspection
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Override Attacks
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
# Application trusts environment
|
|
183
|
+
debug = os.environ.get("DEBUG", "false") == "true"
|
|
184
|
+
|
|
185
|
+
# Attacker with environment access:
|
|
186
|
+
export DEBUG=true # Enables verbose logging of secrets
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Detection**: Security settings controllable via environment without validation.
|
|
190
|
+
|
|
191
|
+
## Path Traversal via Config
|
|
192
|
+
|
|
193
|
+
### Unrestricted Path Configuration
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
# User-controlled paths
|
|
197
|
+
log_file: "../../../etc/passwd"
|
|
198
|
+
upload_dir: "/etc/nginx/conf.d/"
|
|
199
|
+
template_dir: "../../../etc/shadow"
|
|
200
|
+
|
|
201
|
+
# Even "read-only" paths can leak secrets
|
|
202
|
+
config_include: "/etc/shadow"
|
|
203
|
+
certificate_file: "/proc/self/environ"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Fix**: Validate paths; restrict to allowed directories; resolve and check.
|
|
207
|
+
|
|
208
|
+
## Unvalidated Constructor Parameters
|
|
209
|
+
|
|
210
|
+
Configuration/parameter classes that accept security-relevant values without validation create "time bombs" - the insecure value is accepted silently at construction, then explodes later during use.
|
|
211
|
+
|
|
212
|
+
### Algorithm Selection Without Allowlist
|
|
213
|
+
|
|
214
|
+
```php
|
|
215
|
+
// DANGEROUS: Accepts any string including weak algorithms
|
|
216
|
+
readonly class ServerConfig {
|
|
217
|
+
public function __construct(
|
|
218
|
+
public string $hashAlgo = 'sha256', // Accepts 'md5', 'crc32', 'adler32'
|
|
219
|
+
public string $cipher = 'aes-256-gcm', // Accepts 'des', 'rc4'
|
|
220
|
+
) {}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Caller can pass insecure values:
|
|
224
|
+
new ServerConfig(hashAlgo: 'md5'); // Silently accepted!
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Detection**: Constructor parameters named `algo`, `algorithm`, `hash*`, `cipher`, `mode`, `*_type` that accept strings without validation.
|
|
228
|
+
|
|
229
|
+
**Fix**: Validate against an explicit allowlist at construction:
|
|
230
|
+
|
|
231
|
+
```php
|
|
232
|
+
public function __construct(public string $hashAlgo = 'sha256') {
|
|
233
|
+
if (!in_array($hashAlgo, ['sha256', 'sha384', 'sha512'], true)) {
|
|
234
|
+
throw new InvalidArgumentException("Disallowed hash algorithm: $hashAlgo");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Timing Parameters Without Bounds
|
|
240
|
+
|
|
241
|
+
```php
|
|
242
|
+
// DANGEROUS: No minimum or maximum bounds
|
|
243
|
+
readonly class AuthConfig {
|
|
244
|
+
public function __construct(
|
|
245
|
+
public int $otpLifetime = 120, // Accepts 0 (immediate expiry? infinite?)
|
|
246
|
+
public int $sessionTimeout = 3600, // Accepts -1 (what does this mean?)
|
|
247
|
+
public int $maxRetries = 5, // Accepts 0 (no retries? unlimited?)
|
|
248
|
+
) {}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// All of these are silently accepted:
|
|
252
|
+
new AuthConfig(otpLifetime: 0); // OTP always expired or never expires?
|
|
253
|
+
new AuthConfig(otpLifetime: 999999); // ~11 days - replay attacks!
|
|
254
|
+
new AuthConfig(maxRetries: -1); // Unlimited retries = brute force
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Detection**: Numeric constructor parameters for `*lifetime`, `*timeout`, `*ttl`, `*duration`, `max_*`, `min_*`, `*_seconds`, `*_attempts` without range validation.
|
|
258
|
+
|
|
259
|
+
**Fix**: Enforce both minimum AND maximum bounds:
|
|
260
|
+
|
|
261
|
+
```php
|
|
262
|
+
public function __construct(public int $otpLifetime = 120) {
|
|
263
|
+
if ($otpLifetime < 2) {
|
|
264
|
+
throw new InvalidArgumentException("OTP lifetime too short (min: 2 seconds)");
|
|
265
|
+
}
|
|
266
|
+
if ($otpLifetime > 300) {
|
|
267
|
+
throw new InvalidArgumentException("OTP lifetime too long (max: 300 seconds)");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Hostname/URL Parameters Without Validation
|
|
273
|
+
|
|
274
|
+
```php
|
|
275
|
+
// DANGEROUS: No format validation
|
|
276
|
+
readonly class NetworkConfig {
|
|
277
|
+
public function __construct(
|
|
278
|
+
public string $hostname = 'localhost', // Accepts anything
|
|
279
|
+
public string $callbackUrl = '', // Accepts malformed URLs
|
|
280
|
+
) {}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Silently accepted:
|
|
284
|
+
new NetworkConfig(hostname: '../../../etc/passwd');
|
|
285
|
+
new NetworkConfig(hostname: 'localhost; rm -rf /');
|
|
286
|
+
new NetworkConfig(callbackUrl: 'javascript:alert(1)');
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Detection**: String constructor parameters named `host`, `hostname`, `domain`, `*_url`, `*_uri`, `endpoint`, `callback*` without validation.
|
|
290
|
+
|
|
291
|
+
**Fix**: Validate format at construction:
|
|
292
|
+
|
|
293
|
+
```php
|
|
294
|
+
public function __construct(public string $hostname = 'localhost') {
|
|
295
|
+
if (!filter_var($hostname, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) {
|
|
296
|
+
throw new InvalidArgumentException("Invalid hostname: $hostname");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### The "Sensible Default" Trap
|
|
302
|
+
|
|
303
|
+
Having a secure default does NOT protect you - callers can override it:
|
|
304
|
+
|
|
305
|
+
```php
|
|
306
|
+
// Default is secure...
|
|
307
|
+
public function __construct(
|
|
308
|
+
public string $hashAlgo = 'sha256' // Good default!
|
|
309
|
+
) {}
|
|
310
|
+
|
|
311
|
+
// ...but callers can still shoot themselves
|
|
312
|
+
$config = new Config(hashAlgo: 'md5'); // Oops
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**The rule**: If a parameter affects security, validate it. Defaults only help developers who don't specify a value; validation protects everyone.
|
|
316
|
+
|
|
317
|
+
## Configuration Validation Checklist
|
|
318
|
+
|
|
319
|
+
For configuration schemas, verify:
|
|
320
|
+
|
|
321
|
+
- [ ] **Zero/empty rejected**: Numeric security params require positive values
|
|
322
|
+
- [ ] **No empty passwords/keys**: Empty string authentication forbidden
|
|
323
|
+
- [ ] **No security-disabling booleans**: Or require confirmation/separate config
|
|
324
|
+
- [ ] **No magic values**: -1 and wildcards have defined, safe meanings
|
|
325
|
+
- [ ] **Conflict detection**: Contradictory settings produce errors
|
|
326
|
+
- [ ] **Precedence documented**: Clear order when multiple sources exist
|
|
327
|
+
- [ ] **Path validation**: User-provided paths restricted to safe directories
|
|
328
|
+
- [ ] **Type strictness**: "false" string not silently converted to boolean
|
|
329
|
+
- [ ] **Deprecation warnings**: Insecure legacy options warn loudly
|
|
330
|
+
- [ ] **Algorithm allowlist**: Crypto algorithm params validated against safe options
|
|
331
|
+
- [ ] **Timing bounds**: Lifetime/timeout params have both min AND max limits
|
|
332
|
+
- [ ] **Hostname/URL validation**: Network addresses validated at construction
|
|
333
|
+
- [ ] **Constructor validation**: All security params validated, not just defaulted
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Cryptographic API Footguns
|
|
2
|
+
|
|
3
|
+
Detailed patterns for identifying misuse-prone cryptographic interfaces.
|
|
4
|
+
|
|
5
|
+
## Algorithm Selection Anti-Patterns
|
|
6
|
+
|
|
7
|
+
### The "alg" Header Attack (JWT)
|
|
8
|
+
|
|
9
|
+
The JSON Web Token standard allows the token itself to specify which algorithm to use for verification. This is catastrophically wrong.
|
|
10
|
+
|
|
11
|
+
**Attack 1: "none" algorithm**
|
|
12
|
+
```json
|
|
13
|
+
{"alg": "none", "typ": "JWT"}
|
|
14
|
+
```
|
|
15
|
+
Many libraries accept this and skip signature verification entirely.
|
|
16
|
+
|
|
17
|
+
**Attack 2: Algorithm confusion (RS256 → HS256)**
|
|
18
|
+
- Server expects RSA signature, uses public key for verification
|
|
19
|
+
- Attacker changes algorithm to HMAC, uses *public key* as HMAC secret
|
|
20
|
+
- Public key is public, so attacker can forge valid signatures
|
|
21
|
+
|
|
22
|
+
**Root cause**: Trusting untrusted input to select security mechanisms.
|
|
23
|
+
|
|
24
|
+
**Fix**: Never let data dictate algorithm. Use one algorithm, hardcoded.
|
|
25
|
+
|
|
26
|
+
### Cipher Mode Parameters
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
# DANGEROUS: mode is selectable
|
|
30
|
+
def encrypt(plaintext, key, mode="ECB"): # ECB is never correct
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
# BAD: accepts any OpenSSL cipher string
|
|
34
|
+
cipher = OpenSSL::Cipher.new(user_selected_cipher)
|
|
35
|
+
|
|
36
|
+
# GOOD: no parameters
|
|
37
|
+
def encrypt(plaintext, key): # internally uses AES-256-GCM
|
|
38
|
+
...
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Detection**: Parameters named `mode`, `cipher`, `algorithm`, `hash_type`
|
|
42
|
+
|
|
43
|
+
### Hash Algorithm Downgrade
|
|
44
|
+
|
|
45
|
+
```php
|
|
46
|
+
// PHP's hash() accepts ANY algorithm
|
|
47
|
+
hash("crc32", $password); // Valid call, terrible security
|
|
48
|
+
hash("md5", $password); // Valid call, broken security
|
|
49
|
+
hash("sha256", $password); // Valid call, still wrong for passwords
|
|
50
|
+
|
|
51
|
+
// Password functions limit choices
|
|
52
|
+
password_hash($password, PASSWORD_ARGON2ID); // Better
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Pattern**: APIs that accept algorithm as string instead of restricting to safe subset.
|
|
56
|
+
|
|
57
|
+
## Key/Nonce/IV Confusion
|
|
58
|
+
|
|
59
|
+
### Indistinguishable Byte Arrays
|
|
60
|
+
|
|
61
|
+
```go
|
|
62
|
+
// All three are just []byte - easy to swap
|
|
63
|
+
func Encrypt(plaintext, key, nonce []byte) []byte
|
|
64
|
+
|
|
65
|
+
// Easy mistakes:
|
|
66
|
+
Encrypt(plaintext, nonce, key) // Swapped - compiles fine
|
|
67
|
+
Encrypt(plaintext, key, key) // Reused key as nonce - compiles fine
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Fix**: Distinct types
|
|
71
|
+
|
|
72
|
+
```go
|
|
73
|
+
type EncryptionKey [32]byte
|
|
74
|
+
type Nonce [24]byte
|
|
75
|
+
|
|
76
|
+
func Encrypt(plaintext []byte, key EncryptionKey, nonce Nonce) []byte
|
|
77
|
+
// Now type system catches swaps
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Nonce Reuse
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
# DANGEROUS: nonce parameter with no guidance
|
|
84
|
+
def encrypt(plaintext, key, nonce):
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
# Developer "simplifies" by reusing:
|
|
88
|
+
nonce = b'\x00' * 12
|
|
89
|
+
encrypt(msg1, key, nonce)
|
|
90
|
+
encrypt(msg2, key, nonce) # Catastrophic with GCM/ChaCha
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Fix**: Generate nonces internally, return them with ciphertext.
|
|
94
|
+
|
|
95
|
+
## Comparison Footguns
|
|
96
|
+
|
|
97
|
+
### Timing-Safe vs. Regular Comparison
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
# These look identical but have different security properties
|
|
101
|
+
if computed_mac == expected_mac: # VULNERABLE: timing attack
|
|
102
|
+
if hmac.compare_digest(computed_mac, expected_mac): # Safe
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**The problem**: Developers don't know to use special comparison. Default string equality is vulnerable.
|
|
106
|
+
|
|
107
|
+
**Detection**: Direct equality checks on MACs, signatures, hashes, tokens.
|
|
108
|
+
|
|
109
|
+
### Boolean Confusion
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
# Signature verification APIs
|
|
113
|
+
result = verify(signature, message, key)
|
|
114
|
+
|
|
115
|
+
# Some return True/False
|
|
116
|
+
if verify(...): # Must check return value
|
|
117
|
+
|
|
118
|
+
# Some raise exceptions
|
|
119
|
+
verify(...) # Failure = exception, no return to check
|
|
120
|
+
|
|
121
|
+
# Developers mixing these up = vulnerabilities
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Padding Oracle Enablers
|
|
125
|
+
|
|
126
|
+
### Raw Decryption APIs
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
# DANGEROUS: returns plaintext even if padding invalid
|
|
130
|
+
def decrypt(ciphertext, key):
|
|
131
|
+
# ... decrypt ...
|
|
132
|
+
return unpad(plaintext) # Throws on bad padding
|
|
133
|
+
|
|
134
|
+
# Attacker can distinguish:
|
|
135
|
+
# - Valid padding → success
|
|
136
|
+
# - Invalid padding → exception
|
|
137
|
+
|
|
138
|
+
# This distinction enables padding oracle attacks
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Fix**: Decrypt-then-MAC (or authenticated encryption). Never expose padding validity.
|
|
142
|
+
|
|
143
|
+
### Error Message Differentiation
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
# DANGEROUS error messages
|
|
147
|
+
"Invalid padding" # Padding oracle signal
|
|
148
|
+
"MAC verification failed" # Different error = oracle
|
|
149
|
+
"Decryption failed" # Good: single error for all failures
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Key Derivation Footguns
|
|
153
|
+
|
|
154
|
+
### Using Hashes Instead of KDFs
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# DANGEROUS: hash is not a KDF
|
|
158
|
+
key = hashlib.sha256(password.encode()).digest()
|
|
159
|
+
|
|
160
|
+
# Developer reasoning: "SHA-256 is secure"
|
|
161
|
+
# Reality: Fast hash enables brute force
|
|
162
|
+
|
|
163
|
+
# CORRECT: use actual KDF
|
|
164
|
+
key = hashlib.scrypt(password.encode(), salt=salt, n=2**14, r=8, p=1)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Password Storage Misuse
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
# DANGEROUS: encryption is not password storage
|
|
171
|
+
encrypted_password = encrypt(password, master_key)
|
|
172
|
+
# Compromise of master_key = all passwords exposed
|
|
173
|
+
|
|
174
|
+
# CORRECT: one-way hash with salt
|
|
175
|
+
hashed_password = argon2.hash(password)
|
|
176
|
+
# No key to steal; each password salted differently
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Safe API Design Checklist
|
|
180
|
+
|
|
181
|
+
For cryptographic APIs, verify:
|
|
182
|
+
|
|
183
|
+
- [ ] **No algorithm selection**: One safe algorithm, hardcoded
|
|
184
|
+
- [ ] **No mode selection**: GCM/ChaCha20-Poly1305 only, no ECB/CBC
|
|
185
|
+
- [ ] **Distinct types**: Keys, nonces, ciphertexts are different types
|
|
186
|
+
- [ ] **Internal nonce generation**: Don't require developer to provide
|
|
187
|
+
- [ ] **Authenticated encryption**: Encrypt-then-MAC or AEAD built in
|
|
188
|
+
- [ ] **Constant-time comparison**: Default or only comparison method
|
|
189
|
+
- [ ] **Uniform errors**: Same error for all decryption failures
|
|
190
|
+
- [ ] **KDF for passwords**: Argon2/scrypt/bcrypt, not raw hashes
|