---
title: 稽核輪次管理
eyebrow: Guidant AI 資安檢視 · 模組報告
h1: 稽核輪次管理（jedi-compliance-audit）
lede: 管一輪稽核從開始到結案的那一塊——輪次、審閱簽核、稽核結果、改善計畫都在這裡。**審閱簽核這條路守得很好**；但同一家公司裡不是這個專案的人，換個網址就看得到別人專案的稽核判定、風險評等與改善計畫（十支讀取入口同一個漏法），其中一支跨客戶也打得到。
---

## 這塊在產品裡做什麼

一個稽核專案建好之後，**實際「跑一輪稽核」的過程由這一塊負責**：

::: grid2
::: {.card .plain}
#### 它平常在做什麼
1. **稽核輪次**——這是第幾輪、查哪一份系統安全計畫、現在走到哪個階段
2. **審閱簽核**——稽核員看完一條控制項，按下「我確認看過了」
3. **稽核結果**——每一條的判定、風險、觀察紀錄（可以用 Excel 匯入）
4. **改善計畫**——查出缺失之後，誰在什麼時候要補什麼
5. **稽核計畫匯入**——把客戶提供的 Word 稽核計畫讀進系統
:::
::: {.card .warn}
#### 為什麼它是敏感目標
**「簽核」與「稽核判定」本身就是稽核的價值所在。**

一份稽核報告之所以有效，是因為它記錄了「某位有資格的稽核員，在某個時間，對這一條下了什麼判定」。

**如果判定可以被不該看的人看到、被受稽核的一方改掉，那這份稽核報告的公信力就沒了。** 這跟資料外洩是不同性質的風險——**它損害的是產品本身的可信度。**
:::
:::

---

## 檢視軌跡

**檢視期間**：2026-09-23 ～ 2026-09-24｜**範圍**：124 個檔案、12,255 行（模組本體與我們主系統兩邊去重後）｜**共 9 輪，每輪跑兩次掃描**

> **原始技術報告**放在需求中心的 [FR-116 站](https://guidantai-feature-doc.jedicotech.com/FR-116-2609-compliance-audit-security-scan/)，檔名見下表最後一欄。那裡有每一輪的完整技術細節、檔案清單與逐條推理，供需要深究或稽核抽查時查閱。

**為什麼每一輪要跑兩次**：這塊的程式分在兩個地方（模組本體、我們主系統的接線），而檢視工具一次只能看其中一邊——**範圍跨兩邊時，另一邊會被安靜地丟掉、不會報錯**。所以每一輪都分兩次掃，執行者再手動核對兩邊接起來的地方。

| 輪次 | 查什麼 | 檔數（模組＋主系統） | 覆核投票 | 結果 | 原始報告檔名 |
|---|---|---:|---|---|---|
| **C1b** | 任務設定樹、「目前的系統安全計畫」、稽核員待辦清單 | 19＋2 | 6 票全投完 | 找到 2 條低（第 4、5 條）；**待辦清單查過不成立** | `scan-C1b` |
| **C2a** | 稽核輪次主體 | 8＋2 | 18 票全投完 | 找到 1 條低（第 6 條）；輪次讀取八支全漏＝第 1 條 | `scan-C2a` |
| **C2b** | 階段歷程、回退標記、規劃完成度檢查 | 14＋1 | 9 票全投完 | **淨新增 0**（三條都與 C2a 重複）；工作單點名的四件全不成立 | `scan-C2b` |
| **C3** | 稽核結果與改善計畫 | 5＋1 | 15 票全投完 | **淨新增 0，但第 1 條升為高**——三位檢查員一致評高 | `scan-C3` |
| **C1** | 整體接線＋審閱簽核 | 20＋2 | 18 票全投完 | **淨新增 0**；審閱簽核那條被三位檢查員一致否決（見下） | `scan-C1` |
| **C5** | 程序書文件池的資料存取 | 9＋3 | 12 票全投完 | **淨新增 0**；都是[合規文件核心](M11-oscal.html)第 11、12 條 | `scan-C5` |
| **C1c** | 專案清單、詳細與稽核計畫的主系統路由 | 9＋2 | 12 票全投完 | **淨新增 0**；兩條都是第 1 條，後來由 CM-2172 補上 | `scan-C1c` |
| **C4a** | 稽核計畫 Word 匯入 | 13＋1 | 12 票全投完 | 找到 3 條（第 2 條中、第 7、8 條低）；**兩邊各自獨立掃到第 2 條** | `scan-C4a` |
| **C4b** | 稽核結果 Excel 匯入 | 18＋1 | 9 票全投完 | 找到 2 條（第 3 條中、第 9 條低） | `scan-C4b` |

::: {.callout .ok}
**每一輪的覆核都跑完整**

九輪兩邊全部拿到完成證明、票數全投完。有幾邊（C1b、C2b 的主系統那一邊）工具一條疑點都沒提，執行者都有開紀錄確認**是真的讀完了才零發現、不是被中斷**。
:::

::: {.callout .ok}
**審閱簽核這條路，查完確認是守得住的**

這塊把關拆成三層，**而且系統啟動時如果沒把這三層接好，它會直接拒絕啟動**——程式旁邊寫著「缺把關要吵，不要安靜」。這是全案看過做法最保守的一塊，正好治的是[任務與成員管理](M10-task-platform.html)第 8 條那種「漏接一條線、整支靜默全開」的病。

簽核那條路**入口檢查「客戶有沒有買這個功能」、後面再檢查「你在這個專案是不是管理者或審核者」，兩道都在**。三位檢查員對「簽核零件沒裝就放行」那條一致否決——目前唯一組裝它的地方兩個零件都有裝。

**但要留一句**：那道「沒接好就不准啟動」只檢查入口那三道，**管不到後面服務裡的零件**。審閱簽核、系統安全計畫匯出兩處都還是「有裝零件才檢查、沒裝就放行」的寫法，今天都有裝、不出事，是日後改接線時要記得的地雷。
:::

::: {.callout .warn}
**有兩條是執行者開檔查出、沒有經過三人重查投票**

第 7 條（解析工作單的隔離規則寫錯）與第 9 條（確認匯入時佐證照單全收）不在工具的正式清單裡，是執行者照工作單逐項開檔、到開發環境用唯讀方式模擬五種身分實測查出的，統籌者復核屬實。**「這兩條存在嗎」可信；它們沒有經過投票這一關。**
:::

---

## 問題一覽

**排序按風險，同風險的同一類排在一起。**「出事會怎樣」那欄講的是**業務影響**——誰受影響、損失什麼，不是技術現象。

| # | 問題 | 風險 | 分類 | 出事會怎樣（誰受影響） | 怎麼修 | 狀態 |
|---|---|---|---|---|---|---|
| **1** | **同一家公司裡不是這個專案的人，換個網址就看得到別人專案的稽核輪次、稽核判定、風險評等與改善計畫**——十支讀取入口同一個漏法 | 🟠 高 | 只驗登入、不檢查歸屬 | **看得到的是別的專案的稽核判定內容、風險評等、改善計畫與負責人姓名**——比輪次清單機密得多。其中「稽核團隊名單」那支（含 Email、電話）底下的資料表沒有客戶隔離，**跨客戶也打得到** | 十支入口開頭都先確認「你是這個專案的成員」。修正分支已補其中八支（**還沒合回主線**）；另兩支（稽核計畫選單、稽核計畫儀表板）**不在任何修正卡範圍**；團隊名單那支現在的修法擋不住跨客戶，**已裁定退回重修** | ✅ **已修，1.21.0 出貨**（八支 CM-2037，commit `cd9223592`；團隊名單查不到輪次回找不到、稽核計畫選單與儀表板補成員檢查 CM-2172，commit `0808b3c8a`） |
| **2** | 稽核員在稽核計畫頁匯入一份不到 20MB、解開幾十 GB 的 Word（壓縮炸彈） | 🟡 中 | 資源耗盡 | 系統只量上傳檔多大、不量解開後多大，打開檔案時整份塞進記憶體，**處理程序被砍，連送幾份，所有客戶一起停擺**。要先是某個專案的稽核員或管理者、計畫還在規劃階段 | 在這個模組共用的讀檔程式裡，打開檔案之前先檢查解開後總大小與膨脹倍率。**與[合規文件核心](M11-oscal.html)第 23、24 條同病：四個入口分在兩處程式，同一張卡、同一支檢查函式** | ✅ **已修（FR-114 CM-2181，commit BE `48638cbdb`／套件 `2cb9d2cd`，1.21.0 出貨）** |
| **3** | 稽核員匯入稽核紀錄 Excel 時，只要在很後面的某一列填一格，系統就從頭一列列讀到那裡 | 🟡 中 | 資源耗盡 | 一份幾 KB、看起來正常的稽核表就能騙過格式檢查。實測：4.9KB 的檔在第 20 萬列填一格，耗時 10.9 秒、吃掉 355MB；推算到 Excel 最後一列約 57 秒、1.9GB，**這段時間資料庫交易一直開著**。**成本比壓縮炸彈更低**——幾 KB 的普通檔就夠 | 改成一列一列串流讀、遇空格不建物件；加列數上限（真實表只有一百多列）；連續多列全空就停。與第 2 條同一張卡、同一次發版 | ✅ **已修（FR-114 CM-2181，commit BE `48638cbdb`／套件 `2cb9d2cd`，1.21.0 出貨）** |
| **4** | 同一家客戶任何帳號都看得到任何專案的「任務設定樹」 | ⚪ 低 | 只驗登入、不檢查歸屬 | 看到控制群組、控制項、評估目標，以及每個目標底下的任務數與被指派人姓名。網址上的專案編號收了卻沒用，後面那個編號程式一次猜三種（專案、輪次、稽核計畫），手上有任何一種都能打。不跨客戶；**前端已經沒有畫面在用這支網址** | **已裁定：拆掉網址**（與第 5 條同批，改模組要發版） | 🗑️ **已拆除，1.21.0 出貨**（CM-2176，commit `553381efe`） |
| **5** | 同一家客戶的非成員，知道專案編號就問得出那個專案「目前的系統安全計畫」編號與狀態 | ⚪ 低 | 只驗登入、不檢查歸屬 | 傷害小：只洩漏一個隨機編號和狀態；拿到編號後其他相關網址各自有檢查擋著。前端沒有任何地方在用 | **已裁定：拆掉網址**，與第 4 條同批 | 🗑️ **已拆除，1.21.0 出貨**（CM-2176，commit `553381efe`） |
| **6** | **專案經理可以改寫、再刪掉稽核人員寫的「改善建議」** | ⚪ 低 | 外部送什麼就收什麼 | 輪次進入「整改中」後，稽核人員會在每個風險底下留一筆改善建議，系統規定它不能刪。但受稽核的一方（專案經理）拿到這筆的編號，用「新增整改計畫」把它當成一般整改計畫送出，系統就當成更新、把內容改掉；**接著「不能刪」的檢查就不成立了，整筆刪掉**。**破壞的是稽核的獨立性與佐證軌跡**。門檻高：必須本來就是這個專案的經理、且輪次在整改中 | **已裁定：改善建議屬稽核方專屬**——類型是「建議」的那筆，拒絕覆蓋與刪除 | ✅ **已修（FR-114 CM-2174，commit BE `a8f1a24b7`／套件 `b7022b8b`，1.21.0 出貨）** |
| **7** | 兩張「解析工作單」資料表的隔離規則，照抄了五月就判定壞掉的寫法 | ⚪ 低 | 客戶資料沒隔開 | 稽核計畫 Word、稽核結果 Excel 的解析工作單，**子公司看得到所有上層母公司的工作單**（開發環境模擬實測：子公司看到母公司 13 筆＋4 筆）。系統安全計畫那張五月就修對了，七月建這兩張時照抄了修正前的寫法。**評低**：程式那一層四步都有檢查公司，今天沒有直接可打的路——是「以為有第二道防線、其實沒有」 | 照五月那次的修法，兩張表一起改；**出貨基線要重產**（動基線屬決策者裁示） | ✅ **已修（FR-114 CM-2195，commit BE `56dd4cdc8`，1.21.0 出貨）** |
| **8** | 稽核計畫 Word 解析器的三條比對規則，遇到特製的超長文字會卡住 | ⚪ 低 | 資源耗盡 | 稽核員上傳一份格式像樣的 Word，在標題或時段那一段塞幾萬個空白。實測 2 萬字：標題日期規則 20.7 秒，長度加倍、時間變四倍；一份幾十 KB 的檔就能卡住處理程序到逾時 | 段落文字進比對前先截長度；三條規則改寫成不會來回重試的寫法 | ✅ **已修（FR-114 CM-2181，commit BE `48638cbdb`／套件 `2cb9d2cd`，1.21.0 出貨）** |
| **9** | 確認匯入稽核結果時，每筆觀察的佐證照畫面送來的存，不核對是不是這一輪的佐證 | ⚪ 低 | 外部送什麼就收什麼 | 稽核員 A 在按「確認匯入」前改掉送出的資料，塞一個不屬於這一輪的檔案、或一個自己的網址。之後同專案的管理者 B 點開那筆佐證：**檔案會直接預覽出 A 指定的那份，連結會開新分頁（可拿來釣同事）**。評低：一般「新增觀察」那條路同樣不驗、不是新洞；檔案那半跨客戶打不開 | 確認時只收預覽時算好的候選佐證；連結只收一般網址。**檔案那半要等[檔案上傳](M02-file-upload.html)那塊補上歸屬檢查才真正關得起來** | ✅ **已修（FR-114 CM-2174，commit BE `a8f1a24b7`／套件 `b7022b8b`，1.21.0 出貨）** |

---

::: {.callout .plain}
**下面只展開需要你自己判斷、或容易被誤解的幾條。** 其餘的修法明確，看上面表格的「怎麼修」那一欄就夠了——**沒有展開不代表沒查，也不代表不重要。**
:::

## 第 1 條：十支讀取入口，同一個漏法 {#round-reads}

**在哪個畫面發生**：專案裡的稽核輪次頁、稽核計畫頁、稽核結果與改善計畫頁。**同一家公司裡不是這個專案的人**，在網址上換成別人的專案編號。

**問題是什麼**：這些入口檢查了「你有沒有登入」、「你的公司有沒有買這個功能」，**就是沒問「你是不是這個專案的人」**。後面的程式只確認「這個輪次存在」，就把內容整包回傳。

| 入口 | 看得到什麼 | 有沒有補 |
|---|---|---|
| 輪次清單、單筆輪次 | 輪次名稱、狀態、起訖日、建立與修改者、系統安全計畫編號 | ✅ 已補（1.21.0 出貨） |
| 稽核計畫內容 | 這一輪要查哪些、抽查誰、行程 | ✅ 已補（1.21.0 出貨） |
| **稽核團隊名單** | 稽核員的姓名、Email、電話——**跨客戶也打得到** | ✅ 已補：查不到輪次就回找不到（CM-2172，1.21.0 出貨） |
| 稽核發現、風險、判定矩陣 | **每一條的判定與風險評等** | ✅ 已補（1.21.0 出貨） |
| 改善計畫清單與詳情 | 誰要在什麼時候補什麼、負責人姓名 | ✅ 已補（1.21.0 出貨） |
| 稽核計畫選單、稽核計畫儀表板 | 輪次名稱、進度統計 | ✅ 已補（CM-2172，1.21.0 出貨） |

**為什麼從中升到高**：最早登記時只看到輪次清單（名稱、狀態、日期），評中。逐塊查下去發現同一個漏法延伸到稽核判定與改善計畫——**那是受稽核單位最不想被別的部門看到的東西**，三位檢查員一致評高。同一張修正卡涵蓋這些入口，嚴重度取最重的那支。

**團隊名單那支為什麼跨客戶**：它底下的資料表（稽核計畫、人員）**沒有客戶隔離**，程式也不經過任何有隔離的表。第一版修法寫成「查得到輪次才檢查」——跨客戶時輪次被隔離藏起來、查不到，**檢查就整段跳過**。現行做法是「查不到輪次就回找不到」（CM-2172）。

::: {.callout .warn}
**儀表板那支只補一處不夠**

稽核計畫儀表板要補兩處：服務層的成員檢查，**加上**資料層那段「由輪次編號找資料」的查詢也要比對專案——只補前者，成員可以拿自己專案的編號配別專案的輪次編號。
:::

## 第 6 條：受稽核的一方，改得動稽核方的紀錄 {#recommendation}

**在哪個畫面發生**：稽核輪次進入「整改中」後，稽核人員在每個風險底下留一筆「改善建議」。

**為什麼這條要單獨講**：它只評低（要先是那個專案的經理、輪次在整改中），但**它破壞的是稽核最根本的一件事——稽核方與受稽核方的分工**。專案經理是受稽核的一方，稽核人員寫的建議是稽核方的紀錄；受稽核方能把它改寫、再刪掉，事後就看不出稽核人員原本寫了什麼。

三位檢查員投 2:1：反對那票認為經理本來就有權改整改計畫；另兩票認為建議屬稽核方的紀錄。

::: {.callout .decided}
**已裁定：改善建議屬稽核方專屬**

類型是「建議」的那筆，拒絕覆蓋、拒絕刪除。**不採用「經理可改但留痕」**——那需要新的資料結構，而且留痕只解決「看得出被改過」，不解決「不該被改」。
:::

## 第 7 條：以為有第二道防線，其實沒有 {#parse-jobs}

這條今天打不到，評低，但它是一個值得記住的形狀：**同一個錯誤被修好一次之後，又被照抄到新的東西上**。

- 五月發現系統安全計畫那張解析工作單的隔離規則「三處全壞」，修好了。
- 七月新建稽核計畫、稽核結果兩張同類的表時，**照抄的是修正前的寫法**。
- 九月另一支資料庫調整還把它當參考範本。

[授權管理那塊](M18-license.html)也有同一個教訓：修洞時新建的表，一出生就帶著寫反的規則。**新建資料表時，隔離規則要當成必檢項目，不能照抄隔壁。**

---

## 這塊的結論

::: {.callout .warn}
**一句話**：這塊查完了，**找到 9 條，其中 1 條高風險**——十支讀取入口不問「你是不是這個專案的人」，看得到的是別人專案的稽核判定與改善計畫，其中一支跨客戶也打得到。**審閱簽核這條最關鍵的路是守得住的**，把關骨架是全案做法最保守的一塊。

**建議的處理順序**：

**1.21.0 出貨時九條都已處理**：第 1～3、6～9 條已修，第 4、5 條的網址已拆。要記住的是：

1. **第 1 條的十支讀取入口是分兩次補齊的**——哪天新增讀取入口，照「先由專案編號查出專案、再確認你是成員；查不到輪次一律回找不到」這個寫法，不要回到「查得到才檢查」。
2. **第 6 條守的是稽核獨立性**——改善建議是稽核方專屬，整改計畫的任何新寫法都不能繞過這道判斷。
3. **第 7 條動過出貨基線**，新表照抄隔離規則時要抄修好的寫法。

**最後要說清楚兩件事**：

- **「查完」不等於「查乾淨」。** 我們能說的是「這 9 輪在這些檔案裡找到這幾條」，不能說「這塊只有這幾條」。
:::

| 統計 | |
|---|---|
| 檢視輪數 | **9 輪**（每輪模組本體與主系統各掃一次）、124 個檔案 12,255 行 |
| 找到的問題 | **9 條** |
| ↳ 高風險 | **1 條**（第 1 條） |
| ↳ 中風險 | **2 條**（第 2、3 條） |
| ↳ 低風險 | **6 條** |
| 已修 | 7 條（第 1、2、3、6、7、8、9 條，1.21.0 出貨） |
| 已拆除 | 2 條（第 4、5 條，1.21.0 出貨） |

---

| 你想知道 | 看哪裡 |
|---|---|
| 為什麼每一輪要掃兩次 | [檢視方法與工具 · 怎麼切也有講究](GUIDE-01-method-and-tools.html#batching) |
| 「沒接線就靜默全開」在別處的實例 | [任務與成員管理](M10-task-platform.html) 第 8 條 |
| 我們用什麼方法查、結果有多可信 | [檢視方法與工具](GUIDE-01-method-and-tools.html) |
| 其他模組的檢視結果 | [回總報告首頁](index.html) |
