@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.
Files changed (371) hide show
  1. package/README.md +126 -0
  2. package/package.json +53 -0
  3. package/skills/1password/SKILL.md +70 -0
  4. package/skills/1password/references/cli-examples.md +29 -0
  5. package/skills/1password/references/get-started.md +17 -0
  6. package/skills/apple-notes/SKILL.md +77 -0
  7. package/skills/apple-reminders/SKILL.md +96 -0
  8. package/skills/bear-notes/SKILL.md +107 -0
  9. package/skills/bird/SKILL.md +224 -0
  10. package/skills/blogwatcher/SKILL.md +69 -0
  11. package/skills/blucli/SKILL.md +47 -0
  12. package/skills/bluebubbles/SKILL.md +131 -0
  13. package/skills/camsnap/SKILL.md +45 -0
  14. package/skills/canvas/SKILL.md +203 -0
  15. package/skills/clawhub/SKILL.md +77 -0
  16. package/skills/coding-agent/SKILL.md +284 -0
  17. package/skills/discord/SKILL.md +578 -0
  18. package/skills/eightctl/SKILL.md +50 -0
  19. package/skills/food-order/SKILL.md +48 -0
  20. package/skills/gemini/SKILL.md +43 -0
  21. package/skills/gifgrep/SKILL.md +79 -0
  22. package/skills/github/SKILL.md +77 -0
  23. package/skills/gog/SKILL.md +116 -0
  24. package/skills/goplaces/SKILL.md +52 -0
  25. package/skills/healthcheck/SKILL.md +245 -0
  26. package/skills/himalaya/SKILL.md +257 -0
  27. package/skills/himalaya/references/configuration.md +184 -0
  28. package/skills/himalaya/references/message-composition.md +199 -0
  29. package/skills/imsg/SKILL.md +74 -0
  30. package/skills/local-places/SERVER_README.md +101 -0
  31. package/skills/local-places/SKILL.md +102 -0
  32. package/skills/local-places/pyproject.toml +21 -0
  33. package/skills/local-places/src/local_places/__init__.py +2 -0
  34. package/skills/local-places/src/local_places/google_places.py +314 -0
  35. package/skills/local-places/src/local_places/main.py +65 -0
  36. package/skills/local-places/src/local_places/schemas.py +107 -0
  37. package/skills/mcporter/SKILL.md +61 -0
  38. package/skills/model-usage/SKILL.md +69 -0
  39. package/skills/model-usage/references/codexbar-cli.md +33 -0
  40. package/skills/model-usage/scripts/model_usage.py +310 -0
  41. package/skills/nano-banana-pro/SKILL.md +58 -0
  42. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  43. package/skills/nano-pdf/SKILL.md +38 -0
  44. package/skills/notion/SKILL.md +172 -0
  45. package/skills/obsidian/SKILL.md +81 -0
  46. package/skills/openai-image-gen/SKILL.md +89 -0
  47. package/skills/openai-image-gen/scripts/gen.py +240 -0
  48. package/skills/openai-whisper/SKILL.md +38 -0
  49. package/skills/openai-whisper-api/SKILL.md +52 -0
  50. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  51. package/skills/openhue/SKILL.md +51 -0
  52. package/skills/oracle/SKILL.md +125 -0
  53. package/skills/ordercli/SKILL.md +78 -0
  54. package/skills/peekaboo/SKILL.md +190 -0
  55. package/skills/sag/SKILL.md +87 -0
  56. package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
  57. package/skills/security-ask-questions-if-underspecified/README.md +24 -0
  58. package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
  59. package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
  60. package/skills/security-audit-context-building/README.md +58 -0
  61. package/skills/security-audit-context-building/commands/audit-context.md +21 -0
  62. package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
  63. package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
  64. package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
  65. package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
  66. package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
  67. package/skills/security-building-secure-contracts/README.md +241 -0
  68. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
  69. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
  70. package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
  71. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
  72. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
  73. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
  74. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
  75. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
  76. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
  77. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
  78. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
  79. package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
  80. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
  81. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
  82. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
  83. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
  84. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
  85. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
  86. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
  87. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
  88. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
  89. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
  90. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
  91. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
  92. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
  93. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
  94. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
  95. package/skills/security-burpsuite-project-parser/.claude-plugin/plugin.json +10 -0
  96. package/skills/security-burpsuite-project-parser/README.md +103 -0
  97. package/skills/security-burpsuite-project-parser/commands/burp-search.md +18 -0
  98. package/skills/security-burpsuite-project-parser/skills/SKILL.md +358 -0
  99. package/skills/security-burpsuite-project-parser/skills/scripts/burp-search.sh +99 -0
  100. package/skills/security-claude-in-chrome-troubleshooting/.claude-plugin/plugin.json +8 -0
  101. package/skills/security-claude-in-chrome-troubleshooting/README.md +31 -0
  102. package/skills/security-claude-in-chrome-troubleshooting/skills/claude-in-chrome-troubleshooting/SKILL.md +251 -0
  103. package/skills/security-constant-time-analysis/.claude-plugin/plugin.json +9 -0
  104. package/skills/security-constant-time-analysis/README.md +381 -0
  105. package/skills/security-constant-time-analysis/commands/ct-check.md +20 -0
  106. package/skills/security-constant-time-analysis/ct_analyzer/__init__.py +49 -0
  107. package/skills/security-constant-time-analysis/ct_analyzer/analyzer.py +1284 -0
  108. package/skills/security-constant-time-analysis/ct_analyzer/script_analyzers.py +3081 -0
  109. package/skills/security-constant-time-analysis/ct_analyzer/tests/__init__.py +1 -0
  110. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_analyzer.py +1397 -0
  111. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/bn_excerpt.js +205 -0
  112. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_constant_time.c +181 -0
  113. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c +74 -0
  114. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.go +78 -0
  115. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.rs +92 -0
  116. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.cs +174 -0
  117. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.java +161 -0
  118. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.kt +181 -0
  119. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.php +140 -0
  120. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.py +252 -0
  121. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.rb +188 -0
  122. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.swift +199 -0
  123. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.ts +154 -0
  124. package/skills/security-constant-time-analysis/pyproject.toml +52 -0
  125. package/skills/security-constant-time-analysis/skills/constant-time-analysis/README.md +90 -0
  126. package/skills/security-constant-time-analysis/skills/constant-time-analysis/SKILL.md +219 -0
  127. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/compiled.md +129 -0
  128. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/javascript.md +136 -0
  129. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md +252 -0
  130. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md +172 -0
  131. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md +179 -0
  132. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md +198 -0
  133. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md +288 -0
  134. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/vm-compiled.md +354 -0
  135. package/skills/security-constant-time-analysis/uv.lock +8 -0
  136. package/skills/security-culture-index/.claude-plugin/plugin.json +8 -0
  137. package/skills/security-culture-index/README.md +79 -0
  138. package/skills/security-culture-index/skills/interpreting-culture-index/SKILL.md +293 -0
  139. package/skills/security-culture-index/skills/interpreting-culture-index/references/anti-patterns.md +255 -0
  140. package/skills/security-culture-index/skills/interpreting-culture-index/references/conversation-starters.md +408 -0
  141. package/skills/security-culture-index/skills/interpreting-culture-index/references/interview-trait-signals.md +253 -0
  142. package/skills/security-culture-index/skills/interpreting-culture-index/references/motivators.md +158 -0
  143. package/skills/security-culture-index/skills/interpreting-culture-index/references/patterns-archetypes.md +147 -0
  144. package/skills/security-culture-index/skills/interpreting-culture-index/references/primary-traits.md +307 -0
  145. package/skills/security-culture-index/skills/interpreting-culture-index/references/secondary-traits.md +228 -0
  146. package/skills/security-culture-index/skills/interpreting-culture-index/references/team-composition.md +148 -0
  147. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/check_deps.py +108 -0
  148. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/__init__.py +20 -0
  149. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/constants.py +122 -0
  150. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/extract.py +187 -0
  151. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/models.py +16 -0
  152. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/opencv_extractor.py +520 -0
  153. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/extract_pdf.py +237 -0
  154. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/pyproject.toml +18 -0
  155. package/skills/security-culture-index/skills/interpreting-culture-index/templates/burnout-report.md +113 -0
  156. package/skills/security-culture-index/skills/interpreting-culture-index/templates/comparison-report.md +103 -0
  157. package/skills/security-culture-index/skills/interpreting-culture-index/templates/hiring-profile.md +127 -0
  158. package/skills/security-culture-index/skills/interpreting-culture-index/templates/individual-report.md +85 -0
  159. package/skills/security-culture-index/skills/interpreting-culture-index/templates/predicted-profile.md +165 -0
  160. package/skills/security-culture-index/skills/interpreting-culture-index/templates/team-report.md +109 -0
  161. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/analyze-team.md +188 -0
  162. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/coach-manager.md +267 -0
  163. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/compare-profiles.md +188 -0
  164. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/define-hiring-profile.md +220 -0
  165. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/detect-burnout.md +206 -0
  166. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/extract-from-pdf.md +121 -0
  167. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interpret-individual.md +183 -0
  168. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interview-debrief.md +234 -0
  169. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/mediate-conflict.md +306 -0
  170. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/plan-onboarding.md +322 -0
  171. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/predict-from-interview.md +250 -0
  172. package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
  173. package/skills/security-differential-review/README.md +109 -0
  174. package/skills/security-differential-review/commands/diff-review.md +21 -0
  175. package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
  176. package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
  177. package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
  178. package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
  179. package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
  180. package/skills/security-dwarf-expert/.claude-plugin/plugin.json +10 -0
  181. package/skills/security-dwarf-expert/README.md +38 -0
  182. package/skills/security-dwarf-expert/skills/dwarf-expert/SKILL.md +93 -0
  183. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/coding.md +31 -0
  184. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/dwarfdump.md +50 -0
  185. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/readelf.md +8 -0
  186. package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
  187. package/skills/security-entry-point-analyzer/README.md +74 -0
  188. package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
  189. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
  190. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
  191. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
  192. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
  193. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
  194. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
  195. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
  196. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
  197. package/skills/security-firebase-apk-scanner/.claude-plugin/plugin.json +10 -0
  198. package/skills/security-firebase-apk-scanner/README.md +85 -0
  199. package/skills/security-firebase-apk-scanner/commands/scan-apk.md +18 -0
  200. package/skills/security-firebase-apk-scanner/scanner.sh +1408 -0
  201. package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/SKILL.md +197 -0
  202. package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/references/vulnerabilities.md +803 -0
  203. package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
  204. package/skills/security-fix-review/README.md +118 -0
  205. package/skills/security-fix-review/commands/fix-review.md +24 -0
  206. package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
  207. package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
  208. package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
  209. package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
  210. package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
  211. package/skills/security-insecure-defaults/README.md +45 -0
  212. package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
  213. package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
  214. package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
  215. package/skills/security-modern-python/README.md +58 -0
  216. package/skills/security-modern-python/hooks/hooks.json +16 -0
  217. package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
  218. package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
  219. package/skills/security-modern-python/hooks/test_helper.bash +75 -0
  220. package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
  221. package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
  222. package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
  223. package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
  224. package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
  225. package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
  226. package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
  227. package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
  228. package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
  229. package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
  230. package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
  231. package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
  232. package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
  233. package/skills/security-property-based-testing/README.md +47 -0
  234. package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
  235. package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
  236. package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
  237. package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
  238. package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
  239. package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
  240. package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
  241. package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
  242. package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
  243. package/skills/semgrep-rule-creator/README.md +43 -0
  244. package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
  245. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
  246. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
  247. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
  248. package/skills/semgrep-rule-variant-creator/.claude-plugin/plugin.json +9 -0
  249. package/skills/semgrep-rule-variant-creator/README.md +86 -0
  250. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
  251. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
  252. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
  253. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
  254. package/skills/session-logs/SKILL.md +115 -0
  255. package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
  256. package/skills/sharp-edges/README.md +48 -0
  257. package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
  258. package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
  259. package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
  260. package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
  261. package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
  262. package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
  263. package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
  264. package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
  265. package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
  266. package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
  267. package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
  268. package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
  269. package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
  270. package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
  271. package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
  272. package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
  273. package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
  274. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  275. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  276. package/skills/skill-creator/SKILL.md +370 -0
  277. package/skills/skill-creator/license.txt +202 -0
  278. package/skills/skill-creator/scripts/init_skill.py +378 -0
  279. package/skills/skill-creator/scripts/package_skill.py +111 -0
  280. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  281. package/skills/slack/SKILL.md +144 -0
  282. package/skills/songsee/SKILL.md +49 -0
  283. package/skills/sonoscli/SKILL.md +46 -0
  284. package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
  285. package/skills/spec-to-code-compliance/README.md +67 -0
  286. package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
  287. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
  288. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
  289. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
  290. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
  291. package/skills/spotify-player/SKILL.md +64 -0
  292. package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
  293. package/skills/static-analysis/README.md +59 -0
  294. package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
  295. package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
  296. package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
  297. package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
  298. package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
  299. package/skills/summarize/SKILL.md +87 -0
  300. package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
  301. package/skills/testing-handbook-skills/README.md +241 -0
  302. package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
  303. package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
  304. package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
  305. package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
  306. package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
  307. package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
  308. package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
  309. package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
  310. package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
  311. package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
  312. package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
  313. package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
  314. package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
  315. package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
  316. package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
  317. package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
  318. package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
  319. package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
  320. package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
  321. package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
  322. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
  323. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
  324. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
  325. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
  326. package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
  327. package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
  328. package/skills/things-mac/SKILL.md +86 -0
  329. package/skills/tmux/SKILL.md +135 -0
  330. package/skills/tmux/scripts/find-sessions.sh +112 -0
  331. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  332. package/skills/trello/SKILL.md +95 -0
  333. package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
  334. package/skills/variant-analysis/README.md +41 -0
  335. package/skills/variant-analysis/commands/variants.md +23 -0
  336. package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
  337. package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
  338. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
  339. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
  340. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
  341. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
  342. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
  343. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
  344. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
  345. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
  346. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
  347. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
  348. package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
  349. package/skills/video-frames/SKILL.md +46 -0
  350. package/skills/video-frames/scripts/frame.sh +81 -0
  351. package/skills/voice-call/SKILL.md +45 -0
  352. package/skills/wacli/SKILL.md +72 -0
  353. package/skills/weather/SKILL.md +54 -0
  354. package/skills/yara-authoring/.claude-plugin/plugin.json +9 -0
  355. package/skills/yara-authoring/README.md +131 -0
  356. package/skills/yara-authoring/skills/yara-rule-authoring/SKILL.md +645 -0
  357. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Mac_ProtonRAT_Jan25.yar +99 -0
  358. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_NPM_SupplyChain_Jan25.yar +170 -0
  359. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Win_Remcos_Jan25.yar +103 -0
  360. package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_CRX_SuspiciousPermissions.yar +134 -0
  361. package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_JS_Obfuscation_Jan25.yar +185 -0
  362. package/skills/yara-authoring/skills/yara-rule-authoring/references/crx-module.md +214 -0
  363. package/skills/yara-authoring/skills/yara-rule-authoring/references/dex-module.md +383 -0
  364. package/skills/yara-authoring/skills/yara-rule-authoring/references/performance.md +333 -0
  365. package/skills/yara-authoring/skills/yara-rule-authoring/references/strings.md +433 -0
  366. package/skills/yara-authoring/skills/yara-rule-authoring/references/style-guide.md +257 -0
  367. package/skills/yara-authoring/skills/yara-rule-authoring/references/testing.md +399 -0
  368. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/atom_analyzer.py +526 -0
  369. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/pyproject.toml +25 -0
  370. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/yara_lint.py +631 -0
  371. package/skills/yara-authoring/skills/yara-rule-authoring/workflows/rule-development.md +493 -0
@@ -0,0 +1,614 @@
1
+ ---
2
+ name: harness-writing
3
+ type: technique
4
+ description: >
5
+ Techniques for writing effective fuzzing harnesses across languages.
6
+ Use when creating new fuzz targets or improving existing harness code.
7
+ ---
8
+
9
+ # Writing Fuzzing Harnesses
10
+
11
+ A fuzzing harness is the entrypoint function that receives random data from the fuzzer and routes it to your system under test (SUT). The quality of your harness directly determines which code paths get exercised and whether critical bugs are found. A poorly written harness can miss entire subsystems or produce non-reproducible crashes.
12
+
13
+ ## Overview
14
+
15
+ The harness is the bridge between the fuzzer's random byte generation and your application's API. It must parse raw bytes into meaningful inputs, call target functions, and handle edge cases gracefully. The most important part of any fuzzing setup is the harness—if written poorly, critical parts of your application may not be covered.
16
+
17
+ ### Key Concepts
18
+
19
+ | Concept | Description |
20
+ |---------|-------------|
21
+ | **Harness** | Function that receives fuzzer input and calls target code under test |
22
+ | **SUT** | System Under Test—the code being fuzzed |
23
+ | **Entry point** | Function signature required by the fuzzer (e.g., `LLVMFuzzerTestOneInput`) |
24
+ | **FuzzedDataProvider** | Helper class for structured extraction of typed data from raw bytes |
25
+ | **Determinism** | Property that ensures same input always produces same behavior |
26
+ | **Interleaved fuzzing** | Single harness that exercises multiple operations based on input |
27
+
28
+ ## When to Apply
29
+
30
+ **Apply this technique when:**
31
+ - Creating a new fuzz target for the first time
32
+ - Fuzz campaign has low code coverage or isn't finding bugs
33
+ - Crashes found during fuzzing are not reproducible
34
+ - Target API requires complex or structured inputs
35
+ - Multiple related functions should be tested together
36
+
37
+ **Skip this technique when:**
38
+ - Using existing well-tested harnesses from your project
39
+ - Tool provides automatic harness generation that meets your needs
40
+ - Target already has comprehensive fuzzing infrastructure
41
+
42
+ ## Quick Reference
43
+
44
+ | Task | Pattern |
45
+ |------|---------|
46
+ | Minimal C++ harness | `extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)` |
47
+ | Minimal Rust harness | `fuzz_target!(|data: &[u8]| { ... })` |
48
+ | Size validation | `if (size < MIN_SIZE) return 0;` |
49
+ | Cast to integers | `uint32_t val = *(uint32_t*)(data);` |
50
+ | Use FuzzedDataProvider | `FuzzedDataProvider fuzzed_data(data, size);` |
51
+ | Extract typed data (C++) | `auto val = fuzzed_data.ConsumeIntegral<uint32_t>();` |
52
+ | Extract string (C++) | `auto str = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);` |
53
+
54
+ ## Step-by-Step
55
+
56
+ ### Step 1: Identify Entry Points
57
+
58
+ Find functions in your codebase that:
59
+ - Accept external input (parsers, validators, protocol handlers)
60
+ - Parse complex data formats (JSON, XML, binary protocols)
61
+ - Perform security-critical operations (authentication, cryptography)
62
+ - Have high cyclomatic complexity or many branches
63
+
64
+ Good targets are typically:
65
+ - Protocol parsers
66
+ - File format parsers
67
+ - Serialization/deserialization functions
68
+ - Input validation routines
69
+
70
+ ### Step 2: Write Minimal Harness
71
+
72
+ Start with the simplest possible harness that calls your target function:
73
+
74
+ **C/C++:**
75
+ ```cpp
76
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
77
+ target_function(data, size);
78
+ return 0;
79
+ }
80
+ ```
81
+
82
+ **Rust:**
83
+ ```rust
84
+ #![no_main]
85
+ use libfuzzer_sys::fuzz_target;
86
+
87
+ fuzz_target!(|data: &[u8]| {
88
+ target_function(data);
89
+ });
90
+ ```
91
+
92
+ ### Step 3: Add Input Validation
93
+
94
+ Reject inputs that are too small or too large to be meaningful:
95
+
96
+ ```cpp
97
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
98
+ // Ensure minimum size for meaningful input
99
+ if (size < MIN_INPUT_SIZE || size > MAX_INPUT_SIZE) {
100
+ return 0;
101
+ }
102
+ target_function(data, size);
103
+ return 0;
104
+ }
105
+ ```
106
+
107
+ **Rationale:** The fuzzer generates random inputs of all sizes. Your harness must handle empty, tiny, huge, or malformed inputs without causing unexpected issues in the harness itself (crashes in the SUT are fine—that's what we're looking for).
108
+
109
+ ### Step 4: Structure the Input
110
+
111
+ For APIs that require typed data (integers, strings, etc.), use casting or helpers like `FuzzedDataProvider`:
112
+
113
+ **Simple casting:**
114
+ ```cpp
115
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
116
+ if (size != 2 * sizeof(uint32_t)) {
117
+ return 0;
118
+ }
119
+
120
+ uint32_t numerator = *(uint32_t*)(data);
121
+ uint32_t denominator = *(uint32_t*)(data + sizeof(uint32_t));
122
+
123
+ divide(numerator, denominator);
124
+ return 0;
125
+ }
126
+ ```
127
+
128
+ **Using FuzzedDataProvider:**
129
+ ```cpp
130
+ #include "FuzzedDataProvider.h"
131
+
132
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
133
+ FuzzedDataProvider fuzzed_data(data, size);
134
+
135
+ size_t allocation_size = fuzzed_data.ConsumeIntegral<size_t>();
136
+ std::vector<char> str1 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
137
+ std::vector<char> str2 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
138
+
139
+ concat(&str1[0], str1.size(), &str2[0], str2.size(), allocation_size);
140
+ return 0;
141
+ }
142
+ ```
143
+
144
+ ### Step 5: Test and Iterate
145
+
146
+ Run the fuzzer and monitor:
147
+ - Code coverage (are all interesting paths reached?)
148
+ - Executions per second (is it fast enough?)
149
+ - Crash reproducibility (can you reproduce crashes with saved inputs?)
150
+
151
+ Iterate on the harness to improve these metrics.
152
+
153
+ ## Common Patterns
154
+
155
+ ### Pattern: Beyond Byte Arrays—Casting to Integers
156
+
157
+ **Use Case:** When target expects primitive types like integers or floats
158
+
159
+ **Implementation:**
160
+ ```cpp
161
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
162
+ // Ensure exactly 2 4-byte numbers
163
+ if (size != 2 * sizeof(uint32_t)) {
164
+ return 0;
165
+ }
166
+
167
+ // Split input into two integers
168
+ uint32_t numerator = *(uint32_t*)(data);
169
+ uint32_t denominator = *(uint32_t*)(data + sizeof(uint32_t));
170
+
171
+ divide(numerator, denominator);
172
+ return 0;
173
+ }
174
+ ```
175
+
176
+ **Rust equivalent:**
177
+ ```rust
178
+ fuzz_target!(|data: &[u8]| {
179
+ if data.len() != 2 * std::mem::size_of::<i32>() {
180
+ return;
181
+ }
182
+
183
+ let numerator = i32::from_ne_bytes([data[0], data[1], data[2], data[3]]);
184
+ let denominator = i32::from_ne_bytes([data[4], data[5], data[6], data[7]]);
185
+
186
+ divide(numerator, denominator);
187
+ });
188
+ ```
189
+
190
+ **Why it works:** Any 8-byte input is valid. The fuzzer learns that inputs must be exactly 8 bytes, and every bit flip produces a new, potentially interesting input.
191
+
192
+ ### Pattern: FuzzedDataProvider for Complex Inputs
193
+
194
+ **Use Case:** When target requires multiple strings, integers, or variable-length data
195
+
196
+ **Implementation:**
197
+ ```cpp
198
+ #include "FuzzedDataProvider.h"
199
+
200
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
201
+ FuzzedDataProvider fuzzed_data(data, size);
202
+
203
+ // Extract different types of data
204
+ size_t allocation_size = fuzzed_data.ConsumeIntegral<size_t>();
205
+
206
+ // Consume variable-length strings with terminator
207
+ std::vector<char> str1 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
208
+ std::vector<char> str2 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
209
+
210
+ char* result = concat(&str1[0], str1.size(), &str2[0], str2.size(), allocation_size);
211
+ if (result != NULL) {
212
+ free(result);
213
+ }
214
+
215
+ return 0;
216
+ }
217
+ ```
218
+
219
+ **Why it helps:** `FuzzedDataProvider` handles the complexity of extracting structured data from a byte stream. It's particularly useful for APIs that need multiple parameters of different types.
220
+
221
+ ### Pattern: Interleaved Fuzzing
222
+
223
+ **Use Case:** When multiple related operations should be tested in a single harness
224
+
225
+ **Implementation:**
226
+ ```cpp
227
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
228
+ if (size < 1 + 2 * sizeof(int32_t)) {
229
+ return 0;
230
+ }
231
+
232
+ // First byte selects operation
233
+ uint8_t mode = data[0];
234
+
235
+ // Next bytes are operands
236
+ int32_t numbers[2];
237
+ memcpy(numbers, data + 1, 2 * sizeof(int32_t));
238
+
239
+ int32_t result = 0;
240
+ switch (mode % 4) {
241
+ case 0:
242
+ result = add(numbers[0], numbers[1]);
243
+ break;
244
+ case 1:
245
+ result = subtract(numbers[0], numbers[1]);
246
+ break;
247
+ case 2:
248
+ result = multiply(numbers[0], numbers[1]);
249
+ break;
250
+ case 3:
251
+ result = divide(numbers[0], numbers[1]);
252
+ break;
253
+ }
254
+
255
+ // Prevent compiler from optimizing away the calls
256
+ printf("%d", result);
257
+ return 0;
258
+ }
259
+ ```
260
+
261
+ **Advantages:**
262
+ - Faster to write one harness than multiple individual harnesses
263
+ - Single shared corpus means interesting inputs for one operation may be interesting for others
264
+ - Can discover bugs in interactions between operations
265
+
266
+ **When to use:**
267
+ - Operations share similar input types
268
+ - Operations are logically related (e.g., arithmetic operations, CRUD operations)
269
+ - Single corpus makes sense across all operations
270
+
271
+ ### Pattern: Structure-Aware Fuzzing with Arbitrary (Rust)
272
+
273
+ **Use Case:** When fuzzing Rust code that uses custom structs
274
+
275
+ **Implementation:**
276
+ ```rust
277
+ use arbitrary::Arbitrary;
278
+
279
+ #[derive(Debug, Arbitrary)]
280
+ pub struct Name {
281
+ data: String
282
+ }
283
+
284
+ impl Name {
285
+ pub fn check_buf(&self) {
286
+ let data = self.data.as_bytes();
287
+ if data.len() > 0 && data[0] == b'a' {
288
+ if data.len() > 1 && data[1] == b'b' {
289
+ if data.len() > 2 && data[2] == b'c' {
290
+ process::abort();
291
+ }
292
+ }
293
+ }
294
+ }
295
+ }
296
+ ```
297
+
298
+ **Harness with arbitrary:**
299
+ ```rust
300
+ #![no_main]
301
+ use libfuzzer_sys::fuzz_target;
302
+
303
+ fuzz_target!(|data: your_project::Name| {
304
+ data.check_buf();
305
+ });
306
+ ```
307
+
308
+ **Add to Cargo.toml:**
309
+ ```toml
310
+ [dependencies]
311
+ arbitrary = { version = "1", features = ["derive"] }
312
+ ```
313
+
314
+ **Why it helps:** The `arbitrary` crate automatically handles deserialization of raw bytes into your Rust structs, reducing boilerplate and ensuring valid struct construction.
315
+
316
+ **Limitation:** The arbitrary crate doesn't offer reverse serialization, so you can't manually construct byte arrays that map to specific structs. This works best when starting from an empty corpus (fine for libFuzzer, problematic for AFL++).
317
+
318
+ ## Advanced Usage
319
+
320
+ ### Tips and Tricks
321
+
322
+ | Tip | Why It Helps |
323
+ |-----|--------------|
324
+ | **Start with parsers** | High bug density, clear entry points, easy to harness |
325
+ | **Mock I/O operations** | Prevents hangs from blocking I/O, enables determinism |
326
+ | **Use FuzzedDataProvider** | Simplifies extraction of structured data from raw bytes |
327
+ | **Reset global state** | Ensures each iteration is independent and reproducible |
328
+ | **Free resources in harness** | Prevents memory exhaustion during long campaigns |
329
+ | **Avoid logging in harness** | Logging is slow—fuzzing needs 100s-1000s exec/sec |
330
+ | **Test harness manually first** | Run harness with known inputs before starting campaign |
331
+ | **Check coverage early** | Ensure harness reaches expected code paths |
332
+
333
+ ### Structure-Aware Fuzzing with Protocol Buffers
334
+
335
+ For highly structured input formats, consider using Protocol Buffers as an intermediate format with custom mutators:
336
+
337
+ ```cpp
338
+ // Define your input format in .proto file
339
+ // Use libprotobuf-mutator to generate valid mutations
340
+ // This ensures fuzzer mutates message contents, not the protobuf encoding itself
341
+ ```
342
+
343
+ This approach is more setup but prevents the fuzzer from wasting time on unparseable inputs. See [structure-aware fuzzing documentation](https://github.com/google/fuzzing/blob/master/docs/structure-aware-fuzzing.md) for details.
344
+
345
+ ### Handling Non-Determinism
346
+
347
+ **Problem:** Random values or timing dependencies cause non-reproducible crashes.
348
+
349
+ **Solutions:**
350
+ - Replace `rand()` with deterministic PRNG seeded from fuzzer input:
351
+ ```cpp
352
+ uint32_t seed = fuzzed_data.ConsumeIntegral<uint32_t>();
353
+ srand(seed);
354
+ ```
355
+ - Mock system calls that return time, PIDs, or random data
356
+ - Avoid reading from `/dev/random` or `/dev/urandom`
357
+
358
+ ### Resetting Global State
359
+
360
+ If your SUT uses global state (singletons, static variables), reset it between iterations:
361
+
362
+ ```cpp
363
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
364
+ // Reset global state before each iteration
365
+ global_reset();
366
+
367
+ target_function(data, size);
368
+
369
+ // Clean up resources
370
+ global_cleanup();
371
+ return 0;
372
+ }
373
+ ```
374
+
375
+ **Rationale:** Global state can cause crashes after N iterations rather than on a specific input, making bugs non-reproducible.
376
+
377
+ ## Practical Harness Rules
378
+
379
+ Follow these rules to ensure effective fuzzing harnesses:
380
+
381
+ | Rule | Rationale |
382
+ |------|-----------|
383
+ | **Handle all input sizes** | Fuzzer generates empty, tiny, huge inputs—harness must handle gracefully |
384
+ | **Never call `exit()`** | Calling `exit()` stops the fuzzer process. Use `abort()` in SUT if needed |
385
+ | **Join all threads** | Each iteration must run to completion before next iteration starts |
386
+ | **Be fast** | Aim for 100s-1000s executions/sec. Avoid logging, high complexity, excess memory |
387
+ | **Maintain determinism** | Same input must always produce same behavior for reproducibility |
388
+ | **Avoid global state** | Global state reduces reproducibility—reset between iterations if unavoidable |
389
+ | **Use narrow targets** | Don't fuzz PNG and TCP in same harness—different formats need separate targets |
390
+ | **Free resources** | Prevent memory leaks that cause resource exhaustion during long campaigns |
391
+
392
+ **Note:** These guidelines apply not just to harness code, but to the entire SUT. If the SUT violates these rules, consider patching it (see the fuzzing obstacles technique).
393
+
394
+ ## Anti-Patterns
395
+
396
+ | Anti-Pattern | Problem | Correct Approach |
397
+ |--------------|---------|------------------|
398
+ | **Global state without reset** | Non-deterministic crashes | Reset all globals at start of harness |
399
+ | **Blocking I/O or network calls** | Hangs fuzzer, wastes time | Mock I/O, use in-memory buffers |
400
+ | **Memory leaks in harness** | Resource exhaustion kills campaign | Free all allocations before returning |
401
+ | **Calling `exit()` in SUT** | Stops entire fuzzing process | Use `abort()` or return error codes |
402
+ | **Heavy logging in harness** | Reduces exec/sec by orders of magnitude | Disable logging during fuzzing |
403
+ | **Too many operations per iteration** | Slows down fuzzer | Keep iterations fast and focused |
404
+ | **Mixing unrelated input formats** | Corpus entries not useful across formats | Separate harnesses for different formats |
405
+ | **Not validating input size** | Harness crashes on edge cases | Check `size` before accessing `data` |
406
+
407
+ ## Tool-Specific Guidance
408
+
409
+ ### libFuzzer
410
+
411
+ **Harness signature:**
412
+ ```cpp
413
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
414
+ // Your code here
415
+ return 0; // Non-zero return is reserved for future use
416
+ }
417
+ ```
418
+
419
+ **Compilation:**
420
+ ```bash
421
+ clang++ -fsanitize=fuzzer,address -g harness.cc -o fuzz_target
422
+ ```
423
+
424
+ **Integration tips:**
425
+ - Use `FuzzedDataProvider.h` for structured input extraction
426
+ - Compile with `-fsanitize=fuzzer` to link the fuzzing runtime
427
+ - Add sanitizers (`-fsanitize=address,undefined`) to detect more bugs
428
+ - Use `-g` for better stack traces when crashes occur
429
+ - libFuzzer can start with empty corpus—no seed inputs required
430
+
431
+ **Running:**
432
+ ```bash
433
+ ./fuzz_target corpus_dir/
434
+ ```
435
+
436
+ **Resources:**
437
+ - [FuzzedDataProvider header](https://github.com/llvm/llvm-project/blob/main/compiler-rt/include/fuzzer/FuzzedDataProvider.h)
438
+ - [libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html)
439
+
440
+ ### AFL++
441
+
442
+ AFL++ supports multiple harness styles. For best performance, use persistent mode:
443
+
444
+ **Persistent mode harness:**
445
+ ```cpp
446
+ #include <unistd.h>
447
+
448
+ int main(int argc, char **argv) {
449
+ #ifdef __AFL_HAVE_MANUAL_CONTROL
450
+ __AFL_INIT();
451
+ #endif
452
+
453
+ unsigned char buf[MAX_SIZE];
454
+
455
+ while (__AFL_LOOP(10000)) {
456
+ // Read input from stdin
457
+ ssize_t len = read(0, buf, sizeof(buf));
458
+ if (len <= 0) break;
459
+
460
+ // Call target function
461
+ target_function(buf, len);
462
+ }
463
+
464
+ return 0;
465
+ }
466
+ ```
467
+
468
+ **Compilation:**
469
+ ```bash
470
+ afl-clang-fast++ -g harness.cc -o fuzz_target
471
+ ```
472
+
473
+ **Integration tips:**
474
+ - Use persistent mode (`__AFL_LOOP`) for 10-100x speedup
475
+ - Consider deferred initialization (`__AFL_INIT()`) to skip setup overhead
476
+ - AFL++ requires at least one seed input in the corpus directory
477
+ - Use `AFL_USE_ASAN=1` or `AFL_USE_UBSAN=1` for sanitizer builds
478
+
479
+ **Running:**
480
+ ```bash
481
+ afl-fuzz -i seeds/ -o findings/ -- ./fuzz_target
482
+ ```
483
+
484
+ ### cargo-fuzz (Rust)
485
+
486
+ **Harness signature:**
487
+ ```rust
488
+ #![no_main]
489
+ use libfuzzer_sys::fuzz_target;
490
+
491
+ fuzz_target!(|data: &[u8]| {
492
+ // Your code here
493
+ });
494
+ ```
495
+
496
+ **With structured input (arbitrary crate):**
497
+ ```rust
498
+ #![no_main]
499
+ use libfuzzer_sys::fuzz_target;
500
+
501
+ fuzz_target!(|data: YourStruct| {
502
+ data.check();
503
+ });
504
+ ```
505
+
506
+ **Creating harness:**
507
+ ```bash
508
+ cargo fuzz init
509
+ cargo fuzz add my_target
510
+ ```
511
+
512
+ **Integration tips:**
513
+ - Use `arbitrary` crate for automatic struct deserialization
514
+ - cargo-fuzz wraps libFuzzer, so all libFuzzer features work
515
+ - Compile with sanitizers automatically via cargo-fuzz
516
+ - Harnesses go in `fuzz/fuzz_targets/` directory
517
+
518
+ **Running:**
519
+ ```bash
520
+ cargo +nightly fuzz run my_target
521
+ ```
522
+
523
+ **Resources:**
524
+ - [cargo-fuzz documentation](https://rust-fuzz.github.io/book/cargo-fuzz.html)
525
+ - [arbitrary crate](https://github.com/rust-fuzz/arbitrary)
526
+
527
+ ### go-fuzz
528
+
529
+ **Harness signature:**
530
+ ```go
531
+ // +build gofuzz
532
+
533
+ package mypackage
534
+
535
+ func Fuzz(data []byte) int {
536
+ // Call target function
537
+ target(data)
538
+
539
+ // Return codes:
540
+ // -1 if input is invalid
541
+ // 0 if input is valid but not interesting
542
+ // 1 if input is interesting (e.g., added new coverage)
543
+ return 0
544
+ }
545
+ ```
546
+
547
+ **Building:**
548
+ ```bash
549
+ go-fuzz-build
550
+ ```
551
+
552
+ **Integration tips:**
553
+ - Return 1 for inputs that add coverage (optional—fuzzer can detect automatically)
554
+ - Return -1 for invalid inputs to deprioritize similar mutations
555
+ - go-fuzz handles persistence automatically
556
+
557
+ **Running:**
558
+ ```bash
559
+ go-fuzz -bin=./mypackage-fuzz.zip -workdir=fuzz
560
+ ```
561
+
562
+ ## Troubleshooting
563
+
564
+ | Issue | Cause | Solution |
565
+ |-------|-------|----------|
566
+ | **Low executions/sec** | Harness is too slow (logging, I/O, complexity) | Profile harness, remove bottlenecks, mock I/O |
567
+ | **No crashes found** | Coverage not reaching buggy code | Check coverage, improve harness to reach more paths |
568
+ | **Non-reproducible crashes** | Non-determinism or global state | Remove randomness, reset globals between iterations |
569
+ | **Fuzzer exits immediately** | Harness calls `exit()` | Replace `exit()` with `abort()` or return error |
570
+ | **Out of memory errors** | Memory leaks in harness or SUT | Free allocations, use leak sanitizer to find leaks |
571
+ | **Crashes on empty input** | Harness doesn't validate size | Add `if (size < MIN_SIZE) return 0;` |
572
+ | **Corpus not growing** | Inputs too constrained or format too strict | Use FuzzedDataProvider or structure-aware fuzzing |
573
+
574
+ ## Related Skills
575
+
576
+ ### Tools That Use This Technique
577
+
578
+ | Skill | How It Applies |
579
+ |-------|----------------|
580
+ | **libfuzzer** | Uses `LLVMFuzzerTestOneInput` harness signature with FuzzedDataProvider |
581
+ | **aflpp** | Supports persistent mode harnesses with `__AFL_LOOP` for performance |
582
+ | **cargo-fuzz** | Uses Rust-specific `fuzz_target!` macro with arbitrary crate integration |
583
+ | **atheris** | Python harness takes bytes, calls Python functions |
584
+ | **ossfuzz** | Requires harnesses in specific directory structure for cloud fuzzing |
585
+
586
+ ### Related Techniques
587
+
588
+ | Skill | Relationship |
589
+ |-------|--------------|
590
+ | **coverage-analysis** | Measure harness effectiveness—are you reaching target code? |
591
+ | **address-sanitizer** | Detects bugs found by harness (buffer overflows, use-after-free) |
592
+ | **fuzzing-dictionary** | Provide tokens to help fuzzer pass format checks in harness |
593
+ | **fuzzing-obstacles** | Patch SUT when it violates harness rules (exit, non-determinism) |
594
+
595
+ ## Resources
596
+
597
+ ### Key External Resources
598
+
599
+ **[Split Inputs in libFuzzer - Google Fuzzing Docs](https://github.com/google/fuzzing/blob/master/docs/split-inputs.md)**
600
+ Explains techniques for handling multiple input parameters in a single fuzzing harness, including use of magic separators and FuzzedDataProvider.
601
+
602
+ **[Structure-Aware Fuzzing with Protocol Buffers](https://github.com/google/fuzzing/blob/master/docs/structure-aware-fuzzing.md)**
603
+ Advanced technique using protobuf as intermediate format with custom mutators to ensure fuzzer mutates message contents rather than format encoding.
604
+
605
+ **[libFuzzer Documentation](https://llvm.org/docs/LibFuzzer.html)**
606
+ Official LLVM documentation covering harness requirements, best practices, and advanced features.
607
+
608
+ **[cargo-fuzz Book](https://rust-fuzz.github.io/book/cargo-fuzz.html)**
609
+ Comprehensive guide to writing Rust fuzzing harnesses with cargo-fuzz and the arbitrary crate.
610
+
611
+ ### Video Resources
612
+
613
+ - [Effective File Format Fuzzing](https://www.youtube.com/watch?v=qTTwqFRD1H8) - Conference talk on writing harnesses for file format parsers
614
+ - [Modern Fuzzing of C/C++ Projects](https://www.youtube.com/watch?v=x0FQkAPokfE) - Tutorial covering harness design patterns