fuzz.yml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. name: Fuzz
  2. on:
  3. schedule:
  4. - cron: "0 2 * * *" # Daily at 2am UTC
  5. workflow_dispatch: # Allow manual trigger
  6. # Cancel previous runs on same ref
  7. concurrency:
  8. group: ${{ github.workflow }}-${{ github.ref }}
  9. cancel-in-progress: true
  10. env:
  11. CARGO_TERM_COLOR: always
  12. permissions:
  13. contents: read
  14. jobs:
  15. # Group A: Runs on Machine A (fuzz-a labeled runners)
  16. fuzz-group-a:
  17. name: "Fuzz A: ${{ matrix.target }}"
  18. runs-on: [self-hosted, fuzz-a]
  19. timeout-minutes: 90
  20. strategy:
  21. fail-fast: false
  22. max-parallel: 4
  23. matrix:
  24. target:
  25. - fuzz_token
  26. - fuzz_payment_request
  27. - fuzz_secret
  28. - fuzz_mint_url
  29. - fuzz_keyset_id
  30. - fuzz_proof
  31. - fuzz_blind_signature
  32. - fuzz_amount
  33. - fuzz_dleq
  34. steps:
  35. - name: Checkout
  36. uses: actions/checkout@v4
  37. - name: Setup Cachix
  38. uses: cachix/cachix-action@v16
  39. with:
  40. name: cashudevkit
  41. authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
  42. useDaemon: false
  43. continue-on-error: true
  44. - name: Fuzz ${{ matrix.target }}
  45. run: nix develop -i -L .#nightly --command just fuzz ${{ matrix.target }} 3600 4
  46. - name: Create Security Advisory on crash
  47. if: failure()
  48. env:
  49. GH_TOKEN: ${{ secrets.SECURITY_ADVISORY_TOKEN }}
  50. run: |
  51. TARGET="${{ matrix.target }}"
  52. ARTIFACT_DIR="fuzz/artifacts/$TARGET"
  53. if [ -d "$ARTIFACT_DIR" ] && [ "$(ls -A $ARTIFACT_DIR 2>/dev/null)" ]; then
  54. ARTIFACT_DATA=$(tar czf - "$ARTIFACT_DIR" | base64 -w0)
  55. gh api repos/${{ github.repository }}/security-advisories \
  56. --method POST \
  57. -f summary="[Fuzzing] Crash in $TARGET" \
  58. -f description="Automated fuzzing found a crash in \`$TARGET\`.
  59. **Workflow Run:** ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
  60. **Commit:** ${{ github.sha }}
  61. ## Crash Artifact (base64 tar.gz)
  62. \`\`\`
  63. $ARTIFACT_DATA
  64. \`\`\`
  65. ## To reproduce locally
  66. 1. Decode: \`echo '<base64-data>' | base64 -d > crash.tar.gz && tar xzf crash.tar.gz\`
  67. 2. Run: \`cargo fuzz run $TARGET fuzz/artifacts/$TARGET/<crash-file>\`" \
  68. -f severity="low" \
  69. -f "vulnerabilities[0][package][ecosystem]=other" \
  70. -f "vulnerabilities[0][package][name]=cdk"
  71. fi
  72. # Group B: Runs on Machine B (fuzz-b labeled runners)
  73. fuzz-group-b:
  74. name: "Fuzz B: ${{ matrix.target }}"
  75. runs-on: [self-hosted, fuzz-b]
  76. timeout-minutes: 90
  77. strategy:
  78. fail-fast: false
  79. max-parallel: 4
  80. matrix:
  81. target:
  82. - fuzz_currency_unit
  83. - fuzz_spending_conditions
  84. - fuzz_htlc_witness
  85. - fuzz_token_raw_bytes
  86. - fuzz_p2pk_witness
  87. - fuzz_witness
  88. - fuzz_swap_request
  89. - fuzz_melt_request
  90. steps:
  91. - name: Checkout
  92. uses: actions/checkout@v4
  93. - name: Setup Cachix
  94. uses: cachix/cachix-action@v16
  95. with:
  96. name: cashudevkit
  97. authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
  98. useDaemon: false
  99. continue-on-error: true
  100. - name: Fuzz ${{ matrix.target }}
  101. run: nix develop -i -L .#nightly --command just fuzz ${{ matrix.target }} 3600 4
  102. - name: Create Security Advisory on crash
  103. if: failure()
  104. env:
  105. GH_TOKEN: ${{ secrets.SECURITY_ADVISORY_TOKEN }}
  106. run: |
  107. TARGET="${{ matrix.target }}"
  108. ARTIFACT_DIR="fuzz/artifacts/$TARGET"
  109. if [ -d "$ARTIFACT_DIR" ] && [ "$(ls -A $ARTIFACT_DIR 2>/dev/null)" ]; then
  110. ARTIFACT_DATA=$(tar czf - "$ARTIFACT_DIR" | base64 -w0)
  111. gh api repos/${{ github.repository }}/security-advisories \
  112. --method POST \
  113. -f summary="[Fuzzing] Crash in $TARGET" \
  114. -f description="Automated fuzzing found a crash in \`$TARGET\`.
  115. **Workflow Run:** ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
  116. **Commit:** ${{ github.sha }}
  117. ## Crash Artifact (base64 tar.gz)
  118. \`\`\`
  119. $ARTIFACT_DATA
  120. \`\`\`
  121. ## To reproduce locally
  122. 1. Decode: \`echo '<base64-data>' | base64 -d > crash.tar.gz && tar xzf crash.tar.gz\`
  123. 2. Run: \`cargo fuzz run $TARGET fuzz/artifacts/$TARGET/<crash-file>\`" \
  124. -f severity="low" \
  125. -f "vulnerabilities[0][package][ecosystem]=other" \
  126. -f "vulnerabilities[0][package][name]=cdk"
  127. fi