---
title: 問題總表：按風險等級排序（跨全部掃描批次）
---

> ⚠️ **本檔已由 `docs/security-report/SUMMARY.md` 取代，數字停在 2026-09-20，不要照它排優先序。**
> 之後登記的項次（FR-113 的第 118～133 項、`module_frame` 那批的第 134～149 項）都沒有進這份表，第 128 項的影響範圍也已從「跨專案」升級為「跨客戶」而本檔未反映。
> 要按風險排順序，請看 `docs/security-report/SUMMARY.md`；要看完整條目，看同目錄的 `README.md` §3。

# 問題總表：按風險等級排序

> **這一頁回答一個問題：目前所有掃描找到的問題，按嚴重程度排下來是什麼樣子。**
>
> 每一條只給一句話，由上往下掃一眼就是修正的優先順序。完整描述、檔名行號、出事會怎樣、修法細節都在[主彙整頁](index.html) §2.2 與 §3，用「出處」欄的編號回去查。
>
> 最後更新：2026-09-20（FR-108 D2-4b 驗收＋arc 收口，範圍內 0 條新增，與第 105 項重複）。沿革見 security-scan-LOG.md 與 git log。
>
> ✅ **掃描 arc 已於 2026-09-20 隨 FR-108 收口結束**：決策者裁定「這條線做完，掃描就結束、其餘套件不再掃」——本頁數字為最終數字。
>
> 🔵 **2026-09-20 做過第二次複查**（只查「檔案真的被改過」的 42 條）：新判 **2 條已修**（第 22、25）、**6 條部分修**，其餘仍在。標記直接寫在下面各列；完整結論與四件教訓見[主彙整頁](index.html) §3 開頭。**標「⚠️ 部分修」且註明「開卡前原文必須改寫」的三條（第 34、40、49），照原文開卡會讓人做一件已經做完的事。**

---

## 一分鐘看完

| 風險等級 | 數量 | 現在的狀態 |
|---|---:|---|
| 🔴 **最嚴重** | **1** | 工單（CM-1595）已開好，**還沒排進度** |
| 🟠 **高** | **36** | 其中 4 條已開工單，**32 條只登記、還沒開工單** |
| 🟡 **中** | **60** | 全部只登記、還沒開工單，等統一安排 |
| ⚪ **低風險** | **51** | 資安類 27 條 ＋ 24 項「不算資安、但確實是程式錯誤」 |
| | **共 161 列** | 底層是 **145 項已登記未開工單 ＋ 16 張已開工單**；差額是主表第 1 項（公告權限四個洞）在這裡按嚴重度拆成三列 |

**全部沒有排進度，是決策者裁定「等所有套件都掃完，再一次排優先順序」的結果，不是被遺漏。**

### 🔴 如果只能先做四件

1. **遠端代理程式那條最嚴重的**（CM-1595）——工單早就開好躺著，不用登入就能取走客戶機器上的明文帳密，而且可以冒充別家客戶的機器。
2. **檔案上傳那一整群**——高風險裡有 6 條在這裡，而且**同一套修法可以一次解決**。
3. **防竄改那兩條**——已實測證實：換掉一支工具庫，整套防竄改永久失效且不發警示。
4. **弱點掃描規則包被當程式碼執行**——只要有租戶管理員權限就能在後端執行身分下任意執行程式碼。

---

## 🔴 最嚴重（1 條）

| 套件 | 問題 | 怎麼修 | 狀態 |
|---|---|---|---|
| **遠端代理程式**<br>(jedi-remote-agent) | 四支控制端點完全不驗呼叫者身分，不用登入就能取走客戶掃描工具的明文帳密，還能冒充別家客戶的機器 | 應用層補身分驗證，只靠 nginx 不夠 | 工單 **CM-1595** 已開，未排 |

---

## 🟠 高風險（36 條）

### 群一：只驗登入、不檢查東西是不是你的（18 條，**最大一群**）

**共同點**：系統認得出「你是誰」，但從不問「這筆資料是不是你的」。修法可以共用一套。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **檔案上傳**<br>⚠️ 部分修 | 拿到檔案編號就能下載別人的檔案 | 服務層比對這筆資料的主人。⚠️ 09-20 複查：**資料庫隔離已補上、跨客戶那半被擋住**，缺口縮小成同一客戶內跨專案；**開卡前原文必須改寫** | §3.1 第 34 |
| **檔案上傳** | 能替任何檔案換發一張免登入的下載通行證，傳到公司外面 | 同上 | §3.1 第 35 |
| **檔案上傳**<br>⚠️ 部分修 | 檔案服務層只憑編號就交出檔案（上面三條在主專案這一側） | 同上。⚠️ 09-20 複查：同第 34 項，應用層一行未動、**開卡前原文必須改寫**；現在 entity 上有檔案主人欄位可用，修起來更容易 | §3.1 第 40 |
| **檔案上傳** | 上傳的網頁檔在我們自己的網域裡被當成程式執行 | 預覽不照使用者填的副檔名決定型別 | §3.1 第 36 |
| **檔案上傳** | 任何登入者打一支查設定的功能，就拿到雲端儲存帳密明文 | 補權限檢查＋加進密碼遮蔽名單 | §3.1 第 39 |
| **檔案上傳**<br>✅ 已修 | 存放檔案紀錄那張表的資料庫隔離已補上，但同群上面三條應用層檢查仍沒補 | ✅ 已修（資料庫層） | §3.1 第 47 |
| **稽核流程引擎**<br>⚠️ 部分修 | 知道任務編號就能讀走別家客戶的稽核證明清單，含檔案編號 | 補歸屬檢查。⚠️ 09-20 複查：任務表隔離已補（實測擋得住），但**證據表本身仍無客戶欄位無隔離**，單筆讀取那條路沒被擋到；應用層一字未補 | §3.1 第 49 |
| **稽核流程引擎** | 流程留言的讀取與寫入都只檢查登入，可冒用同事名義發言釣魚 | 補歸屬檢查 | §3.1 第 51 |
| **任務平台** | 送一個空白查詢就撈光全公司所有客戶的專案成員名冊（實測 751 筆） | 專案編號改必填＋補成員檢查 | §3.1 第 60 |
| **系統設定** | 讀系統設定的三個入口都不檢查權限，任何登入帳號拿得到物件儲存帳密 | 三個入口都補上現成的權限點 | §3.1 第 72 |
| **弱點掃描**<br>🆕 | 「測試連線」只驗登入，客戶公司裡任何人按一下就把掃描工具帳密解密外送 | 補一行權限宣告，照抄同檔寫入端 | §3.1 第 85 |
| **問卷**<br>🆕 | 查填答歷史明細完全不檢查歸屬，空白請求就整包讀走全客戶每一版答案與審核意見 | 改成必須指名有權看的任務問卷，再呼叫現成守門 | §3.1 第 89 |
| **問卷**<br>🆕 | 讀某份任務問卷的答案不檢查歸屬，拿到編號就讀得到別部門的作答與分數 | 比照同檔寫入端呼叫守門，一行就好 | §3.1 第 90 |
| **意見回饋** | 六個操作只有「匯出」做了權限檢查，其餘五個任何人都能用 | 補權限檢查與歸屬檢查 | 工單 **CM-1630** |
| **證據自動分類**<br>🆕 | 舊版預覽端點填任何一個 Google 硬碟檔案編號就抓得到，射程是客戶整個硬碟 | 加 run 參與者守門，或拿掉舊線三支路由 | §3.1 第 108 |
| **公告** | 單筆讀取公告完全不檢查權限，AI 儀表板那條路還能繞過權限讀走全客戶公告（含未發布草稿，前三筆原文送到第三方 AI） | 補權限檢查與歸屬檢查；四個洞合併一張工單 | §3.1 第 1 |
| **公告** | 修改或刪除公告不檢查歸屬，刪除時還會默默清空原本設定的發送對象 | 同上 | §3.1 第 1 |
| **專案**<br>⬆ 09-24 升 | 稽核輪次那組 8 支讀取不檢查是不是專案成員，同客戶任何人拿到輪次編號就讀得到別的專案的稽核判定、風險評等、改善計畫與負責人姓名（2026-09-24 FR-116 C3 由中升高） | 修法 CM-2037 已寫好，合回 `fix/security-b1` | §3.1 第 66 |

### 群二：客戶之間的資料隔離沒生效（2 條）

**共同點**：切換到子客戶之後，還是看得到別家客戶的資料。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **跨套件盤點** | 切到子客戶仍看得到別家客戶的待辦與專案，13 張表的隔離沒生效 | 逐表開啟隔離（FR-094 已接手） | §3.1 第 43 |
| **跨套件盤點** | 4 個資料查詢畫面直接繞過隔離機制 | 改寫查詢，或限縮誰能讀 | §3.1 第 44 |

### 群三：密碼與金鑰外流（6 條）

**共同點**：憑證已經在外面，修程式救不回來，一律先換發再清殘留。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **文件站**<br>🆕 最急 | 🔴 資料庫超級管理員密碼與兩組產品帳密寫在需求文件裡，那頁已自動發佈到公開文件站，開網址就看得到 | 先換密碼→清檔重佈→build 加密碼檢查（與 CM-1629 同源） | §3.1 第 84 |
| **共用地基**<br>✅ 已修 | 使用者的登入密碼與登入憑證，原文直接寫進日誌檔與資料庫 | ✅ 已修（09-20 複查）——標頭走白名單、內容套遮罩，實際 grep 四個 log 檔明文 0 筆；⚠️ 舊 log 檔的明文屬資料清理、另處理 | §3.1 第 22 |
| **公告** | 資料庫帳密、四家 AI 服務金鑰、套件庫與物件儲存憑證需要輪替 | 換發＋清除殘留 | §3.1 第 2 |
| **意見回饋** | 資料庫管理員密碼散落在 249 個檔案，其中一份主機帳號密碼三行湊齊 | 換密碼＋清檔；測試機展示機要決策者當次指示 | 工單 **CM-1629** |
| **意見回饋** | Google 雲端硬碟金鑰外洩，而且所有客戶環境共用同一組 | 換發後重佈各環境；連加密金鑰一起換要先寫重加密程式 | 工單 **CM-1631** |
| **安裝程式** | 每一套部署都種下同一組原廠超級管理員密碼，雜湊值寫死在安裝用的 SQL 檔裡，也不強制客戶第一次登入就改掉 | 改成裝機時隨機產生＋強制首登改密碼（決策者已裁：先記錄，之後再看怎麼調整） | §3.1 第 3 |

### 群四：防竄改機制可以被廢掉（2 條）

**共同點**：防線本身可以被關掉，而且關掉之後畫面照樣顯示「通過」。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **防竄改** | 換掉驗證簽章的工具庫，整套防竄改永久失效，實測完全不發警示 | 把那支工具庫移出「開機不檢查」那一層 | §3.1 第 13 |
| **防竄改** | 文件說有兩道鎖，程式其實只做一道，刪掉一個檔就能讓鎖定的機器重開 | 補上資料庫那一道檢查 | §3.1 第 14 |

### 群五：一個人就能讓全站停止回應（2 條）

**共同點**：兩條都在同一支流程圖解析上，合開一張工單即可。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **稽核流程引擎** | 一張惡意設計的流程圖可以把伺服器卡死 | 解析時加上深度與大小上限 | §3.1 第 55 |
| **稽核流程引擎** | 「檢查流程圖」連續打四次，全站對所有客戶都不回應 | 同上，兩條合開一張工單 | §3.1 第 57 |

### 群六：其他（6 條）

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **系統設定**<br>🆕 | 一個客戶的管理員可以改掉全公司所有人的登入規則，還能把登入驗證來源指到自己機器 | 四個方向待產品決策，見主彙整頁 §7 | §3.1 第 74 |
| **日誌**<br>🆕 | 一個客戶的管理員可以把全公司日誌改送到自己機器，而日誌裡有密碼原文 | 與上一條同病同修法，兩件一起定案 | §3.1 第 75 |
| **日誌**<br>🆕 | 匯出操作記錄的 Excel 可被種公式炸彈，攻擊者不必登入就塞得進去 | 公式字元開頭前置單引號，修在匯出共用出口 | §3.1 第 78 |
| **AI 儀表板** | 使用者只要打字，就能誘導 AI 選中 27 支查詢功能裡的任何一支 | 使用者輸入與可用功能清單分開送 | §3.1 第 11 |
| **寄信通知** | 測試寄信會把公司寄信平台的密碼送到呼叫者指定的任何主機 | 目的地改成白名單 | 工單 **CM-1605** |
| **弱點掃描**<br>🆕 | 🔴 客戶上傳的檢測規則包會被外部工具當 Ruby 樣板先跑一輪，等於任意執行程式碼 | 擋掉樣板記號、metadata 走 safe_load、隔離執行環境 | §3.1 第 115 |

---

## 🟡 中風險（60 條）

**按「同一種病」分群**（不是按套件），同一群的修法多半可以共用。

### 群一：只驗登入、不檢查東西是不是你的——讀取類（18 條，**最大一群**）

**共同點**：與高風險群一同病，只是外洩的資料敏感度低一級。查詢條件多半全選填，送空白請求就回整張表。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **AI 儀表板** | 對 AI 說一句話就列出全公司帳號、角色、客戶與部門清單，走正常畫面要有權限 | 每支查詢標明需要什麼權限；先移出 AI 清單止血 | §3.1 第 8 |
| **稽核流程引擎** | 查單筆稽核證明沒有歸屬檢查，目前只是剛好被另一個程式錯誤擋住 | 與第 49 項同檔一起補，同一張工單 | §3.1 第 50 |
| **稽核流程引擎** | 知道輪次編號就能讀走別家客戶的稽核階段歷程，含退回理由全文 | 用輪次反查專案，再檢查成員身分 | §3.1 第 52 |
| **稽核流程引擎** | 「查目前在哪個階段」用你填的專案查角色、卻用你填的輪次撈資料，兩者不核對 | 解析輪次後比對所屬專案；查不到角色要擋 | §3.1 第 53 |
| **任務平台** | 控制項成員名冊兩支讀取不檢查權限、編號全非必填，猜編號就讀得到人員配置 | 補合格成員檢查＋專案編號改必填 | §3.1 第 61 |
| **任務平台** | 查任務指派清單條件全選填，空請求回整張表（實測 12,494 筆，含帳號暱稱） | 補專案成員檢查＋專案編號改必填 | §3.1 第 68 |
| **專案** | 摘要報告的清單與歷史版本共四支讀取只驗登入，歷史常留著後來被刪的稽核發現 | 補同檔已有的成員檢查＋清單加範圍條件 | §3.1 第 65 |
| **資產清冊** | 設備與資訊系統清冊七支讀取只驗登入，「查看」權限只在前端隱藏選單 | 🔵 產品決策題：要守就加檢查，維持原樣要寫進文件 | §3.1 第 80 |
| **弱點掃描** | 查掃描執行紀錄少了專案參與者檢查，同客戶任何人知道任務編號就讀得到 | 補上同服務其他八處已在用的參與者檢查 | §3.1 第 88 |
| **問卷**<br>🆕 | 列出任務問卷不限範圍，空白請求回整個客戶的全部，也是讀答案的入場券 | 補歸屬檢查＋專案編號改必填 | §3.1 第 91 |
| **問卷**<br>🆕 | 列出填答歷史不限範圍，看得出全公司誰在什麼時候改了哪一份問卷 | 補歸屬檢查＋任務問卷編號改必填 | §3.1 第 92 |
| **問卷**<br>🆕 | 還原歷史版本不檢查那個版本是不是這份問卷的，可把別部門答案複製進來 | 比對歷史版本的任務問卷編號，一行就好 | §3.1 第 94 |
| **問卷**<br>🆕 | 多人同填的「房間」想進哪間就進哪間，可旁聽別專案並抓到答案快照 | 房間名稱解析成任務問卷後呼叫既有守門 | §3.1 第 95 |
| **跨套件**<br>（**根因**） | 六張任務指派／參與者表的資料存取層都不自己加專案範圍條件，上層不帶條件就回整張表 | 要不要在共用底層一次擋掉，見主彙整頁 §7 | §3.1 第 70 |
| **問卷**<br>🆕 | 問卷討論列表送空查詢就撈回全公司所有討論，含你沒參與的專案 | 兩個條件改必填＋用現成守門檢查成員 | §3.1 第 96 |
| **證據自動分類**<br>🆕 | 舊版 job 列表與狀態端點不檢查專案成員，進度登記簿不分租戶 | 加專案參與者守門＋登記簿加租戶過濾 | §3.1 第 111 |
| **證據自動分類**<br>🆕 | 舊版查分類結果與報表不檢查專案成員，查無紀錄還退回直接去硬碟讀 | 五支讀取統一加守門、查無就拒、不退回硬碟 | §3.1 第 109 |
| **弱點掃描**<br>🆕 | `detection-profile.read` 這顆能力點早就宣告好，七支讀取方法一支都沒掛 | 七支補上同檔已有的能力點裝飾器 | §3.1 第 113 |

### 群二：只驗登入、不檢查東西是不是你的——寫入／改動類（8 條）

**共同點**：同上一群，但這一群改得動資料。**寫入型越權比讀取型更難善後**，錯誤資料已經寫進去了。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **檔案上傳** | 任何登入者可以永久刪除任何檔案，連轉檔產生的備份一起清掉 | 加第 34 項同樣的歸屬檢查＋改成可復原刪除 | §3.1 第 37 |
| **任務平台** | 任務查詢／修改／刪除三支收了專案編號卻沒拿來用，只憑任務編號查 | ⚠️ 改過但沒修乾淨，還剩三個缺口要分開寫 | §3.1 第 45 |
| **稽核流程引擎** | 只能看的 viewer 實際可以標記別人的任務完成、退回流程；檢測模組八支端點吃同一道守門 | 待決策者裁：加負責人檢查，或明列允許的角色 | §3.1 第 59 |
| **任務平台** | 第六支成員管理服務整個檔案沒有任何權限檢查，只是目前沒有入口打得到 | 收下角色檢查元件、三支寫入補檢查、啟動補組裝 | §3.1 第 62 |
| **任務平台** | 流程參與者的管理者身分檢查寫在提前返回之後，永遠執行不到 | 查不到改成明確拒絕（權限檢查預設拒絕） | §3.1 第 63 |
| **資源庫** | 客戶的租戶管理員可以改掉原廠公版範本的控制項清單，之後每個新專案都複製到 | 改範本前先查歸屬，公版只給平台管理員 | §3.1 第 67 |
| **任務平台** | 新增任務指派不檢查你填的任務屬不屬於那個專案，可把別人的任務登記成自己的 | 補歸屬比對＋真的掛上資料庫觸發程序 | §3.1 第 69 |
| **問卷**<br>🆕 | 改／刪問卷討論不檢查是不是本人寫的，改完還掛著原作者名字，刪除不留痕 | 動手前先比對建立者是不是呼叫者 | §3.1 第 97 |

### 群三：回應內容夾帶不該送出去的欄位（2 條）

**共同點**：前端畫面只顯示幾欄，不代表後端只送了幾欄——整個資料物件被原樣送出。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **AI 儀表板** | 查詢結果夾帶每個帳號的密碼加密鹽值，正常的使用者列表刻意排除了它 | 加欄位白名單，或重用既有排除設定 | §3.1 第 9 |
| **AI 儀表板** | 套件的轉換函式把整個物件攤平放進回應，送外部 AI 的樣本也沒遮罩 | 照畫面欄位清單挑選；更根本是拿掉鹽值欄位 | §3.1 第 12 |

### 群四：日誌這條線——外洩、沒隔離、遮不乾淨、清不掉（7 條）

**共同點**：這七條合起來是一條完整的鏈——密碼原文進日誌、遮罩遮不乾淨、表沒隔離、送外部不加密、內容可偽造、而且永遠清不掉。建議整條一起排。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **共用地基** | `system_logs` 完全沒有客戶隔離、連可以拿來隔離的欄位都沒有，已累積 66 萬筆；`api_logs` 同樣沒開 | 先加客戶標記欄位再補規則，或限縮能讀的帳號 | §3.1 第 23 |
| **共用地基**<br>⚠️ 部分修 | 完整的程式錯誤堆疊寫進那張沒隔離的表，含內部路徑、函式名稱與 SQL 片段 | 只留錯誤類型與訊息，或堆疊另存到受限處。⚠️ 09-20 複查：進表的量變少了，但堆疊照寫、表仍無隔離，且正式環境現在也會走這條 | §3.1 第 24 |
| **出貨設定**<br>✅ 已修 | 🔴 出貨設定檔漏了一個環境變數，客戶正式機實際套用的是開發用日誌設定 | ✅ 已修（09-20 複查）——出貨與安裝腳本都顯式寫出該變數，放大器效應解除；⚠️ 「讀不到就拒絕啟動」那半沒做，自備部署仍會靜默退回開發設定 | §3.1 第 25 |
| **共用地基** | 全站唯一的密碼遮罩遇到密碼含雙引號只能遮一半，剩半截原文留 90 天 | 改成解析成結構化資料再換值，解析失敗整段遮 | §3.1 第 30 |
| **日誌轉送** | 送到外部日誌伺服器的整條路完全沒有加密選項，而那裡面有密碼原文 | 兩種協定都加上可選加密，開放成設定頁選項 | §3.1 第 76 |
| **日誌轉送** | 送出去的日誌沒過濾換行符號，可在客戶的資安監控系統裡塞偽造稽核紀錄 | 組出那一行之前先清掉換行與控制字元 | §3.1 第 77 |
| **日誌保存**<br>✅ 已修 | 🔴 兩張日誌表的按月存放已失效、保存期限沒生效，維護程式從沒被排程呼叫過 | ✅ 已修（09-20 複查）——維護程式已接上每日排程並改以較高權限執行（後者原本會讓它每晚靜默失敗），分區已建、備用表歸零 | §3.1 第 79 |

### 群五：防竄改機制可以被削弱（2 條）

**共同點**：兩條都是高風險那兩條防竄改問題的放大器，搭配起來能把攻擊成本大幅拉低。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **防竄改** | 有個環境變數可以整個換掉「要核對哪個目錄」，優先權還比打包版判斷高 | 打包模式下忽略這個環境變數 | §3.1 第 15 |
| **防竄改** | 用過的解鎖檔案，紀錄檔一毀損系統就當作「一張都還沒用過」 | 把「檔案不存在」與「內容毀損」分開處理 | §3.1 第 16 |

### 群六：一個人就能讓服務停擺 / 檔案完整性沒人管（5 條）

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **共用地基** | 分頁的「一頁幾筆」沒有上限，送一個大數字就能叫資料庫把整張表全撈出來 | 加範圍限制，共用分頁邏輯再加一道保底 | §3.1 第 31 |
| **稽核流程引擎** | 讀流程範本會無條件解析流程圖，一筆空白內容就讓所有人的清單頁出錯 | 寫入端補格式檢查、讀取端空字串就跳過 | §3.1 第 56 |
| **弱點掃描**<br>🆕 | 手動重新掃描無上限開背景執行緒、整檔讀進記憶體、外部程序給到 900 秒 | 同版本在跑就拒絕重複＋加全域併發上限 | §3.1 第 114 |
| **弱點掃描**<br>🆕 | 用網址當規則來源時完全繞過封裝檢查器，三道防炸彈上限一條都沒套用 | 網址下載的內容也要先過同一支驗證器 | §3.1 第 116 |
| **弱點掃描**<br>🆕 | 填網址建掃描基準時放行明文 `http://`、且完全不記指紋，代理程式落地執行前無從核對檔案有沒有被換掉 | 只收 `https://`；第一次抓下來就記指紋，之後每次核對 | §3.1 第 117 |

### 群七：要先由產品面做決策，才能改程式（3 條）

**共同點**：不是寫錯，是當初的決定在新情境下沒人重新檢視過，直接改可能影響既有使用方式。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **AI 儀表板** | 專案清單有一道「視同管理員」的後門，非成員也能列出客戶內全部專案 | 先定產品方向再改程式 | §3.1 第 10 |
| **檔案上傳** | 客戶讀不到自己的儲存設定時，系統會去借用別家客戶的帳號密碼 | 是刻意設計就寫進文件並限制條件，否則直接拒絕 | §3.1 第 41 |
| **排程**<br>✅ 已修 | 兩支背景清理排程靠「找不到身分就暫時給最高權限」這條規則才能運作 | ✅ 已修——改成用具名的系統身分執行 | §3.1 第 46 |

### 群八：其他（15 條）

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **弱點掃描**<br>🆕 | 「測試連線」要連哪台主機由呼叫者直接指定，代理程式變成任意連線跳板 | 目標限已登記的掃描目標或白名單＋收斂回應 | §3.1 第 86 |
| **弱點掃描**<br>🆕 | 🔴 資料庫的客戶隔離規則方向寫反，子單位看得到也改得動母單位資料，出貨基線共 9 條 | 9 條換成同檔正確寫法，跨三個套件一次改 | §3.1 第 87 |
| **意見回饋**<br>🆕 | 程式庫歷史裡還有第二把寫死的 GitLab 存取權杖，從沒被撤銷過 | 去 GitLab 後台撤銷並查稽核紀錄，不是改程式 | §3.1 第 83 |
| **意見回饋** | 匯出回饋的 Excel／CSV 沒過濾公式字元，管理員開檔就變成真公式 | 公式字元開頭前置單引號，與操作記錄抽同一支 | §3.1 第 82 |
| **登入帳號** | 🔴 員工被停權後手上的憑證還能用約三天半，他自己還能續到約八天 | 兩處同改：認身分時擋非啟用＋停權時撤銷憑證 | §3.1 第 28 |
| **共用地基** | 主產品連 Redis 寫死成不檢查對方是不是真的伺服器，網址也寫死不加密 | 照抄另一個套件的寫法＋依加密開關切換 | §3.1 第 19 |
| **檔案上傳** | 本機硬碟刪檔漏清了轉檔產生的 PDF 備份，雲端儲存那邊有清 | 修法很小，建議把兩種儲存的共通邏輯提到共用處 | §3.1 第 48 |
| **問卷**<br>🆕 | 多人同填時「這筆是誰填的」直接採用前端送來的名字，稽核紀錄不可信 | 改用登入身分，一行就好 | §3.1 第 93 |
| **問卷**<br>🆕 | 資料夾更新 API 前端送什麼收什麼，多塞「已刪除」欄位就繞過守門造出孤兒資料 | 拿掉 `apply=False` 改嚴格格式，四個入口一起改 | §3.1 第 98 |
| **弱點掃描**<br>🆕 | 代理程式回報報告時檔名叫什麼就存什麼，`.html` 在稽核人員瀏覽器裡當網頁執行 | 去掉路徑＋副檔名白名單，最好一律自己命名 | §3.1 第 101 |
| **證據自動分類**<br>🆕 | 證據檔的內文可以對 AI 下指令，左右它判這份證據符合哪些合規項目 | 容器端剝掉界線符號、宿主端限欄位與信心值 | §3.1 第 102 |
| **弱點掃描**<br>🆕 | 換掃描工具時不拿實際生效的值重新檢查台數上限，可把範圍填成超大網段 | 用實際生效值重查，兩個入口都補＋加保險上限 | §3.1 第 105 |
| **弱點掃描**<br>🆕 | 開始掃描時把客戶機器的帳密另存一份明文進工單表，沒人讀也永不清理 | 刪掉寫入那一行＋補一支清存量的 migration | §3.1 第 107 |
| **證據自動分類**<br>🆕 | 查 Google 硬碟的搜尋條件用字串拼接、資料夾編號沒跳脫 | 資料夾編號進查詢前先驗字元集 | §3.1 第 110 |
| **弱點掃描**<br>🆕 | 上傳壓縮檔的「最多一萬個檔」上限對 `.zip` 形同虛設，打開那一刻記憶體就吃光 | 先讀 zip 檔尾的目錄筆數擋掉；順手改掉寫反的註解 | §3.1 第 112 |

---

## ⚪ 低風險（51 條 ＝ 資安類 27 條 ＋ 非資安的程式錯誤 24 條）

**這一級混了兩種東西，看的時候要分開**：

- **資安類 27 條**：是漏洞，只是現在打不到——有的要對方先有某個權限、有的那段程式沒人呼叫、有的被另一道檢查擋住。**洞一直都在，只是門口剛好堵著東西**；哪天有人接上那支沒人用的服務、或把擋著的東西拿掉，它立刻變成真的可以攻擊。
- **非資安 22 條**：不是風險，是**使用者今天就會踩到的功能故障**（按了顯示成功但沒存進去、送不出意見回饋又看不出原因），只是不算資安問題所以歸在這裡。

### 群一：資料庫隔離該開沒開（3 條）

⚠️ **同一組還有一條在中風險段**（第 87 項）：9 張表的隔離規則方向寫反——不是沒開，是開了但寫成相反的意思，**這種最不容易被發現**。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **公告** | 公告與部門的關聯表沒有設定資料庫隔離 | 走標準流程；⚠️ 這張表沒有客戶歸屬欄位，不能照抄主表 | §3.1 第 4 |
| **跨套件**<br>✅ 已修 | 三張表訂了隔離規則但開關沒打開，專案表還漏了超級管理員例外 | ✅ 已修——三張都已開啟，出貨基線同步更新 | §3.1 第 5 |
| **意見回饋** | jedi-issue 五張表完全沒有客戶隔離，連「這是哪個客戶的」標記欄位都沒有 | 先改表結構加客戶標記欄位，再補隔離規則 | §3.1 第 7 |

### 群二：預設值不安全（4 條）

**共同點**：程式本身沒寫錯，但預設值選在寬鬆那一側，接手的人忘記手動改就自動變成不安全。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **登入帳號** | 「忘記密碼」用來防帳號列舉的信箱遮罩，套件預設是關閉的 | 套件預設改成開啟，要放寬的產品自己覆寫 | §3.1 第 29 |
| **檔案上傳** | 上傳沒有單檔大小上限也沒有數量上限，一次塞很多檔就繞過請求上限 | 加單檔大小與數量上限，做成可調整的設定值 | §3.1 第 38 |
| **檔案上傳** | 連線雲端儲存預設不使用加密連線，檔案與帳密會在網路上明文傳輸 | 預設改成加密，要關掉的人自己明確設定 | §3.1 第 42 |
| **共用地基**<br>⚠️ 部分修 | 正式與測試環境把兩種日誌類別的詳細程度設成最高等級，日誌量會變大 | 調回一般或警告等級。⚠️ 09-20 複查：兩項改掉一項（一般框架日誌已改讀環境變數），資料庫查詢與 mongo 兩棵仍寫死最高等級 | §3.1 第 27 |

### 群三：權限漏掛、或歸屬沒檢查（7 條）

**共同點**：與中風險群一群二同一種病，只是拿得到的東西敏感度更低，或還有另一道檢查頂著。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **稽核流程引擎** | 流程範本的列表與單筆讀取沒掛權限檢查，等於前端擋住、API 完全敞開 | 補功能權限檢查，或前後端規則一起拿掉 | §3.1 第 58 |
| **任務平台** | 寫入成員資料時不檢查群組或控制項是不是真的屬於這個專案 | 寫入前比對所屬專案，不一致就拒絕 | §3.1 第 64 |
| **任務平台** | 更新任務指派時撈不到既有紀錄就整段跳過管理者檢查 | 與中風險第 63 項同型，一起清理 | §3.1 第 71 |
| **資產清冊** | 只有「修改資訊系統」權限的人，送一個「停用」欄位就達成刪除的效果 | 把停用欄位從修改格式拿掉，或改要求刪除權限 | §3.1 第 81 |
| **系統設定** | 密碼遮罩名單漏掉物件儲存那一組，有權限的管理員瀏覽器仍收到明文密鑰 | 加進群組與欄位名單、改用不回密鑰的做法、同步改測試 | §3.1 第 73 |
| **問卷**<br>🆕 | 資料夾列表可以叫出系統刻意隱藏的資料夾，以及已經刪掉的資料夾 | 同上一條（拿掉 `apply=False`、改用嚴格格式） | §3.1 第 99 |
| **公告** | 公告列表對「沒有被分配部門」的帳號直接整份放行，不做任何篩選 | 與第 1 項其餘三個洞合併一張工單一起修 | §3.1 第 1 |

### 群四：留著會害下一個人判斷錯的（死碼、殘留、寫法不良，5 條）

**共同點**：這些不是漏洞，但留著會讓下一個讀程式碼的人誤判——以為某道檢查已經有了，於是不去補真正需要的那道。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **共用地基** | 有一行死碼把某個權限旗標無條件設成「是」，全部 105 條隔離規則都沒用到它 | 直接刪掉那三行 | §3.1 第 20 |
| **共用地基** | 隔離用的連線變數用字串拼接組進 SQL，目前不可被利用只因為沒人把外部輸入帶進來 | 改用安全參數綁定，成本很低 | §3.1 第 21 |
| **共用地基**<br>✅ 已修 | 程式載入當下就自動啟動一條位址寫死、不加密的遠端監控連線 | ✅ 已修——改成必須明確呼叫；連線仍未加密但預設不會走到 | §3.1 第 26 |
| **共用地基**<br>⚠️ 沒修乾淨 | 一支開發用輔助工具混在正式出貨套件裡，載入就讀 AI 金鑰、還會把檔案覆寫成空白 | ⚠️ 相依已改選配但檔案仍跟著出貨，直接從套件刪掉 | §3.1 第 32 |
| **共用地基** | 套件把物件轉成回應的共用工具原樣吐出整個物件、沒有任何欄位過濾 | 套件層加白名單；更根本是拿掉鹽值欄位 | §3.1 第 33 |

### 群五：其他（8 條）

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **授權** | 三個環境共用同一把寫死在程式裡的公鑰，開發簽的授權檔正式環境也會過 | 決策者已裁「等正式簽發站建好再一併處理」 | §3.1 第 6 |
| **防竄改** | 鎖定畫面服務綁在對外位址、跨網域允許任何來源，會洩漏機器指紋與鎖定編號 | 先寫進部署文件提醒不可直接對外，程式面可晚一點 | §3.1 第 17 |
| **防竄改** | 回報偵測到竄改時，把伺服器日誌最後 50 行原文整段送到原廠、完全沒遮罩 | 套用與日誌轉送相同的遮罩，或只送行數與時間 | §3.1 第 18 |
| **稽核流程引擎** | 推進或退回階段時，操作者顯示的暱稱可以由呼叫端自己填寫 | 一律由伺服器覆寫暱稱，請求格式加上限制 | §3.1 第 54 |
| **問卷**<br>🆕 | 資料夾列表把資料庫的原始錯誤訊息整句吐回前端，含表名、欄位名與 SQL 片段 | 拿掉那段 try／except，改回標準錯誤碼 | §3.1 第 100 |
| **證據自動分類**<br>🆕 | AI 金鑰放在 `docker run` 命令列上，同主機任何本機帳號都讀得到（落地版跑不到） | 改用 `--env-file` 或 `-e KEY` 不帶值 | §3.1 第 103 |
| **證據自動分類**<br>🆕 | 分類容器沒設記憶體／CPU／處理程序上限，逾時也殺不掉它（落地版跑不到） | 加記憶體／CPU／程序上限，並給容器命名 | §3.1 第 104 |
| **證據自動分類**<br>🆕 | 按「刪除整批」之後，判定結果、原始報告、含原始檔名的清單全都留在主機上 | 刪整批時一併清掉該 run 的工作目錄 | §3.1 第 106 |

---

### 不算資安、但確實是程式錯誤（24 條）

**這一組不是安全漏洞**——找不到攻擊者能主動觸發的路徑，但它們是真的壞掉或真的會壞。排修正時要跟資安項目分開看，急迫性來自產品品質不是被攻擊的風險。

| 套件 | 問題 | 怎麼修 | 出處 |
|---|---|---|---|
| **登入帳號**<br>✅ 已修 | 改客戶或部門資料時，只更新部分欄位會把「上層是誰」打成空值 | ✅ 已修——兩支都改成有值才更新 | §3.2 第 7 |
| **登入帳號**<br>✅ 已修 | 建立部門時「建立者」欄位從來沒被寫入，兩個稽核欄位都變成空值 | ✅ 已修——兩欄都已正確灌值 | §3.2 第 8 |
| **公告**<br>✅ 已修 | 更新公告時檢查錯對象，查無此筆時會對空值做設定、直接出錯 | ✅ 已修——改成先查、查無就回報找不到 | §3.2 第 9 |
| **公告**<br>✅ 已修 | 沒有登入身分時建立公告會直接讓程式崩潰 | ✅ 已修——沒身分就留空，真正的門在路由 | §3.2 第 10 |
| **共用地基** | 把日誌寫進資料庫失敗會連帶讓使用者那次請求一起失敗，現在能運作純屬運氣 | 補完整錯誤處理＋時間欄位補上格式設定 | §3.2 第 11 |
| **共用地基** | 系統自動產生的密碼比要求少一個字元，可能通不過自家最短長度規定 | 把計算公式裡的數字調回正確值 | §3.2 第 12 |
| **稽核流程引擎** | 「強制執行」旗標有兩個來源容易搞混，真正判斷的兩處看的是另一個變數 | 改成直接覆寫，與第 54 項一起清理 | §3.2 第 13 |
| **稽核流程引擎** | 三支收檔案路徑、但現在沒人呼叫的程式，直接用傳入的路徑開檔讀寫 | 直接刪除，或移進測試專用的模組 | §3.2 第 14 |
| **稽核流程引擎**<br>⚠️ 部分修 | 啟動流程時把執行編號寫回傳進來的範本，匯入那條路傳的是共用母版會互相覆蓋 | ⚠️ 09-20 複查：會踩到的那條路徑已隨 v1 殘留端點清理被刪（順手消失非刻意修），但「傳什麼就寫回那份」的機制原封不動，下一個接這支 API 的人傳母版就重現 | §3.2 第 15 |
| **任務平台** | 套件裡兩組已接上但沒人使用的服務完全沒有權限檢查，接上就開 | 加提醒註解，或直接拿掉這兩個備用服務 | §3.2 第 16 |
| **任務平台** | 三支成員管理服務的「用編號查資料」永遠回空，補完權限拿它測會得到假通過 | 修好它，或把倚賴它的那組方法整組拿掉 | §3.2 第 17 |
| **任務平台** | 有一組流程參與者服務接上但沒人使用，只有 AI 儀表板會讀它的資料 | 拿掉，或加註解提醒啟用前先修第 63 項 | §3.2 第 18b |
| **任務平台** | 流程參與者表在開發環境 0 筆，修改或刪除一定出錯，等於完全不能用 | 與中風險第 63 項合併同一張工單 | §3.2 第 19 |
| **任務平台** | 專案啟動時的成員同步刻意繞過套件權限檢查直接寫資料層，這是第五處 | 與主彙整頁 §7 甲組同一個決策，改時六處一起接 | §3.2 第 20 |
| **任務平台** | 🔴「批次新增指派」後端恆回空陣列但前端真的在呼叫，畫面顯示成功卻沒寫入 | 建議另開工單處理，不屬資安掃描範圍 | §3.2 第 21 |
| **任務平台** | 基線檔有一支能擋住異常寫入的觸發程序，開發環境這張表掛了 0 個 | 屬出貨鏈範圍，通知 FR-093 線處理。⚠️ 09-20 複查：**比原本寫的更難修**——那支函式要讀的三個欄位這張表根本沒有，現在補掛第一筆寫入就會炸（該表已 12,573 筆），函式要先改 | §3.2 第 22 |
| **任務平台** | 四支任務指派相關方法目前零取用、零守門，接上就開 | 接上前必須先補守門 | §3.2 第 23 |
| **意見回饋** | 沒有被分配部門的一般使用者送不出意見回饋，而且看不出原因 | 屬產品決策：放寬新增規則／規定必有部門／改訊息 | §3.2 第 18 |
| **問卷**<br>🆕 | Excel 匯入失敗時暫存檔永遠留在磁碟上，每失敗一次留一個 | 刪檔那句移進 `finally`＋補上檔案大小上限 | §3.2 第 24 |
| **證據自動分類**<br>🆕 | 分類失敗時錯誤訊息原文直接存進批次、前端看得到 | `_fail_batch` 改存固定錯誤碼，原文只進 log | §3.2 第 25 |
| **證據自動分類**<br>🆕 | 正解答案表匯入幾乎不驗內容，尺被亂改整份報表失真且不報錯 | 加筆數上限、值型別、鍵比對目錄 | §3.2 第 26 |
| **證據自動分類**<br>🆕 | AI 分類設定的「預設廠商／預設型號」存得進去但分類時沒人讀 | 解析鏈各加一層讀設定值 | §3.2 第 27 |
| **弱點掃描**<br>🆕 | 「共享」這個範圍值三層各認一套，建立掃描基準時填不出來、但改的時候改得成 | 三層值域對齊（目前還沒真的壞掉） | §3.2 第 28 |
| **弱點掃描**<br>🆕 | 套件自帶的建表腳本值域停在舊版，跟主線已經對不上 | 屬出貨基線待重產，重不重產由決策者裁 | §3.2 第 29 |

---

## 一個反覆出現的模式

**「只驗證登入、不檢查東西是不是你的」這一種病，在七支不同套件裡出現過**，光是高風險就佔了 12 條。修法本身可以照抄，但要真正解決，得改掉容易犯這種錯的寫法本身。

🔴 **「客戶層級的權限，改到的卻是全系統共用的那一份設定」已經出現兩次**——登入安全政策（第 74 項）與日誌轉送目的地（第 75 項）是同一個形狀。兩件事要一起做產品決策、一起開工單；往後看到「客戶層級權限＋全系統單一設定列」這個組合就該直接懷疑。

**「密碼被寫進版本控制」已經出現四種樣態**（測試設定檔、登入金鑰、散在 249 個檔的資料庫密碼、AI 助理記憶檔），九成都是因為「查資料庫用的指令」被原封不動貼進文件或對話紀錄。不改變查資料庫、寫文件的習慣，清乾淨了一樣會再長出來。

---

## 怎麼用這一頁

| 你想做什麼 | 看哪裡 |
|---|---|
| 排修正的優先順序 | 本頁由上往下就是順序 |
| 知道某一條的完整描述、檔名行號、修法細節 | 回[主彙整頁](index.html) §2.2 與 §3，用「出處」欄的編號查 |
| 知道哪幾條可以一起修 | [主彙整頁](index.html) §4 分組索引 |
| 知道哪些地方還沒檢查過 | [主彙整頁](index.html) §0.5 總狀態表 |
| 知道有哪些事在等你拍板 | [主彙整頁](index.html) §7 |
