Guidant AI 資安檢視 · 模組報告

稽核輪次管理(jedi-compliance-audit)

管一輪稽核從開始到結案的那一塊——輪次、審閱簽核、稽核結果、改善計畫都在這裡。審閱簽核這條路守得很好;但同一家公司裡不是這個專案的人,換個網址就看得到別人專案的稽核判定、風險評等與改善計畫(十支讀取入口同一個漏法),其中一支跨客戶也打得到。九條問題已全部修好或拆除,隨 1.21.0 出貨。

§1

這塊在產品裡做什麼

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

它平常在做什麼

  1. 稽核輪次——這是第幾輪、查哪一份系統安全計畫、現在走到哪個階段
  2. 審閱簽核——稽核員看完一條控制項,按下「我確認看過了」
  3. 稽核結果——每一條的判定、風險、觀察紀錄(可以用 Excel 匯入)
  4. 改善計畫——查出缺失之後,誰在什麼時候要補什麼
  5. 稽核計畫匯入——把客戶提供的 Word 稽核計畫讀進系統

為什麼它是敏感目標

「簽核」與「稽核判定」本身就是稽核的價值所在。

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

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


§2

檢視軌跡

檢視期間:2026-09-23 ~ 2026-09-24|範圍:124 個檔案、12,255 行(模組本體與我們主系統兩邊去重後)|共 9 輪,每輪跑兩次掃描

原始技術報告放在需求中心的 FR-116 站,檔名見下表最後一欄。那裡有每一輪的完整技術細節、檔案清單與逐條推理,供需要深究或稽核抽查時查閱。

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

輪次 查什麼 檔數(模組+主系統) 覆核投票 結果 原始報告檔名
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;都是合規文件核心第 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

每一輪的覆核都跑完整

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

審閱簽核這條路,查完確認是守得住的

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

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

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

有兩條是執行者開檔查出、沒有經過三人重查投票

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


§3

問題一覽

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

# 問題 風險 分類 出事會怎樣(誰受影響) 怎麼修 狀態
1 同一家公司裡不是這個專案的人,換個網址就看得到別人專案的稽核輪次、稽核判定、風險評等與改善計畫——十支讀取入口同一個漏法 🟠 高 只驗登入、不檢查歸屬 看得到的是別的專案的稽核判定內容、風險評等、改善計畫與負責人姓名——比輪次清單機密得多。其中「稽核團隊名單」那支(含 Email、電話)底下的資料表沒有客戶隔離,跨客戶也打得到 十支入口開頭都先確認「你是這個專案的成員」;團隊名單那支改成「查不到輪次就回找不到」,才擋得住跨客戶 ✅ 已修,1.21.0 出貨(八支 CM-2037,commit cd9223592;團隊名單查不到輪次回找不到、稽核計畫選單與儀表板補成員檢查 CM-2172,commit 0808b3c8a)
2 稽核員在稽核計畫頁匯入一份不到 20MB、解開幾十 GB 的 Word(壓縮炸彈) 🟡 中 資源耗盡 系統只量上傳檔多大、不量解開後多大,打開檔案時整份塞進記憶體,處理程序被砍,連送幾份,所有客戶一起停擺。要先是某個專案的稽核員或管理者、計畫還在規劃階段 在這個模組共用的讀檔程式裡,打開檔案之前先檢查解開後總大小與膨脹倍率。與合規文件核心第 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 指定的那份,連結會開新分頁(可拿來釣同事)。評低:一般「新增觀察」那條路同樣不驗、不是新洞;檔案那半跨客戶打不開 確認時只收預覽時算好的候選佐證;連結只收一般網址。檔案那半要等檔案上傳那塊補上歸屬檢查才真正關得起來 ✅ 已修(FR-114 CM-2174,commit BE a8f1a24b7/套件 b7022b8b,1.21.0 出貨)

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

§4

第 1 條:十支讀取入口,同一個漏法

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

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

入口 看得到什麼 有沒有補
輪次清單、單筆輪次 輪次名稱、狀態、起訖日、建立與修改者、系統安全計畫編號 ✅ 已補(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)。

儀表板那支只補一處不夠

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

§5

第 6 條:受稽核的一方,改得動稽核方的紀錄

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

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

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

已裁定:改善建議屬稽核方專屬

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

§6

第 7 條:以為有第二道防線,其實沒有

這條檢視當時打不到,評低(已修,CM-2195),但它是一個值得記住的形狀:同一個錯誤被修好一次之後,又被照抄到新的東西上。

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

授權管理那塊也有同一個教訓:修洞時新建的表,一出生就帶著寫反的規則。新建資料表時,隔離規則要當成必檢項目,不能照抄隔壁。


§7

這塊的結論

一句話:這塊查完了,找到 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 出貨)
未修 0 條

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