dsh-fuzz:在 diffprobe 之上做差分 fuzz 與邏輯測試

前言

給 DSH 智能體做接口安全測試時,手工驗證越權或邏輯漏洞最貴的兩步,不是「發一個包」,而是構造對照請求、再判定響應差異。rannyrjjy/dsh-fuzz 把這兩步自動化:它在 diffprobe 包引擎之上做差分 fuzz 與邏輯測試,流程固定爲抽值 → 計劃 → 執行 → 判定,默認只讀。下面介紹它的能力、安裝方式和用法。

這是什麼

插件維護者是 rannyrjjy,GitHub 1 stars,社區目錄分類爲工作流。插件只註冊一個 DSH Host 工具 fuzz,負責參數映射與子進程編排;所有請求始終由 engine/diffprobe 執行,沒有第二個請求引擎。計劃、種子、原始請求與響應都落盤,不進入對話歷史。

它堅持三條判定紀律:

  1. 基線可比:每條 payload 都帶 baseline 與同類型對照,避免把「長度不同」當成洞。
  2. 差異不等於漏洞:區分傳輸層差異、錯誤分支(errorCode/errorMsg)與真正值得回讀的狀態或數據變化(ownerId/role/status/amount 等)。
  3. 可複覈:run 產出 diffs.csv,verify 產出 state.csv,verdict 只做分類,證據留在工作區。

注意事項:該插件僅用於已授權的滲透測試、CTF/靶場和自有系統評估。

環境要求

- Node.js 22.19+(或 24+)
- Python 3.9+,python / python3 在 PATH 中
- DeepSeek Harness(支持 bundle 插件 / Host 工具)

插件是純 JS + Python,無構建步驟。

安裝與啓用

# --profile 是必填項:把 <profile> 換成你的 profile 名(桌面版通常爲 desktop)
# 1) 從 GitHub 安裝(公開倉庫)
dsh plugin --profile <profile> add github:rannyrjjy/dsh-fuzz

# 2) 本地安裝(git clone / 解壓後,把 <plugin-dir> 換成絕對路徑)
dsh plugin --profile <profile> add file:<plugin-dir>

本地路徑寫法隨平臺:Windows 用 file:D:\tools\dsh-fuzz,macOS/Linux 用 file:/opt/dsh-fuzz。安裝後重啓 DeepSeek Harness(或讓插件管理器重載 profile),工具列表會出現 fuzz。

更新:

dsh plugin --profile <profile> update dsh-fuzz
# 或 remove 後重新 add
dsh plugin --profile <profile> remove dsh-fuzz
dsh plugin --profile <profile> add github:rannyrjjy/dsh-fuzz

配置

默認值在 index.js 裏解析,不配置也能用。需要覆蓋時,在 DSH patch 層加一段 dsh-fuzz:

- insert:
    - id: dsh-fuzz
      name: dsh-fuzz
      config:
        workspaceDir: /path/to/workspace   # 建議顯式配置:證據、@file、diffprobe cwd 的根
        pythonPath: python3                # Windows 上默認 python
        evidenceRoot: evidence             # 證據目錄名,默認「漏洞記錄」
        timeoutMs: 300000

Windows 路徑寫 C:/work/pentest 或 C:\\work\\pentest 均可。

鍵 默認 說明
workspaceDir DSH Host 當前目錄(或 DSH_FUZZ_WORKSPACE) 工作區根;@file 相對路徑、diffprobe 的 cwd、證據目錄都基於它
pythonPath python(Windows)/ python3 Python 解釋器
enginePath <插件目錄>/engine/fuzz/fuzz_ops.py 引擎入口,可指向另一份引擎
evidenceRoot 漏洞記錄 證據目錄名,位於 workspaceDir 下,可改成任意名字
timeoutMs 300000 單次子進程超時(毫秒)

引擎也接受環境變量(插件會自動注入前三個):

變量 作用
DSH_FUZZ_WORKSPACE 同 workspaceDir
DSH_FUZZ_EVIDENCE_DIR 同 evidenceRoot
DSH_FUZZ_STATE plans/seeds/runs 的落盤位置,默認 <workspace>/.dsh-fuzz
DSH_FUZZ_ENGINE 含 diffprobe/ 與 payloadsets/ 的引擎根

fuzz 工具

插件只暴露一個工具,六個 action:

action 做什麼 是否發包
harvest 從回包抽帶類型的值(id/uuid/phone/token/email/金額等)與字段名,生成 seeds.json 否
plan 生成 diffprobe 計劃(見下表 kind),帶 baseline + 同類型對照,可選 verify 否(dryRun 僅校驗)
run 調 diffprobe 執行計劃,限速、命中 403/429/503 即停;寫方法需 allowWrite 是
verdict 讀 diffs.csv/state.csv 分類 否
doctor 檢查 Python、引擎、payloadsets 是否齊備 否
bizmap 讀寫 <workspace>/<evidenceRoot>/<target>/fuzz-bizmap.json 目標業務地圖 否

plan kind

kind 用途
chain 把別的接口返回值移植到目標參數位(BOLA/引用鏈)
idor 鄰號/對照/他人 ID,配 verify 回讀 owner 字段
massassign JSON body 追加 role/isAdmin/tenantId 等,回讀是否持久化
role / tenant / amount 角色、租戶、金額字段候選
param 追加隱藏參數名
bypass 路徑段歸一化繞過(%61dmin、admin/、admin/..;/、..%2f 等)
sqli xss ssrf lfi ssti cmdi xxe 複用 engine/payloadsets/ 的經典類載荷

判定口徑

類別 含義
DIFFERENTIAL 引擎判差分,或語義層判 DIFF
INVALID 基線自身不可達——結論是無效,不是「無差分」
BLOCKED 命中防護(403/429/503 等)
STATE_CHANGED verify 回讀的 JSON path 真的變了
NO_SIGNAL 其餘

差分再按「變了什麼」分級:state-or-data(ownerId/userId/role/status/amount 等)值得擴大樣本;error-channel(只變 errorCode/errorMsg)只是錯誤分支或防護層,不要當洞。

典型用法

Windows 用 python,macOS/Linux 用 python3。在倉庫根目錄執行三步離線自檢(示例 spec 不含真實目標,不聯網、不發包):

# 1) 環境自檢
python engine/fuzz/fuzz_ops.py --spec examples/doctor.json

# 2) 從示例回包抽值(不聯網)
python engine/fuzz/fuzz_ops.py --spec examples/harvest.json

# 3) 生成 idor 計劃並 dry-run(不聯網、不發包)
python engine/fuzz/fuzz_ops.py --spec examples/plan-idor.json

引擎另有離線自檢服務,只監聽 127.0.0.1,用來驗證差分判定邏輯本身,不產生外網請求:

python engine/diffprobe/selftest_server.py

目錄結構

dsh-fuzz/
├─ index.js                  # DSH 插件:註冊 fuzz 工具,轉發到引擎
├─ cordis.patch.yml          # bundle patch(一行 insert)
├─ engine/
│  ├─ fuzz/                  # fuzz_ops.py(計劃/執行/判定)、fuzz_verify.py(狀態回讀)、bench_verdict.py(判定迴歸)
│  ├─ diffprobe/             # 請求執行引擎:限速、破壞性載荷閘門、差分與語義比對
│  └─ payloadsets/           # 共享載荷集(sqli/xss/idor/logic_*/fuzz_params 等)
├─ examples/                 # 不含真實目標的示例 spec
└─ locale/                   # 插件標題與描述

適用場景與注意

適合需要在已授權環境裏對 API 做越權、邏輯漏洞差分驗證的 DSH 開發者和安全測試流程。三點要注意:

  1. 默認只讀:POST/PUT/PATCH/DELETE 必須顯式 allowWrite: true。破壞性載荷拒絕、限速、命中防護即停全部由 diffprobe 執行,計劃層不能繞過。
  2. 證據落盤在 <workspace>/<evidenceRoot>/<target>/evidence/fuzz/ 或 <workspace>/.dsh-fuzz/runs/;靶標鑑權材料(Cookie/Token)只出現在你傳入的原始請求裏,插件不做持久化。
  3. 已知限制:race 併發與 state 狀態機生成尚未實現(schema 已留位),當前 run 會跳過 kind=race 計劃;verify 是「一批跑完再回讀」,對單值計劃有效,連續寫 payload 是累計狀態,需要逐 payload 隔離時請拆計劃。

插件以當前 dsh 進程權限運行,安裝前應檢查插件源碼與許可證(MIT)。當前版本爲 0.1.2,要求 DSH >=0.2.0-rc.2 || >=0.2.1-rc.2 || >=0.2.2-rc.1。

目錄頁與源碼:

  • 社區目錄:https://www.skillhub.cn/plugins/rannyrjjy/dsh-fuzz
  • GitHub:https://github.com/rannyrjjy/dsh-fuzz
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜