Guidant AI 資安檢視 · 模組報告

合規文件核心(jedi-oscal-v2+合規範本)

產品最核心的一塊——控制項、系統安全計畫、稽核計畫都在這裡產生,客戶的合規範本也在這裡管。這塊底下 45 張資料表完全沒有客戶隔離,程式那一層是唯一的關卡;而那一層最常見的漏法是「有人守了一半」。最要緊的一條:任何登入帳號知道編號,就能把別家公司整份系統安全計畫下載走。

§1

這塊在產品裡做什麼

客戶買這套系統,是為了做合規稽核。而稽核的主要文件都在這一塊產生與保存:

它平常在做什麼

  1. 控制項目錄——客戶要符合的那幾百條規定長什麼樣(原廠維護的框架,例如 CMMC)
  2. 合規範本(資源庫)——客戶自己整理好的「我們公司怎麼做到每一條」,開新專案時整份複製過去
  3. 系統安全計畫——每個專案寫「我的系統對每一條規定做了什麼」的那份文件
  4. 稽核計畫——這一輪要查哪些、誰來查

還包含這些文件的 Word/Excel/YAML 匯入匯出,以及原廠上傳 CMMC 官方 PDF 自動讀出控制項。

為什麼它是敏感目標

這裡存的就是客戶的稽核成果本身。

其他模組被攻破,外洩的是帳號、清單、設定。這一塊被攻破,外洩或被竄改的是客戶花幾個月做出來的合規證據——而那正是客戶買這套系統的理由。

更要緊的是:這塊底下 45 張資料表完全沒有「這是哪家客戶的」欄位,資料庫那道「每個客戶只能看自己資料」的隔離一張都沒開。 程式漏掉一道檢查,資料庫不會替你擋。

它分成方向相反的兩半,檢視時也分開查:

它是什麼 要擔心的是什麼
我們主系統這一邊(含合規範本那一整塊) 決定「誰能讀、誰能改」這些文件的那部分程式 權限檢查有沒有做、做得對不對——會不會別人的計畫也讀得到、別人的範本也改得動
模組本體 純粹的資料存取與格式轉換,沒有任何對外入口 它自己不檢查任何事、全靠呼叫它的人先檢查;以及惡意檔案——一份動過手腳的 Word、Excel、PDF 會不會讓系統當掉

§2

檢視軌跡

檢視期間:2026-09-21 ~ 2026-09-24|範圍:244 個檔案——我們主系統這一邊 94 個、合規範本那一整塊 70 個、模組本體與主系統的文件解析器 80 個|共 27 輪

原始技術報告放在需求中心兩個站:主系統這一邊與合規範本在 FR-113 站、模組本體在 FR-118 站,檔名見下表最後一欄。那裡有每一輪的完整技術細節、檔案清單與逐條推理,供需要深究或稽核抽查時查閱。

我們主系統這一邊(11 輪)

輪次 查什麼 檔數 覆核投票 結果 原始報告檔名
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

合規範本(資源庫)那一整塊(8 輪)

輪次 查什麼 檔數 覆核投票 結果 原始報告檔名
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

模組本體與主系統的文件解析器(8 輪)

輪次 查什麼 檔數 覆核投票 結果 原始報告檔名
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

三輪的覆核沒有跑完整,這裡照實交代

  • O6(程序書文件池):主要的檢視跑完了,但「找寫死密碼」那道補充檢查卡住 42 分鐘,當時額度將盡、手動停掉,三人重查投票沒有跑。統籌者改用親自開檔核對代替,三處全部屬實。所以這一輪**「找到的這幾條存在嗎」可信**,「這 6 個檔只有這幾條嗎」不可信。
  • O9b(整體接線):檢查員派出 27 位、一票都沒收回就因額度中止;第一次嘗試還跑了 12 小時零產出(工具已知缺陷)。這一輪淨新增 0,唯一那條與別處重複。
  • B1-item(範本流程圖):應投 6 票只投了 3 票就因額度停掉,決策者裁定不補跑。沒投到票的那條(第 6 條)由執行者開檔核對、統籌者復核屬實後登記。

這三輪涵蓋的 27 個檔案,不能當成「查乾淨了」。

模組本體那幾輪「一個疑點都沒提」,靠的是實測,不是空手而回

模組本體有五輪工具一條疑點都沒提出來。其中四輪的結論來自執行者自己動手:V4b 手做 7 種惡意 PDF 量時間與記憶體、拿正常 PDF 亂數變造 3,000 次;W1、W2 把範圍內每一條比對規則拿攻擊字串實跑;V1、V4a 逐支讀完、到開發環境唯讀查資料表。這幾輪「找到的存在嗎」可信度高,因為有實測數字。

例外是 V2:執行者只核了工作單點名的六件、沒有逐支讀完 26 個檔,還把該做的跨專案追查推回給統籌者(已由統籌者查完)。V2 這 26 個檔的「只有這幾條嗎」可信度低。

兩個交接時的擔心,查下去不成立

  • 「惡意 XML 可以讀走伺服器上的檔案」——模組本體沒有任何一支 XML 解析器,匯出只出 JSON,不成立。
  • 「同一個人員編號出現在兩份計畫、互相串到」——Word 與 Excel 兩條匯入路,編號全部由伺服器產生、複製時也換新,不成立。

目前沒有任何入口讓使用者直接給一份 OSCAL 格式的文件;日後若要開放「上傳 OSCAL JSON」或「匯出成 OSCAL JSON」,開放之前必須先補守門——模組本體照單全收呼叫者給的內容。


§3

問題一覽

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

# 問題 風險 分類 出事會怎樣(誰受影響) 怎麼修 狀態
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 出貨)

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

§4

第 1 條:一個請求,端走別家公司整份稽核底稿

在哪個畫面發生:「合規範本 → 從某份系統安全計畫匯出 Excel 範本」。本意是把一份寫好的計畫倒出來當範本用。

問題是什麼:這個入口掛的檢查問的是「你有沒有看資源庫的權限」,不是「這份計畫是不是你的」——兩件完全不同的事被當成同一件。後面的程式拿到編號就直接查、直接讀,整支沒有一個字在檢查歸屬。

下載下來的 Excel 裡有什麼
系統本身 系統名稱、敏感度分級、授權邊界
人 每一位登記人員的姓名、email、電話、通訊地址
設備 主機名稱、IP、MAC、作業系統、資產編號
做法 每一條控制項的實施狀況與完整敘述、附帶文件的檔名

為什麼跨客戶也擋不住:這些資料所在的表沒有任何「這是哪家客戶的」欄位,資料庫那道隔離一張都沒開。程式這一關沒擋、資料庫那一關也擋不住,兩關皆空。

為什麼從中升到高:工具與三位檢查員一致評中;統籌者驗收時裁定升高——①外洩的是整份文件、不是單一欄位;②跨公司;③一個請求即可、門檻只到「有帳號」。

有反例證明這裡本來就該守:做同一件事的隔壁入口「匯出系統安全計畫」有檢查「你是這份計畫的參與者」。修法就是照它抄。

這條說明一個盤點方法不可靠

只數「25 個入口有 15 個掛了權限檢查」,合規範本那一塊看起來守門完整。這條證明「掛了檢查」不等於「檢查對了」:它掛的是錯的那一種。 那一塊單獨查了八輪,每一輪都找到同一個病的不同長相(見下一節)。

§5

第 2、3、5 條:同一個缺口,三個入口

合規範本的「寫入」被三條不同的路各打穿一次:

第幾條 入口 守了什麼、漏了什麼
第 5 條 編輯範本的控制項清單 同一支程式隔四行:改分享範圍有檢查歸屬,改控制項清單沒有
第 2 條 Excel 匯入覆寫範本 三個去向,兩個有檢查,覆寫既有範本那個一行都沒有
第 3 條 Word 匯入覆寫範本 同一個判斷式三條路,建新範本那條旁邊有十幾行註解解釋為什麼要守,覆寫那條只有「查存在」

三條要一起修——只補一條,另外兩條照樣進得去

三條寫的是同一批資料、造成的破壞相同(範本被清空、底下每條控制項的做法連鎖刪除、原廠公版也打得到),而底下那批資料表沒有資料庫隔離,程式這一層是唯一關卡。

開卡寫成同一張,驗收三個入口各打一次。

為什麼第 2、3 條評高、第 5 條評中:第 5 條要先是某家公司的管理員,而且只打得到有上下層分享關係、或原廠公版的範本;第 2、3 條任何登入帳號都打得到。

§6

「有人守了一半」:這塊一共出現八種長相

這塊最值得記住的不是任何單獨一條,而是同一個病反覆以不同形狀出現——有人把一條路守得很仔細、另一條路整個沒守,而守得仔細的那一半正好證明開發者知道該守:

長相 例子
同一支程式隔幾行,一守一不守 第 5 條(改分享範圍有查、改控制項清單沒查)、第 6 條(檢查被包在一個判斷式裡)
兄弟入口,一個掛一個沒掛 第 17 條(隔壁那支檔案四個入口全掛齊)
同一支檔案,寫入都守、讀取漏掉 第 4、14、15、16 條
從別處複製過來,只補了寫那一半 第 4、8 條(六組一起漏)
三個入口,只查過其中一個 第 1 條
六支方法,只有一支真的漏 第 9 條
同一件事兩個入口、兩套門 第 10 條(畫面上改要修改權限,匯入只要建立權限)
檢查甲、動手改乙 第 7、11 條(檢查網址上那個編號,動手改的是另外送來的編號)

所以盤點一塊安不安全,不能數「有幾支掛了守門」

要看的是「掛的那道問的問題對不對」。這個教訓在這一塊出現了三次(第 1 條掛的是錯的那道檢查、第 27 條權限有守但少了另一道檢查、八輪各自的長相),往後任何補權限的驗收,要把讀與寫分開數、把每個入口的檔名與行號逐一列成驗收項。

§7

第 19~21 條:惡意公式,六個關卡擋了零個

在哪個畫面發生:任何人下載一份範本或匯出檔、用 Excel 打開。

資料從進系統到變成 Excel,路上有六個地方可以擋(上傳解析、存檔、讀出、組下拉選單、寫儲存格、檔案設定),實際擋了零個;產生的檔案還設定成「打開時重新計算」。

誰能埋 怎麼埋 第幾條
能編輯某份計畫內容的人 在內容裡填公式開頭的文字 第 20 條
任何登入帳號 把自己的暱稱改成公式——之後全公司下載的每份範本都帶著它 第 21 條
能寫控制項現況的人 在描述裡填公式,複核的人匯出打開 第 19 條

執行發生在下載者自己的電腦上,我們的防護管不到。 修法不是刪字元,而是把儲存格明確標成「純文字」、內容一字不改——這份 Excel 會被上傳回來,用加單引號的舊做法會每來回一趟多一撇。

§8

資源耗盡:幾 KB 的檔就能讓產品停擺

這塊有十條「一個請求就佔住處理程序」的問題(第 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 條,在另一個模組共用的讀檔程式)。同一張卡、同一支檢查函式,四個入口都要驗。

§9

第 27 條:「還有沒有人在用」要查對地方

在哪個畫面發生:原廠平台管理員在「框架管理」刪掉一整個合規框架、或其中一個版本。

容易想錯的修法:編輯框架那邊已經有一道「還有沒有人在用」的檢查,直覺是刪除時照叫它。但那道檢查在正常流程裡永遠不會擋——它查的是「有沒有東西直接指向原廠的目錄」,而建資源庫一律先複製一份、再指向副本,開發環境 591 筆引用裡 0 筆指向原廠。照叫等於沒補,編輯那邊的同一道檢查其實也從來沒擋過。

後果:刪框架只會連帶刪掉版本,客戶自己的控制項一筆不少(都是複製出來的副本);壞掉的是資源庫上記的版本變成指向不存在的東西——列表的框架名稱空掉、用 Word 更新既有資源庫時找不到目錄。

已裁定:刪版本、編輯原廠目錄、匯入覆蓋三處,一起改成查「有沒有任何客戶的資源庫引用這個版本」,有就拒絕。理由是保護稽核依據可以追溯——已經被引用的版本不硬刪。


§10

🔴 這一塊的另一個待辦:SaaS 版的最後一道牆

這件事不是檢視查出來的,是客戶資料隔離那次專項盤點盤出來的,缺口正好落在這一塊——而上面第 1、4 條之所以會跨客戶,就是因為這道牆不存在。

問題是什麼:確保「A 客戶看不到 B 客戶的東西」的最後一道防線,在合規文件這一整塊沒有砌起來。實際測過——用一把指向不存在客戶的鑰匙去查,專案看到 0 筆(牆擋住了),但系統安全計畫看到 639 筆、稽核發現看到 525 筆。

完全沒有那道牆的資料表 102 張(其中 101 張連「這是哪家客戶的」欄位都沒有)
確認要補的 53 張——合規文件核心 45 張、主系統零散 8 張
真正需要設計判斷的 4 個接點,其中合規資源庫最難(目前沒有任何欄位連到客戶或專案,要先決定「主人是誰」)
工作量 一支資料庫調整、一到兩天,外加驗證「開了牆會不會把正在用的資料藏起來」

兩件事要講清楚

一、落地版不受這道牆影響。 一家客戶裝一套、整座資料庫就是那家客戶的,「看到別家」在落地版不成立——但同一套系統裡的母公司與子公司之間仍然成立(第 4、5、8 條)。這道牆的定位是「SaaS 版上線前必做」。

二、順序已經定了,不能對調:① 先修程式面的守門缺口 → ② 測試一版 → ③ 再開這道牆。 先開牆容易把正在用的資料擋住藏起來,而那種故障在畫面上只看起來像「資料不見了」,很難查。


§11

已裁定:專案的系統安全計畫不另加功能權限

決策者 2026-09-26 裁定:專案裡的系統安全計畫,維持看「專案角色」決定誰能做什麼,不另外加一組功能權限。

哪一份 誰能改、誰能看
專案裡的系統安全計畫 專案管理者可以改,專案成員只能看;不是專案的人看不到
合規資源庫裡的範本 看合規資源庫那組功能權限(上面第 13~17、28 條已補齊)

為什麼不另加:專案的計畫本來就只屬於那個專案,「你在這個專案裡是什麼角色」已經回答了「你能不能動它」;再疊一層功能權限,只會讓客戶管理員多一處要設、設錯了還會把正當的專案成員擋在外面。


§12

這塊的結論

一句話:產品最核心的一塊,查完了,找到 37 條資安問題,其中 3 條高風險——全部落在「合規範本與系統安全計畫的資料進出」這塊地上。底下 45 張資料表沒有客戶隔離,程式那一層是唯一的關卡,而那一層反覆「守了一半」。

修法分組(1.21.0 出貨時 37 條資安已全部處理,第 16、31 條部分修):

  1. 第 1 條最優先——跨客戶、一個請求、整份文件,修法照隔壁抄一行。
  2. 第 2、3、5 條同一張卡——三個入口一起修、驗收各打一次。
  3. 第 4、14~17、28 條(讀取漏掉的那一批)同一張卡——每支補一行權限檢查;先確認權限點存在、以及「建立專案」下拉選單的角色設計。
  4. 第 6~10 條(歸屬檢查)排同一輪——多數是「把現有那道檢查搬到對的位置」。
  5. 第 11、12 條同一張卡——兩條都已修,隨 1.21.0 出貨。
  6. 第 19~21 條(惡意公式)排在那支共用函式發版之後,五處逐一驗收。
  7. 資源耗盡那十條按入口分卡:壓縮炸彈四個入口一張、特製 Word 六處一張、PDF 兩條一張。
  8. 第 38、39 條(非資安)與另外幾件模組本體的小修同一次發版。

最後要說清楚兩件事:

  • 「查完」不等於「查乾淨」。 有三輪覆核沒跑完整、V2 那一輪沒有逐支讀完,那些檔案不能當成查乾淨。
  • 這塊的新發現有很大一部分不在工具的正式清單裡,是執行者開檔追、動手實測出來的。只讀工具清單驗收,會漏掉一整層。
統計
檢視輪數 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 條部分修(第 16、31 條)+第 38、39 條(非資安)也已修——資安 37 條已全部處理完,1.21.0 出貨
已裁定拆除 1 條(第 33 條,已拆除)
已開工單 0 張(依決策者裁定,全部掃完後統一開)

你想知道 看哪裡
為什麼有些輪次「零發現」還是可信、有些不可信 檢視方法與工具 · 哪些地方我們不能說查過了
我們用什麼方法查、結果有多可信 檢視方法與工具
其他模組的檢視結果 回總報告首頁