# dsh-daiyi-aimy-skill

简体中文 · English · 繁體中文 · 日本語

License Node DSH dependencies upstream

> **為 DeepSeek Harness 提供「授權範圍內」的偵察與 Web 弱點偵測能力:8 個原生工具 + 8 個技能,預設拒絕,只做偵測。** `dsh-daiyi-aimy-skill` 是 [zxz0119/aimy-sikll](https://github.com/zxz0119/aimy-sikll)(Python CLI,v2.0.0)的 **DeepSeek Harness(DSH)Cordis 外掛**再開發版。它把上游的命令列腳本改造成宿主內常駐的原生工具,並加上了上游沒有的**授權範圍護欄**:沒有登記授權範圍時,任何網路工具都不會執行。 - 形態:ESM Cordis 外掛,執行時**零第三方相依套件**(只用 `node:` 內建模組)。 - 宿主:DSH `>=0.2.0-rc.1 <0.3.0`;Node `^22.19 || >=24`。 - 版本:`3.0.0`,MIT,作者 戴億。 ## 特性 | 特性 | 說明 | |---|---| | **8 個模型可呼叫工具** | 範圍管理、偵察、連接埠、目錄、爬蟲、Web 偵測、JWT 稽核、報告 | | **預設拒絕(deny-by-default)** | 任何網路目標都必須先以 `aimy_scope` 登記,未登記直接拒絕並提示下一步 | | **授權依據與稽核** | 登記必須寫授權說明(≥ 8 字元),範圍可設過期時間,變更會寫入稽核日誌 | | **12 個偵測模組 + 3 個偵察模組** | 偵測:sqli / xss / cmdi / ssti / ssrf / nosqli / lfi / cors / jwt / graphql / proto-pollution / headers;偵察:crawler / param-miner / tech-fingerprint。連接埠與目錄列舉在工具層實作 | | **單一網路出口** | 所有請求都經 `lib/http.js` 護欄探針:逐請求 scope 驗證、預算、逾時、回應內容截斷、重新導向複檢 | | **8 個中文技能** | 授權範圍、偵察、Web 判定、認證與 JWT、API 與 GraphQL、報告、菜鳥模式、老鳥模式 | | **三種報告格式** | Markdown / JSON / SARIF,報告預設脫敏 | | **零執行時相依套件** | 不用 `requests`、不用第三方 HTTP 函式庫;宿主提供 `dsh-tools` 與 `dsh-skill` | | **只做偵測** | 不提供反彈 shell、反序列化利用鏈、SSRF 橫向、OOB 帶外、WAF 繞過等武器化能力 | | **無 UI 面板** | 只提供工具、技能與報告檔案;沒有圖形介面 | ## 安裝 前置:DSH 桌面端(`>=0.2.0-rc.1 <0.3.0`)與 Node `^22.19 || >=24`。本外掛沒有建置步驟,也沒有執行時相依套件。 ### 方式 A:用 DSH 外掛管理程式(建議) 打開 DSH 桌面端「**設定 → 外掛**」,用外掛管理程式安裝: - **本機目錄**:選擇本儲存庫目錄(含 `package.json` 與 `cordis.patch.yml`)。 - **git 儲存庫**:填 `https://github.com/DaiYiqq/dsh-daiyi-aimy-skill`。 安裝後外掛管理程式的 reconcile 會讀取本套件的 `dsh.bundle.patch`,把 `cordis.patch.yml` 的 insert 項(`id: daiyi-aimy-skill`)寫入 profile。 ### 方式 B:手動放進外掛目錄 1. 把本目錄放到 DSH 外掛目錄下(例如 `~/.dsh/plugins/dsh-daiyi-aimy-skill`)。 2. 在 profile 的 `package.json` 的 `dependencies` 中加入: ```json { "dsh-daiyi-aimy-skill": "file:~/dsh/plugins/dsh-daiyi-aimy-skill" } ``` > `file:` 後面寫**本機絕對路徑**;上面的 `~/...` 只是示意。 3. 在 profile 目錄執行 `pnpm install`。 4. 重新啟動 / 重新載入 DSH。外掛管理程式 reconcile 時會因為本套件宣告了 `dsh.bundle.patch`,把套件名稱加入 `dsh.profile.bundles`。 安裝成功後,工作階段裡能看到 8 個 `aimy_*` 工具,技能目錄裡出現 8 個 `aimy-*` 技能。 ## 快速開始(5 行) ```text // 第 1 步:登記授權範圍——不登記,後面所有網路工具都會拒絕 aimy_scope(action="add", target="example.com", authorization="客戶授權函 #A-1024,範圍 example.com 全站", expiresInHours=72) aimy_recon(target="https://example.com") aimy_crawl(target="https://example.com/", maxPages=10) aimy_web_scan(target="https://example.com/search?q=test", checks=["xss", "sqli"]) aimy_report(action="report", format="md", outputPath="reports/example-com.md") ``` 一次完整呼叫的回傳範例(節錄): ```json { "target": "https://example.com/search?q=test", "checks": ["xss", "sqli"], "skipped": [], "params": [{ "name": "q", "location": "query", "sample": "test" }], "findings": [ { "module": "xss", "checkId": "xss-reflected", "title": "反射型 XSS(HTML 情境)", "severity": "high", "confidence": "high", "url": "https://example.com/search?q=test", "param": "q", "payload": "aimy1337", "evidence": "參數 q 在 HTML 情境中原樣回顯;payload「…」未編碼出現在回應中。回應 200,片段:
…
", "cwe": "CWE-79", "remediation": "依輸出情境做 HTML/屬性/JS 編碼,使用白名單過濾,並設定 CSP 作為縱深防禦。" } ], "requests": 9, "notes": ["runId=run-1a2b3c4d", "模式=rookie"] } ``` > 上面的 finding 僅用於展示欄位形狀,不代表 `example.com` 真的存在該問題。實際回傳以你的目標與設定為準。 ## 工具 | 工具 | 作用 | 需要授權範圍 | |---|---|---| | `aimy_scope` | 登記 / 檢視 / 移除 / 清空授權範圍,判定目標是否放行 | 否(閘門本身) | | `aimy_recon` | DNS、HTTP 基線、安全回應標頭、技術堆疊指紋、robots.txt | 是 | | `aimy_port_scan` | TCP 連接埠連通性探測(僅握手),高風險連接埠暴露告警 | 是 | | `aimy_dir_fuzz` | 路徑/目錄列舉,軟 404 基線過濾,敏感路徑告警 | 是 | | `aimy_crawl` | 同源爬取:頁面、連結、表單、參數、JS 介面路徑 | 是 | | `aimy_web_scan` | 一次跑一組 Web 偵測(12 類 checks,見文件) | 是 | | `aimy_jwt_audit` | 離線 JWT 稽核:演算法、弱金鑰、宣告、外部金鑰來源 | 否(純本機) | | `aimy_report` | 彙總、列出發現、匯出 Markdown / JSON / SARIF | 否 | 完整參數表、回傳形狀、錯誤碼與限制見 [docs/TOOLS.md](docs/TOOLS.md)(中文文件)。 ## 技能 | 技能 | 何時載入 | |---|---| | `aimy-authorized-scope` | 工作階段開始、切換/擴大目標,或工具回傳 `NO_SCOPE` / `NO_MATCH` / `EXPIRED` / `PRIVATE_BLOCKED` | | `aimy-recon-workflow` | 範圍已登記,需要摸清網域、連接埠、目錄、頁面、參數與技術堆疊 | | `aimy-web-vuln-triage` | 已有帶參數的 URL,需要判定 Web 弱點真偽與定級 | | `aimy-auth-and-jwt` | 目標有登入狀態、Bearer token、JWT,或要驗證工作階段與物件層授權 | | `aimy-api-and-graphql` | 存在 `/api`、`/graphql`、`/swagger` 等介面 | | `aimy-finding-report` | 一輪偵測結束,需要出報告或給 CI 出 SARIF | | `aimy-rookie-mode` | 新手、生產環境,或 `mode=rookie` 時 | | `aimy-veteran-mode` | 授權明確、預發/靶場,需要更高覆蓋與鏈式驗證時 | 技能是**方法指導**,不會自動執行工具,也不能繞過 `aimy_scope`。 ## 與上游的升級對照 | 維度 | 上游 `aimy-sikll` v2.0.0 | 本外掛 v3.0.0 | |---|---|---| | 形態 | Python CLI,`python main.py <子命令>` | DSH Cordis 外掛,模型直接呼叫工具 | | 授權 | 輸入目標即探測 | deny-by-default,先登記範圍再探測 | | 網路出口 | 各模組各自用 `requests` | 唯一護欄探針,逐請求 scope 驗證 | | 輸出 | 終端機 JSON 文字 | 結構化回傳值 + 三種格式報告 | | 相依 | `requests` 等 | 零執行時第三方相依 | | 工作階段 | `.pkl` 工作階段檔案 | 無狀態,不保存憑證 | | 並行 | 執行緒池 | 受控並行 + 請求預算 + 取消 | | 武器化 | 有(反彈 shell、拖庫、橫向等) | **不提供**,對應模組不移植 | | 技能 | 101 份 Markdown | 精選重寫為 8 個可執行 playbook | 34 個上游模組的逐項處置(移植 / 合併 / 只吸收部分 / 不移植及原因)與 CLI 命令對照見 [docs/MIGRATION.md](docs/MIGRATION.md)(中文文件)。 ## 設定 設定來自 `cordis.patch.yml` 的 `config`,與預設值合併;非法值回退預設並記錄 warning。 ```yaml - insert: - id: daiyi-aimy-skill name: dsh-daiyi-aimy-skill config: mode: rookie persistScope: true ``` | 設定項 | 類型 | 預設 | 說明 | |---|---|---|---| | `mode` | `rookie` \| `veteran` | `rookie` | 執行模式;只影響預算與 payload 激進度,不放寬授權邊界 | | `persistScope` | boolean | `true` | 是否把授權範圍寫入磁碟;`false` 時僅存在行程記憶體,重新啟動即失效 | | `scopeFile` | string | `/daiyi-aimy-skill/scope.json` | 授權範圍檔案路徑 | | `timeoutMs` | number | 8000(rookie)/ 12000(veteran) | 單一請求逾時,上限 60000 | | `maxRequests` | number | 24 / 60 | 單次工具呼叫請求預算,上限 400 | | `concurrency` | number | 4 / 8 | 並行上限,上限 32 | | `maxBodyBytes` | number | 262144 | 回應內容上限,最大 4 MiB | | `followRedirects` | boolean | `false` | 預設不跟隨重新導向 | | `maxRedirects` | number | 3 | 跟隨時的最大跳數 | | `userAgent` | string | `dsh-daiyi-aimy-skill/3.0.0 (...)` | 預設 UA,目標可識別測試來源 | | `allowPrivateNetworks` | boolean | `false` | 是否允許登記/存取回送與內網位址 | | `redactSecrets` | boolean | `true` | 報告中對疑似憑證脫敏 | | `maxFindings` | number | 800 | 記憶體中最多保留的 finding 數 | | `maxRuns` | number | 60 | 記憶體中最多保留的執行記錄數 | ## 安全與合規 - **只做偵測**:不提供反彈 shell、反序列化利用鏈、SSRF 橫向、OOB 帶外回連、WAF 繞過、資料提取、憑證攻擊、MITM 憑證擷取。 - **預設拒絕**:沒有授權範圍時,所有網路工具直接拒絕;範圍必須寫明授權依據。 - **範圍可約束**:支援 `host`、`host:port`、scheme、`*.` 萬用字元子網域、路徑前綴與過期時間;回送/內網預設禁止。 - **不保存憑證**:外掛不持久化 token/cookie/登入狀態;範圍檔案不記錄憑證。 - **不承諾檢出率**:偵測基於回應差異啟發式,存在誤報漏報;結論必須由有授權的人類複核。 - **合法使用**:僅用於已取得**書面授權**的目標。未授權探測、資料提取、持久化存取、阻斷服務等均被禁止,也不在外掛能力範圍內。 完整授權模型、比對規則與弱點報告管道見 [docs/SECURITY.md](docs/SECURITY.md)(中文文件)。 **發現外掛自身的資安問題**:請優先透過 GitHub Security Advisory 或電子郵件 `1703205607@qq.com` 私下聯絡,修補前請勿公開細節。 ## 目錄結構 ```text dsh-daiyi-aimy-skill/ ├── lib/ │ ├── index.js # 外掛入口:name / inject / apply │ ├── config.js # 設定正規化與模式預算 │ ├── scope.js # 授權範圍:解析、比對、持久化、稽核 │ ├── http.js # 護欄 HTTP 探針(唯一網路出口) │ ├── store.js # Finding 儲存、去重、執行記錄 │ ├── report.js # Markdown / JSON / SARIF 渲染 │ ├── tools/ # 8 個模型可呼叫工具 │ ├── engine/ # 12 個偵測模組 + 3 個偵察模組 + 註冊表 │ └── skills/ # 技能載入器 ├── skills/ # 8 個 aimy-* 技能(SKILL.md) ├── docs/ # TOOLS / MIGRATION / SECURITY / ARCHITECTURE / CONTRACT ├── scripts/ # validate-plugin.mjs 契約驗證 ├── test/ # 契約測試、引擎測試、技能測試 ├── cordis.patch.yml ├── package.json ├── README.md # 簡體中文(主語言) ├── README.en.md # English ├── README.zh-TW.md # 繁體中文 ├── README.ja.md # 日本語 ├── CHANGELOG.md └── LICENSE ``` ## 開發與測試 要求 Node `^22.19 || >=24`。**零第三方相依套件**,因此不需要 `npm install`。 ```bash npm run check # 契約驗證 + 全庫語法檢查 npm test # node --test "test/**/*.test.js"(遞迴) npm run verify # check + test(CI 跑的就是這一條) ``` 單獨驗證某個檔案: ```bash node --check lib/http.js node --test test/engine/sqli.test.js ``` CI:[.github/workflows/ci.yml](.github/workflows/ci.yml),`ubuntu-latest` + Node 24,只跑 `npm run verify`,不做額外安裝。 更多設計說明見 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)(中文文件);新增偵測模組的步驟也在那裡。 ## 授權條款 [MIT](LICENSE) © 2026 戴億 <1703205607@qq.com> 上游專案 `aimy-sikll` 同為 MIT 授權條款;本外掛是獨立再開發,不是上游的官方發行版。