Guidant AI 資安檢視 · 模組報告
產品最核心的一塊——控制項、系統安全計畫、稽核計畫都在這裡產生,客戶的合規範本也在這裡管。這塊底下 45 張資料表完全沒有客戶隔離,程式那一層是唯一的關卡;而那一層最常見的漏法是「有人守了一半」。最要緊的一條:任何登入帳號知道編號,就能把別家公司整份系統安全計畫下載走。37 條資安問題已全部處理(34 條已修、2 條部分修、1 條拆除),隨 1.21.0 出貨;剩下的待辦是 SaaS 版上線前要補的資料庫最後一道牆。
客戶買這套系統,是為了做合規稽核。而稽核的主要文件都在這一塊產生與保存:
還包含這些文件的 Word/Excel/YAML 匯入匯出,以及原廠上傳 CMMC 官方 PDF 自動讀出控制項。
這裡存的就是客戶的稽核成果本身。
其他模組被攻破,外洩的是帳號、清單、設定。這一塊被攻破,外洩或被竄改的是客戶花幾個月做出來的合規證據——而那正是客戶買這套系統的理由。
更要緊的是:這塊底下 45 張資料表完全沒有「這是哪家客戶的」欄位,資料庫那道「每個客戶只能看自己資料」的隔離一張都沒開。 程式漏掉一道檢查,資料庫不會替你擋。
它分成方向相反的兩半,檢視時也分開查:
| 它是什麼 | 要擔心的是什麼 | |
|---|---|---|
| 我們主系統這一邊(含合規範本那一整塊) | 決定「誰能讀、誰能改」這些文件的那部分程式 | 權限檢查有沒有做、做得對不對——會不會別人的計畫也讀得到、別人的範本也改得動 |
| 模組本體 | 純粹的資料存取與格式轉換,沒有任何對外入口 | 它自己不檢查任何事、全靠呼叫它的人先檢查;以及惡意檔案——一份動過手腳的 Word、Excel、PDF 會不會讓系統當掉 |
檢視期間:2026-09-21 ~ 2026-09-24|範圍:244 個檔案——我們主系統這一邊 94 個、合規範本那一整塊 70 個、模組本體與主系統的文件解析器 80 個|共 27 輪
原始技術報告放在需求中心兩個站:主系統這一邊與合規範本在 FR-113 站、模組本體在 FR-118 站,檔名見下表最後一欄。那裡有每一輪的完整技術細節、檔案清單與逐條推理,供需要深究或稽核抽查時查閱。
| 輪次 | 查什麼 | 檔數 | 覆核投票 | 結果 | 原始報告檔名 |
|---|---|---|---|---|---|
| O1 | 控制項實作與「你能不能看、能不能改這份計畫」的判斷核心 | 6 | 15 票全投完 | 找到 2 條中(第 11 條) | scan-O1 |
| O2 | 資源庫、原廠公版範本、系統安全計畫匯出成 Word | 11 | 24 票全投完 | 找到 3 條(第 5、13、18 條),第 5 條是這塊第一條高等級發現 | scan-O2 |
| O3a | Excel 上傳與確認:誰能傳、誰能看預覽、誰能按確認 | 5 | 6 票全投完 | 找到 2 條(第 2 條高、第 23 條中) | scan-O3a |
| O4 | Word 上傳與解析:三個去向(寫進專案、建新範本、蓋掉既有範本) | 9 | 12 票全投完 | 找到 3 條(第 3 條高、第 19、24 條中) | scan-O4 |
| O5 | 系統安全計畫的六種附屬資料的增刪改查 | 15 | 15 票全投完 | 範圍內零發現、而且是有份量的零(六組逐支守齊);越界撿到第 1 條 | scan-O5 |
| O6 | 程序書文件池與匯入比對 | 6 | ⚠️ 覆核未完整跑成 | 重現第 11 條並補齊細節;找到第 12 條 | scan-O6 |
| O3b | Excel 內容怎麼被讀成系統資料 | 7 | 21 票全投完 | 找到 2 條中(第 23、25 條) | scan-O3b |
| O8a | 原廠上傳框架 PDF 的解析工作 | 6 | 12 票全投完 | 找到 1 條中(第 22 條,執行者開檔查出) | scan-O8a |
| O8b | 合規框架與版本的增刪改查 | 9 | 21 票全投完 | 找到 1 條中(第 27 條,執行者開檔查出) | scan-O8b |
| O9a | Excel 與 Word 兩條匯入線共用的那段轉換程式 | 3 | 9 票全投完 | 三條都是第 2、3 條的同位置重現,淨新增 0 | scan-O9a |
| O9b | 整體接線、稽核階段掛鉤、人員對帳 | 17 | ⚠️ 覆核未完整跑成 | 淨新增 0;確認權限判斷那支程式少接一個零件,但少接之後走的路比正常更嚴格,不用重評前面各輪 | scan-O9b |
| 輪次 | 查什麼 | 檔數 | 覆核投票 | 結果 | 原始報告檔名 |
|---|---|---|---|---|---|
| B1 | 合規範本本身的增刪改查 | 19 | 6 票全投完 | 找到 2 條中(第 5、14 條) | scan-B1 |
| B1-item | 範本的稽核流程圖 | 4 | ⚠️ 只投了一半(應投 6 票、實投 3 票) | 找到 3 條中(第 6、7、15 條) | scan-B1-item |
| B2 | 範本底下三組清單:控制項預設、稽核目標預設、程序書 | 12 | 6 票全投完 | 找到 2 條中(第 16、17 條) | scan-B2 |
| B3 | 範本版的六類附屬資料+範本匯出 | 15 | 39 票全投完 | 找到 12 條,歸成第 4、8、28 條——這一塊收穫最大的一輪 | scan-B3 |
| B4 | 系統安全計畫匯出成 Excel 範本的三個入口 | 2 | 9 票全投完 | 找到 2 條(第 20 條中、第 31 條低),並確認第 1 條是跨客戶 | scan-B4 |
| B5 | 範本控制項清單的 Excel 匯出匯入 | 3 | 6 票全投完 | 找到 1 條中(第 9 條) | scan-B5 |
| B6 | 產生 Excel 的底層七支程式 | 7 | 6 票全投完 | 找到 1 條中(第 21 條),把「惡意公式」整條路查到底 | scan-B6 |
| B1c | 用 YAML 或 Excel 整批匯入合規範本 | 8 | 9 票全投完 | 找到 3 條(第 10 條中、第 34、35 條低) | scan-B1c |
| 輪次 | 查什麼 | 檔數 | 覆核投票 | 結果 | 原始報告檔名 |
|---|---|---|---|---|---|
| V2 | 稽核計畫、稽核結果、改善計畫的資料存取 | 26 | 一個疑點都沒提 | 執行者照工作單核對出 1 條低(第 29 條);⚠️ 執行者沒有逐支讀完 26 個檔,這一輪可信度最低 | scan-V2 |
| V1 | 系統安全計畫本體、深複製與凍結 | 21 | 一個疑點都沒提 | 資安 0 條;非資安 1 條(第 38 條)。卡片最擔心的「凍結的計畫被事後改掉」不成立 | scan-V1 |
| V8 | 主系統的稽核計畫服務 | 1 | 9 票全投完 | 找到 1 條低(第 33 條);另兩支讀取與稽核輪次管理第 1 條同一件事 | scan-V8 |
| V4b | 原廠 CMMC 官方 PDF/Excel 解析器 | 8 | 一個疑點都沒提 | 執行者自己做惡意 PDF 實測,查出 2 條低(第 36、37 條) | scan-V4b |
| W1 | 主系統的 Word 內容抽取器 | 5 | 9 票全投完 | 併進第 26 條(四處)、另 1 條低(第 32 條);每條都實測重現 | scan-W1 |
| W2 | 主系統的 CMMC 格式轉換器 | 4 | 3 票全投完 | 併進第 26 條(兩處),實測重現 | scan-W2 |
| V4a | 控制項目錄、基準線、框架 | 14 | 一個疑點都沒提 | 執行者開檔追出 1 條低(第 30 條),並查出第 27 條要換一種查法才擋得住 | scan-V4a |
| V3 | 整份文件匯入匯出 | 1 | 一個疑點都沒提 | 資安 0 條;非資安 1 條(第 39 條) | scan-V3 |
三輪的覆核沒有跑完整,這裡照實交代
這三輪涵蓋的 27 個檔案,不能當成「查乾淨了」。
模組本體那幾輪「一個疑點都沒提」,靠的是實測,不是空手而回
模組本體有五輪工具一條疑點都沒提出來。其中四輪的結論來自執行者自己動手:V4b 手做 7 種惡意 PDF 量時間與記憶體、拿正常 PDF 亂數變造 3,000 次;W1、W2 把範圍內每一條比對規則拿攻擊字串實跑;V1、V4a 逐支讀完、到開發環境唯讀查資料表。這幾輪「找到的存在嗎」可信度高,因為有實測數字。
例外是 V2:執行者只核了工作單點名的六件、沒有逐支讀完 26 個檔,還把該做的跨專案追查推回給統籌者(已由統籌者查完)。V2 這 26 個檔的「只有這幾條嗎」可信度低。
兩個交接時的擔心,查下去不成立
目前沒有任何入口讓使用者直接給一份 OSCAL 格式的文件;日後若要開放「上傳 OSCAL JSON」或「匯出成 OSCAL JSON」,開放之前必須先補守門——模組本體照單全收呼叫者給的內容。
排序按風險,同風險的同一類排在一起。「出事會怎樣」那欄講的是業務影響——誰受影響、損失什麼,不是技術現象。
| # | 問題 | 風險 | 分類 | 出事會怎樣(誰受影響) | 怎麼修 | 狀態 |
|---|---|---|---|---|---|---|
| 1 | 🔴 任何登入帳號知道一份系統安全計畫的編號,就能把它整份下載成 Excel——而且跨客戶 | 🟠 高 | 只驗登入、不檢查歸屬 | 等於把另一家公司的整份稽核底稿端走:人員姓名、email、電話、地址,設備與 IP、MAC、作業系統,繼承的授權,每一條控制項的做法。只要角色帶「看資源庫」權限,不必是那個專案的成員;計畫編號從別的功能回應裡就拿得到。一個請求就結束 | 照隔壁「匯出」那支已經寫對的做法,在服務一開頭檢查「你是這份計畫的參與者」。同一支服務裡「從範本下載」那支也順手補上程式層檢查 | ✅ 已修(FR-114 CM-2188,commit 82618a297,1.21.0 出貨) |
| 2 | 合規資源庫用 Excel「蓋掉一份既有範本」,從頭到尾不問你是誰 | 🟠 高 | 只驗登入、不檢查歸屬 | 任何登入帳號(連唯讀的稽核員都算)拿一個範本編號,就能把別家公司或原廠公版範本整份清空重寫;之後每個用這份範本開專案的客戶,都複製到被改過的內容。同一條路的另外兩個去向(寫進專案、建新範本)都有檢查 | 上傳與確認兩處都要補:要求範本修改權限+確認範本是自己公司的、原廠公版直接拒絕。與第 3、5 條是同一個缺口的三個入口,一起修 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4;前半由 CM-2040 60015232f,1.21.0 出貨) |
| 3 | 同一件事的 Word 版:匯入 Word 三個去向,唯獨「蓋掉既有範本」只查範本存不存在 | 🟠 高 | 只驗登入、不檢查歸屬 | 後果同第 2 條。證據更強:同一個判斷式裡,建新範本那條旁邊還有十幾行註解解釋為什麼要這樣守,覆寫那條只有一行「查存在」。確認步驟還允許使用者臨時換一個要覆寫的目標 | 補同一道門+驗歸屬;確認時重新檢查、拿掉「確認時可換目標」這個設計。與第 2、5 條一起修 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4,1.21.0 出貨) |
| 4 | 範本裡的人員名單、設備清單、系統元件、繼承授權與系統特性,任何登入帳號拿一個範本編號就讀得到,而且跨公司 | 🟡 中 | 只驗登入、不檢查歸屬 | 外洩的是現成的踩點資料:人員的姓名、email、電話、地址;設備的資產編號、IP、主機名稱;系統開放的通訊協定與連接埠;公司向哪些外部供應商繼承了哪些控制。原廠公版與母公司分享下來的範本,別家公司也讀得到。同一支檔案裡的新增、修改、刪除都有權限檢查,只有讀取漏掉 | 五個讀取入口各補一行「必須有看範本的權限」,一張卡一起補 | ✅ 已修(FR-114 CM-2186,commit aafaa070d,1.21.0 出貨) |
| 5 | 子公司的管理員可以把母公司分享下來、或原廠公版範本的「適用控制項」清單整個改掉甚至清空,底下每條「我們公司怎麼做到」的說明一併刪除 | 🟡 中 | 只驗登入、不檢查歸屬 | 之後每個用這份範本開專案的人,以為在稽核範圍內的控制項其實沒被評估。被害方不會收到通知、畫面上沒有錯誤。同一支程式隔四行,改「分享範圍」那條路有檢查歸屬,改「控制項清單」那條路沒有。評中不評高:要先是某家公司的管理員,而且只打得到有上下層分享關係、或原廠公版的範本 | 在任何寫入之前先比對「這份範本是不是你公司的」——把現有那道檢查從「只在改分享範圍時」搬到「只要有寫入就檢查」 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4;CM-2040 60015232f,1.21.0 出貨) |
| 6 | 改範本流程圖時,只有順便改「分享設定」才會檢查範本是不是自己公司的 | 🟡 中 | 只驗登入、不檢查歸屬 | 有範本修改權限的人,不送分享設定那個欄位,就能改掉原廠公版或母公司範本的稽核流程(一次稽核走哪些步驟、每步誰負責)。跨不跨公司兩位執行者推論不一致、都沒實測,暫以同一家公司內計 | 把歸屬檢查移到那個判斷式外面,方法一進來就先比對 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4,1.21.0 出貨) |
| 7 | 刪或改範本子項時,檢查的是網址上那個子項、動手改的是使用者另外送上來的那份範本 | 🟡 中 | 只驗登入、不檢查歸屬 | 入口的權限只問「你能不能做這個動作」、不看要動哪一份範本。可以造成「刪掉的子項」與「流程圖上被拿掉的方塊」屬於不同範本,資料悄悄對不上、事後很難查 | 兩支方法開頭先用網址上的子項找出它所屬的範本,拒絕另外送上來的範本編號,再比對歸屬 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4,1.21.0 出貨) |
| 8 | 範本底下六類附屬資料(人員、元件、設備、繼承授權、系統特性、設備對照)的新增修改刪除,一支都不問範本是不是你家的 | 🟡 中 | 只驗登入、不檢查歸屬 | 子公司的管理員可以改掉原廠公版或母公司範本裡的這六類資料,之後每個依這份範本開的專案都繼承被改過的基準。最快的是系統特性(一次請求整份蓋掉),最隱蔽的是繼承授權(刪掉後相關連結悄悄斷掉) | 六支服務解出範本後各加一行歸屬檢查——六支要一起補,補五支等於沒補 | ✅ 已修(FR-114 CM-2187,commit 3f15886bb,1.21.0 出貨) |
| 9 | 用 Excel 批次存檔範本的控制項清單,只查範本存不存在、不查是不是你公司的 | 🟡 中 | 只驗登入、不檢查歸屬 | 有建立範本權限的人,可以用 Excel 改掉原廠公版或分享範本的控制項清單 | 存檔前補一行歸屬檢查;同一條解析路徑上的檢核與兩支下載一起補 | ✅ 已修(FR-114 CM-2187,commit 3f15886bb,1.21.0 出貨) |
| 10 | 只被授權「建立範本」的人,走 Excel 整批匯入就能把既有範本整份改掉 | 🟡 中 | 只驗登入、不檢查歸屬 | 同一件事,畫面上一條條改要「修改」權限,走匯入只要「建立」權限——兩個入口、兩套門。範圍是同一家公司內 | 已裁定:只有建立權限不能覆蓋既有範本——匯入走「覆蓋」時多查一次修改權限 | ✅ 已修(FR-114 CM-2178,commit abf1cf8a4,1.21.0 出貨) |
| 11 | 刪除控制項底下的佐證文件、刪除程序書文件庫的文件時,檢查的是「你管不管網址上那份計畫」,刪的卻是「你另外給的那個文件編號」 | 🟡 中 | 只驗登入、不檢查歸屬 | 任何人自己開一個專案(自動是負責人),就能刪掉別的專案、別家公司的佐證文件;文件庫那條還會連帶刪掉所有掛載關聯、可能把實體檔一起永久銷毀。被害者只看到文件無聲消失,紀錄上查不到是誰。凍結的稽核快照也擋不住(檢查的是網址上那份計畫) | 刪除前確認文件屬於這份計畫;模組本體那支刪除只認編號,要一起改 | ✅ 已修(FR-114 CM-2041,commit 15d4efd3c,1.21.0 出貨) |
| 12 | 可以把別人的程序書掛到自己的控制項上,再從回應裡讀到檔案編號去下載 | 🟡 中 | 只驗登入、不檢查歸屬 | 「知道文件編號 → 掛到自己的控制項 → 讀到檔案編號 → 下載」,A 專案的機密程序書被 B 專案的人拿走。跨公司被檔案表的隔離擋住,同一家公司內跨專案沒擋 | 換算文件編號時限定「屬於這份計畫的文件庫」;要改模組本體,兩支掛載方法一起改。與第 11 條同一張卡 | ✅ 已修(FR-114 CM-2173,套件 commit 5170e507/BE commit c4b6bdb16,1.21.0 出貨) |
| 13 | 建立資源庫的入口只驗有沒有登入、沒有權限檢查 | 🟡 中 | 只驗登入、不檢查歸屬 | 公司內任何角色(含唯讀帳號)都能建範本庫;每建一次就複製一整套控制項目錄,又沒有用量上限,重複呼叫就能用很小的代價把資料庫灌大。不跨客戶 | 補上與隔壁同類入口一樣的權限檢查。與第 30 條同一張卡 | ✅ 已修(FR-114 CM-2179,commit 94275d72f;能力點 CM-2040 60015232f,1.21.0 出貨) |
| 14 | 沒被授權看合規範本的員工(選單都看不到),直接打網址就讀走全公司範本清單與每一份的完整內容 | 🟡 中 | 只驗登入、不檢查歸屬 | 同一支檔案裡新增、修改、刪除、複製都有權限檢查,只有兩支讀取漏掉——不是刻意設計,是漏掉。原廠公版與母公司分享的範本跨公司也讀得到 | 兩支讀取補「必須有看範本的權限」。⚠️ 補之前先確認:「建立專案」畫面的下拉選單也用這支,要確認有沒有角色「該能建專案、但不該看資源庫」 | ✅ 已修(FR-114 CM-2186,commit aafaa070d,範本下拉依裁定放寬為「看範本或建專案」,1.21.0 出貨) |
| 15 | 範本的稽核流程圖任何登入帳號都讀得到 | 🟡 中 | 只驗登入、不檢查歸屬 | 讀走一次稽核要走哪些步驟、每步誰負責、順序是什麼;同一支檔案的新增、修改、刪除都要權限 | 補「必須有看範本的權限」;先確認這個權限點存在、現有角色拿得到,否則所有人都會看不到(症狀是永遠被拒、畫面沒有錯誤訊息) | ✅ 已修(FR-114 CM-2186,commit aafaa070d,1.21.0 出貨) |
| 16 | 範本掛了哪些程序書任何登入帳號都列得出來,清單附檔案編號、拿去就能下載整份 | 🟡 中 | 只驗登入、不檢查歸屬 | 讀到清單約等於拿到程序書本身——檔案下載那支只認編號 | 補「必須有看範本的權限」;「檔案下載要不要檢查擁有者」影響全系統,另開評估 | 🟡 部分修(FR-114 CM-2186,commit aafaa070d:讀取入口已補權限;「檔案下載要不要檢查擁有者」另評估,檔案歸屬由 CM-2168 補八類,1.21.0 出貨) |
| 17 | 範本的「稽核目標預設內容」任何登入帳號都讀得到 | 🟡 中 | 只驗登入、不檢查歸屬 | 讀走每條稽核目標的完成狀態、實作說明、備註;同一支檔案的修改、刪除都要權限,隔壁做同一件事的檔案四個入口全掛齊——是漏掉不是設計 | 兩支讀取補「必須有看範本的權限」 | ✅ 已修(FR-114 CM-2186,commit aafaa070d,1.21.0 出貨) |
| 18 | 匯出 Word 時,使用者填的文字沒有當成「純文字」處理就塞進範本 | 🟡 中 | 外部送什麼就收什麼 | 能編輯計畫文字的人,可以在要交給稽核方的正式文件裡插入稽核員沒寫過的段落,或藏一段叫對方 Word 去抓外部內容的指令。匯出的文件內容能被動手腳,等於證據本身不可信 | 產生 Word 時打開「一律當文字處理」的設定(套件預設是關的,要自己開) | ✅ 已修(FR-114 CM-2055,commit f85a82edb,1.21.0 出貨) |
| 19 | 匯出控制項現況的 Excel 時,使用者寫的描述如果以 = 開頭會被寫成公式 |
🟡 中 | 外部送什麼就收什麼 | 複核的人打開匯出檔、按下「啟用內容」,那段指令就在他自己的電腦上執行——我們的防護管不到那台電腦 | 輸出前把開頭的公式字元標成純文字;沿用既有那支共用的處理函式,不要再寫一份 | ✅ 已修(FR-114 CM-2055,commit f85a82edb,1.21.0 出貨) |
| 20 | 上傳時塞進去的惡意公式,會在別人下載範本 Excel 打開時執行 | 🟡 中 | 外部送什麼就收什麼 | 從資料進系統到做成 Excel,六個關卡可以擋、實際擋了零個;而且產生的 Excel 設定成「打開時重新計算」 | 改用共用套件新做好的「標成純文字、內容一字不改」寫法,五處六行逐一列成驗收項;排在那支共用函式發版之後 | ✅ 已修(FR-114 CM-2189,commit 895db0ef8,1.21.0 出貨) |
| 21 | 任何登入帳號改自己的暱稱,就能在全公司下載的每一份範本裡埋一段公式 | 🟡 中 | 外部送什麼就收什麼 | 門檻比第 20 條低得多:暱稱改成公式,之後公司裡任何人下載任何一份範本(連空白範本)都帶著它;顧問帶去客戶那裡打開,公式就在他電腦上跑 | 與第 20 條同一批檔案一次改完 | ✅ 已修(FR-114 CM-2189,commit 895db0ef8,1.21.0 出貨) |
| 22 | 原廠上傳框架 PDF 解析失敗時,把程式出錯的原始訊息整段存起來、再回給前端 | 🟡 中 | 回應夾帶不該送的欄位 | 攻擊者不必猜伺服器裝在哪、用哪一版套件,餵一份壞 PDF 系統就自己說出來;寫資料庫失敗時,連資料庫語句都會帶上。要先是平台管理員,所以評中 | 存進資料庫與回給前端的只放固定錯誤碼與白話訊息,原文只進伺服器日誌;連同寫資料庫那一段一起包住。與第 32 條同一張卡 | ✅ 已修(FR-114 CM-2183,commit c33f7e828,1.21.0 出貨) |
| 23 | 合規資源庫與專案計畫的 Excel 匯入,只量上傳檔多大、不量解開後多大(「試算表炸彈」) | 🟡 中 | 資源耗盡 | 任何登入帳號傳一份 2MB、解開好幾 GB 的檔,處理程序記憶體爆掉被砍,同一台上其他人的請求一起失敗;每分鐘送幾次就持續不可用 | 解析前先檢查解開後總大小與膨脹倍率;改成一列一列讀(不影響功能)。與第 24 條、稽核輪次管理第 2 條同病,四個入口一張卡 | ✅ 已修(FR-114 CM-2181,commit 48638cbdb/套件 2cb9d2cd;同型第五入口(任務匯入)見稽核流程第 23 條,已由 CM-2203 修好,1.21.0 出貨) |
| 24 | 專案計畫的 Word 匯入同樣只量上傳檔多大 | 🟡 中 | 資源耗盡 | 實測:一份 0.32MB 的 Word,打開吃掉 1.9GB 記憶體;而且一份上傳會被完整打開三次 | 同第 23 條;檢查要放在第一次打開之前 | ✅ 已修(FR-114 CM-2181,commit 48638cbdb/套件 2cb9d2cd,1.21.0 出貨) |
| 25 | Excel「說明」頁那一格填一百萬個數字,檢查版本號的比對就卡住 | 🟡 中 | 資源耗盡 | 一個請求佔住一條處理程序到 120 秒逾時,四個請求讓整個系統沒回應,任何登入帳號都能做。同一件事系統裡寫了兩份、一份寫對一份寫錯 | 刪掉寫錯的那份、改用已經寫對的那支 | ✅ 已修(FR-114 CM-2181,commit 48638cbdb,1.21.0 出貨) |
| 26 | 一份幾 KB 的特製 Word,讓系統安全計畫匯入解析卡到逾時 | 🟡 中 | 資源耗盡 | 解析路上六個地方遇到刻意做壞的內容會越跑越慢(例:3,200 個空白 66 秒、2KB 三千個空段落 96 秒),四個請求讓整個產品對所有客戶停擺。能匯入計畫的帳號都能做;第 3 條修好之後門檻升一級 | 解析前先限制每段長度、段落數與表格欄數;改寫四條比對規則與兩處重複走訪。六處同一張卡,驗收要用同一份惡意檔從上傳整條跑一次 | ✅ 已修(FR-114 CM-2182,commit 9edcf4de4,1.21.0 出貨) |
| 27 | 原廠平台管理員刪掉一整個框架或版本時,後端不檢查還有沒有客戶的資源庫在用 | 🟡 中 | 要先做產品決策 | 資源庫上記的版本變成指向不存在的東西:列表的框架名稱空掉、用 Word 更新既有資源庫時找不到目錄。客戶自己的控制項不會少(用的是各自複製的副本)。要先是平台管理員,屬「誤操作釀災」 | **已裁定:刪版本、編輯公版目錄、匯入覆蓋三處一起改成「有任何客戶資源庫引用這個版本就拒絕」——業界慣例是已經被引用的版本不硬刪 | ✅ 已修**(FR-114 CM-2180,commit 7262b74c8,1.21.0 出貨) |
| 28 | 範本的「設備/資訊系統對照」清單任何登入帳號都讀得到,還附了真實資產主檔的內部編號 | ⚪ 低 | 只驗登入、不檢查歸屬 | 比第 4 條多一層:帶上資產主檔裡真實紀錄的名稱與編號。三位檢查員投中、低、低,理由是外洩內容較有限、且要範本先掛過這類資料 | 補「必須有看範本的權限」,與第 4 條同一張卡 | ✅ 已修(FR-114 CM-2186,commit aafaa070d,1.21.0 出貨) |
| 29 | 把稽核「判定」接到「風險」上時,模組本體不檢查兩者是不是同一份稽核結果 | ⚪ 低 | 只驗登入、不檢查歸屬 | 今天打不到:唯一呼叫它的地方有先檢查。它是地雷——下一個呼叫它的程式只要漏一步,就能把 A 份稽核結果的判定接到 B 份的風險上 | 守在模組本體那支方法的開頭,逐一比對;呼叫端現有那道留著 | ✅ 已修(FR-114 CM-2184,套件 commit ae5ffff5,1.21.0 出貨) |
| 30 | 建資源庫時不看框架版本「發佈了沒」,原廠還在編的草稿版本也能被拿去複製 | ⚪ 低 | 只驗登入、不檢查歸屬 | 任何登入帳號拿到還沒公開的控制項內容,並用它建資源庫、開專案;之後原廠改草稿,客戶那份不會跟著改。不跨客戶、不改公版 | 取到版本後補「必須已發佈」。與第 13 條同一張卡 | ✅ 已修(FR-114 CM-2179,commit 94275d72f,1.21.0 出貨) |
| 31 | 從框架版本下載「空白範本」,裡面附了全公司的使用者 email、全部設備名稱與 IP、全部資訊系統清單 | ⚪ 低 | 回應夾帶不該送的欄位 | 只該看範本的人,拿到全公司資產與人員清冊。不跨客戶 | 下拉選單的資料依呼叫者實際權限縮減,不要一律給全公司範圍 | 🟡 部分修(FR-114 CM-2188,commit 7d62545c3:決策者選 A,只依權限拿掉 email 與設備 IP,顯示文字保留,1.21.0 出貨) |
| 32 | Word 打不開時,錯誤訊息把伺服器暫存檔的完整路徑回給前端 | ⚪ 低 | 回應夾帶不該送的欄位 | 實測:上傳一個壞檔,前端看到伺服器暫存目錄的路徑。洩漏的只是暫存路徑 | 同第 22 條,併同一張卡 | ✅ 已修(FR-114 CM-2183,commit c33f7e828,1.21.0 出貨) |
| 33 | 「重新產生稽核計畫草稿」不看輪次階段 | ⚪ 低 | 外部送什麼就收什麼 | 稽核中甚至已結案的輪次,稽核員或管理者按一下,輪次就改指向一份空白的新計畫;原本那份還在、但跟輪次脫鉤。同一支檔案其他四個改計畫的入口都有檢查階段 | 已裁定:拆掉這個網址(前端沒有地方在用),連同另外三支退役的一起拆 | 🗑️ 已拆除(FR-114 CM-2177,commit 1e0879815) |
| 34 | 有建立範本權限的管理員上傳一個幾 KB 的特製 YAML,伺服器展開時算到當掉 | ⚪ 低 | 資源耗盡 | 一個請求吃滿處理程序到逾時;連送幾個,所有公司的使用者同時連不上。要先有管理員帳號、後果是暫停服務不是外洩 | 拒絕 YAML 裡的「引用前面某一段」、加層數與總數上限 | ✅ 已修(FR-114 CM-2190,commit 374392065;錯誤碼改號 3d97fcaf9,1.21.0 出貨) |
| 35 | Excel 匯入檢核時送一格很長的怪字串,一個請求佔住處理程序兩分鐘 | ⚪ 低 | 資源耗盡 | 四個請求卡住全部處理程序,後果同第 34 條 | 欄位超過合理長度直接判不合格、比對規則加上限。與第 25 條同一輪看 | ✅ 已修(FR-114 CM-2181,commit 48638cbdb,1.21.0 出貨) |
| 36 | 原廠上傳一份頁數極多的 CMMC PDF,解析時記憶體被撐爆 | ⚪ 低 | 資源耗盡 | 實測:3MB、兩萬頁的 PDF 吃掉 3.4GB。要先是平台管理員 | 開檔後先擋總頁數;每頁讀完就關(實測同樣 5,000 頁記憶體 534→128MB)。與第 37 條同一張卡 | ✅ 已修(FR-114 CM-2184,套件 commit ae5ffff5,1.21.0 出貨) |
| 37 | PDF 裡塞一行超長的字,判斷「這行是不是目錄」的比對卡住工作程序 | ⚪ 低 | 資源耗盡 | 實測:0.04MB、五頁的 PDF 跑 52 秒,約十頁就超過逾時 | 太長的行直接當內文、不跑比對 | ✅ 已修(FR-114 CM-2184,套件 commit ae5ffff5,1.21.0 出貨) |
| 40 | 「人員對帳」查資料時收了公司編號卻沒拿來用,四處查詢都一樣 | ⚪ 低 | 客戶資料沒隔開 | 平台管理員身分下跑人員對帳時,會拿所有客戶的人員資料來比對。比對結果只寫進附註欄、不影響任何權限;同一套功能的「組織對帳」就有正確用上公司編號 | 比照組織對帳,四處查詢都加上公司條件 | ✅ 已修,1.21.0 出貨(8-A,CM-2211,commit fe928859f)。主系統掃描查出 |
| 41 | 系統安全計畫的 Word/Excel 兩張「解析工作單」表,資料庫的新增規則寫成「一律允許」 | ⚪ 低 | 客戶資料沒隔開 | 今天沒有實際風險——程式寫入時一律用登入身分的公司,沒有別的路繞過。但資料庫那道最後的牆在這裡等於沒設,哪天多一條寫入路徑,就能寫進別家公司名下 | 照另外兩張同類表已修好的標準寫法補一支資料庫調整;新客戶安裝用的資料庫結構要一起重產 | ✅ 已修,1.21.0 出貨(8-E,CM-2215,commit 822216b6c)。主系統掃描查出 |
| # | 問題 | 影響 | 怎麼修 | 狀態 |
|---|---|---|---|---|
| 38 | 複製系統安全計畫時,三種「用編號互相指向同一份計畫裡另一筆資料」的欄位沒換成新編號 | 開專案時從範本複製、開始稽核時凍結成快照,都走這支。開發環境實查:凍結快照裡 47 筆繼承授權的「提供者」47 筆全指到別份計畫的人員。畫面上只會顯示空白、不會讀到別份內容,所以不算資安;但凍結快照是稽核證據,基準裡的「提供者」對不上任何人 | 已裁定:修程式、舊快照不動(凍結的證據不事後改)。修在模組本體,與第 39 條同一張卡、同一次發版 | ✅ 已修(FR-114 CM-2185,套件 commit 1d3a59c8,舊快照依裁定不動,1.21.0 出貨) |
| 39 | 同一份計畫「再匯入一次」時,人員、實作項目等每次換新編號,外部服務與設備每次多一份 | 專案負責人把同一份 Word 或 Excel 再匯入一次(正常操作),指向人員的欄位就斷掉、外部服務與設備每匯一次多一份。開發環境 604 筆外部服務有 17 筆找不到提供者(混著第 38 條的效果)。⚠️ 開發環境沒有再匯入的紀錄,這是讀程式推論,修的人要實跑兩次確認 | 修在模組本體,與第 38 條同一張卡 | ✅ 已修(FR-114 CM-2185,套件 commit 1d3a59c8,1.21.0 出貨) |
下面只展開需要你自己判斷、或容易被誤解的幾條。 其餘的修法明確,看上面表格的「怎麼修」那一欄就夠了——沒有展開不代表沒查,也不代表不重要。
在哪個畫面發生:「合規範本 → 從某份系統安全計畫匯出 Excel 範本」。本意是把一份寫好的計畫倒出來當範本用。
問題是什麼:這個入口掛的檢查問的是「你有沒有看資源庫的權限」,不是「這份計畫是不是你的」——兩件完全不同的事被當成同一件。後面的程式拿到編號就直接查、直接讀,整支沒有一個字在檢查歸屬。
| 下載下來的 Excel 裡有什麼 | |
|---|---|
| 系統本身 | 系統名稱、敏感度分級、授權邊界 |
| 人 | 每一位登記人員的姓名、email、電話、通訊地址 |
| 設備 | 主機名稱、IP、MAC、作業系統、資產編號 |
| 做法 | 每一條控制項的實施狀況與完整敘述、附帶文件的檔名 |
為什麼跨客戶也擋不住:這些資料所在的表沒有任何「這是哪家客戶的」欄位,資料庫那道隔離一張都沒開。程式這一關沒擋、資料庫那一關也擋不住,兩關皆空。
為什麼從中升到高:工具與三位檢查員一致評中;統籌者驗收時裁定升高——①外洩的是整份文件、不是單一欄位;②跨公司;③一個請求即可、門檻只到「有帳號」。
有反例證明這裡本來就該守:做同一件事的隔壁入口「匯出系統安全計畫」有檢查「你是這份計畫的參與者」。修法就是照它抄。
現況:已修,1.21.0 出貨(CM-2188,commit 82618a297)。
這條說明一個盤點方法不可靠
只數「25 個入口有 15 個掛了權限檢查」,合規範本那一塊看起來守門完整。這條證明「掛了檢查」不等於「檢查對了」:它掛的是錯的那一種。 那一塊單獨查了八輪,每一輪都找到同一個病的不同長相(見下一節)。
合規範本的「寫入」被三條不同的路各打穿一次:
| 第幾條 | 入口 | 守了什麼、漏了什麼 |
|---|---|---|
| 第 5 條 | 編輯範本的控制項清單 | 同一支程式隔四行:改分享範圍有檢查歸屬,改控制項清單沒有 |
| 第 2 條 | Excel 匯入覆寫範本 | 三個去向,兩個有檢查,覆寫既有範本那個一行都沒有 |
| 第 3 條 | Word 匯入覆寫範本 | 同一個判斷式三條路,建新範本那條旁邊有十幾行註解解釋為什麼要守,覆寫那條只有「查存在」 |
三條要一起修——只補一條,另外兩條照樣進得去
三條寫的是同一批資料、造成的破壞相同(範本被清空、底下每條控制項的做法連鎖刪除、原廠公版也打得到),而底下那批資料表沒有資料庫隔離,程式這一層是唯一關卡。
同一張卡修完(CM-2178,commit abf1cf8a4,1.21.0 出貨),驗收三個入口各打一次。
為什麼第 2、3 條評高、第 5 條評中:第 5 條要先是某家公司的管理員,而且只打得到有上下層分享關係、或原廠公版的範本;第 2、3 條任何登入帳號都打得到。
這塊最值得記住的不是任何單獨一條,而是同一個病反覆以不同形狀出現——有人把一條路守得很仔細、另一條路整個沒守,而守得仔細的那一半正好證明開發者知道該守:
| 長相 | 例子 |
|---|---|
| 同一支程式隔幾行,一守一不守 | 第 5 條(改分享範圍有查、改控制項清單沒查)、第 6 條(檢查被包在一個判斷式裡) |
| 兄弟入口,一個掛一個沒掛 | 第 17 條(隔壁那支檔案四個入口全掛齊) |
| 同一支檔案,寫入都守、讀取漏掉 | 第 4、14、15、16 條 |
| 從別處複製過來,只補了寫那一半 | 第 4、8 條(六組一起漏) |
| 三個入口,只查過其中一個 | 第 1 條 |
| 六支方法,只有一支真的漏 | 第 9 條 |
| 同一件事兩個入口、兩套門 | 第 10 條(畫面上改要修改權限,匯入只要建立權限) |
| 檢查甲、動手改乙 | 第 7、11 條(檢查網址上那個編號,動手改的是另外送來的編號) |
所以盤點一塊安不安全,不能數「有幾支掛了守門」
要看的是「掛的那道問的問題對不對」。這個教訓在這一塊出現了三次(第 1 條掛的是錯的那道檢查、第 27 條權限有守但少了另一道檢查、八輪各自的長相),往後任何補權限的驗收,要把讀與寫分開數、把每個入口的檔名與行號逐一列成驗收項。
在哪個畫面發生:任何人下載一份範本或匯出檔、用 Excel 打開。
資料從進系統到變成 Excel,路上有六個地方可以擋(上傳解析、存檔、讀出、組下拉選單、寫儲存格、檔案設定),實際擋了零個;產生的檔案還設定成「打開時重新計算」。
| 誰能埋 | 怎麼埋 | 第幾條 |
|---|---|---|
| 能編輯某份計畫內容的人 | 在內容裡填公式開頭的文字 | 第 20 條 |
| 任何登入帳號 | 把自己的暱稱改成公式——之後全公司下載的每份範本都帶著它 | 第 21 條 |
| 能寫控制項現況的人 | 在描述裡填公式,複核的人匯出打開 | 第 19 條 |
執行發生在下載者自己的電腦上,我們的防護管不到。 修法不是刪字元,而是把儲存格明確標成「純文字」、內容一字不改——這份 Excel 會被上傳回來,用加單引號的舊做法會每來回一趟多一撇。三條都已修,1.21.0 出貨(第 19 條 CM-2055、第 20、21 條 CM-2189)。
這塊有十條「一個請求就佔住處理程序」的問題(第 23~26、34~37 條,加上稽核輪次管理第 2、3、8 條)。多數是執行者自己做惡意檔實測出來的,不是工具報的:
| 輸入 | 實測結果 | 第幾條 |
|---|---|---|
| 0.32MB 的 Word(300 段各 1MB) | 開檔吃掉 1.9GB 記憶體 | 第 24 條 |
| 幾 KB 的特製 Word | 3,200 個空白 66 秒;三千個空段落 96 秒 | 第 26 條 |
| 3MB、兩萬頁的 PDF | 吃掉 3.4GB 記憶體 | 第 36 條 |
| 0.04MB、五頁、每頁一行四萬字的 PDF | 52 秒 | 第 37 條 |
為什麼幾個請求就夠:落地版預設只有 4 條處理程序,逾時是 120 秒,而且解析是在請求當下同步做完的。四個請求同時卡住,所有客戶一起連不上。
壓縮炸彈要一次修四個入口
「只量上傳檔大小、不量解開後多大」這個病有四個入口、分在兩處程式:專案計畫的 Excel、Word(第 23、24 條,在我們主系統),稽核計畫的 Word、稽核結果的 Excel(稽核輪次管理第 2、3 條,在另一個模組共用的讀檔程式)。同一張卡、同一支檢查函式,四個入口都驗過(CM-2181,1.21.0 出貨)。
在哪個畫面發生:原廠平台管理員在「框架管理」刪掉一整個合規框架、或其中一個版本。
容易想錯的修法:編輯框架那邊已經有一道「還有沒有人在用」的檢查,直覺是刪除時照叫它。但那道檢查在正常流程裡永遠不會擋——它查的是「有沒有東西直接指向原廠的目錄」,而建資源庫一律先複製一份、再指向副本,開發環境 591 筆引用裡 0 筆指向原廠。照叫等於沒補,編輯那邊的同一道檢查其實也從來沒擋過。
後果:刪框架只會連帶刪掉版本,客戶自己的控制項一筆不少(都是複製出來的副本);壞掉的是資源庫上記的版本變成指向不存在的東西——列表的框架名稱空掉、用 Word 更新既有資源庫時找不到目錄。
已裁定:刪版本、編輯原廠目錄、匯入覆蓋三處,一起改成查「有沒有任何客戶的資源庫引用這個版本」,有就拒絕。理由是保護稽核依據可以追溯——已經被引用的版本不硬刪。已照裁定修好(CM-2180,commit 7262b74c8,1.21.0 出貨)。
這件事不是檢視查出來的,是客戶資料隔離那次專項盤點盤出來的,缺口正好落在這一塊——而上面第 1、4 條之所以會跨客戶,就是因為這道牆不存在。
問題是什麼:確保「A 客戶看不到 B 客戶的東西」的最後一道防線,在合規文件這一整塊沒有砌起來。實際測過——用一把指向不存在客戶的鑰匙去查,專案看到 0 筆(牆擋住了),但系統安全計畫看到 639 筆、稽核發現看到 525 筆。
| 完全沒有那道牆的資料表 | 102 張(其中 101 張連「這是哪家客戶的」欄位都沒有) |
| 確認要補的 | 53 張——合規文件核心 45 張、主系統零散 8 張 |
| 真正需要設計判斷的 | 4 個接點,其中合規資源庫最難(目前沒有任何欄位連到客戶或專案,要先決定「主人是誰」) |
| 工作量 | 一支資料庫調整、一到兩天,外加驗證「開了牆會不會把正在用的資料藏起來」 |
兩件事要講清楚
一、落地版不受這道牆影響。 一家客戶裝一套、整座資料庫就是那家客戶的,「看到別家」在落地版不成立——但同一套系統裡的母公司與子公司之間仍然成立(第 4、5、8 條)。這道牆的定位是「SaaS 版上線前必做」。
二、順序已經定了,不能對調:① 先修程式面的守門缺口 → ② 測試一版 → ③ 再開這道牆。 先開牆容易把正在用的資料擋住藏起來,而那種故障在畫面上只看起來像「資料不見了」,很難查。
決策者 2026-09-26 裁定:專案裡的系統安全計畫,維持看「專案角色」決定誰能做什麼,不另外加一組功能權限。
| 哪一份 | 誰能改、誰能看 |
|---|---|
| 專案裡的系統安全計畫 | 專案管理者可以改,專案成員只能看;不是專案的人看不到 |
| 合規資源庫裡的範本 | 看合規資源庫那組功能權限(上面第 13~17、28 條已補齊) |
為什麼不另加:專案的計畫本來就只屬於那個專案,「你在這個專案裡是什麼角色」已經回答了「你能不能動它」;再疊一層功能權限,只會讓客戶管理員多一處要設、設錯了還會把正當的專案成員擋在外面。
一句話:產品最核心的一塊,查完了,找到 37 條資安問題,其中 3 條高風險——全部落在「合規範本與系統安全計畫的資料進出」這塊地上。底下 45 張資料表沒有客戶隔離,程式那一層是唯一的關卡,而那一層反覆「守了一半」。這 37 條已全部處理,隨 1.21.0 出貨。
處理現況:37 條資安已全部處理,隨 1.21.0 出貨——34 條已修、第 33 條拆除、第 16、31 條部分修;主系統另查出的第 40、41 條與非資安的第 38、39 條也已修。修法照下面的分組做:
仍開著的:第 16 條的「檔案下載擁有者檢查」評估,以及上一節 SaaS 版上線前要補的資料庫最後一道牆。
最後要說清楚兩件事:
| 統計 | |
|---|---|
| 檢視輪數 | 27 輪、244 個檔案(主系統 11 輪 94 個、合規範本 8 輪 70 個、模組本體與解析器 8 輪 80 個) |
| 覆核沒跑完整的輪次 | 3 輪(O6、O9b、B1-item),另 V2 可信度低 |
| 找到的問題 | 41 條(本模組 37 條資安 + 2 條非資安但會讓稽核文件出錯;主系統掃描另查出 2 條,第 40、41 條) |
| ↳ 高風險 | 3 條(第 1~3 條) |
| ↳ 中風險 | 24 條 |
| ↳ 低風險 | 12 條(含主系統掃描查出的第 40、41 條,兩條都已修,1.21.0 出貨) |
| 已修 | 本模組資安 34 條(第 1~37 條除第 16、31、33 條)+主系統另查出 2 條(第 40、41 條)+非資安 2 條(第 38、39 條),1.21.0 出貨 |
| 部分修 | 2 條(第 16、31 條),1.21.0 出貨 |
| 已裁定拆除 | 1 條(第 33 條,已拆除) |
| 資安未修 | 0 條(SaaS 版資料庫最後一道牆另列為 SaaS 上線前必做,見上方) |
| 你想知道 | 看哪裡 |
|---|---|
| 為什麼有些輪次「零發現」還是可信、有些不可信 | 檢視方法與工具 · 哪些地方我們不能說查過了 |
| 我們用什麼方法查、結果有多可信 | 檢視方法與工具 |
| 其他模組的檢視結果 | 回總報告首頁 |