前言¶
給 DSH 智能體做接口安全測試時,手工驗證越權或邏輯漏洞最貴的兩步,不是「發一個包」,而是構造對照請求、再判定響應差異。rannyrjjy/dsh-fuzz 把這兩步自動化:它在 diffprobe 包引擎之上做差分 fuzz 與邏輯測試,流程固定爲抽值 → 計劃 → 執行 → 判定,默認只讀。下面介紹它的能力、安裝方式和用法。
這是什麼¶
插件維護者是 rannyrjjy,GitHub 1 stars,社區目錄分類爲工作流。插件只註冊一個 DSH Host 工具 fuzz,負責參數映射與子進程編排;所有請求始終由 engine/diffprobe 執行,沒有第二個請求引擎。計劃、種子、原始請求與響應都落盤,不進入對話歷史。
它堅持三條判定紀律:
- 基線可比:每條 payload 都帶 baseline 與同類型對照,避免把「長度不同」當成洞。
- 差異不等於漏洞:區分傳輸層差異、錯誤分支(
errorCode/errorMsg)與真正值得回讀的狀態或數據變化(ownerId/role/status/amount等)。 - 可複覈:
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 開發者和安全測試流程。三點要注意:
- 默認只讀:
POST/PUT/PATCH/DELETE必須顯式allowWrite: true。破壞性載荷拒絕、限速、命中防護即停全部由 diffprobe 執行,計劃層不能繞過。 - 證據落盤在
<workspace>/<evidenceRoot>/<target>/evidence/fuzz/或<workspace>/.dsh-fuzz/runs/;靶標鑑權材料(Cookie/Token)只出現在你傳入的原始請求裏,插件不做持久化。 - 已知限制:
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