Guidant AI 資安檢視總報告 · 安全需求(SR)
紀錄是旁路、目標由人填就記誰按的、刪除有順序
稽核紀錄要「真的留下、不拖垮業務、事後查得到誰做的」。這一章 6 條:紀錄寫入是旁路、目標由人填的動作要留痕、刪除順序、日誌轉送、安全狀態當場算、規則包內容漂移可見。5 條有掃描實例、1 條是標準做法。
稽核紀錄有兩種失敗:該留的沒留(寫入失敗被吞、超長整筆丟、署名是別人、刪完就沒痕跡)與留了反成負擔(寫不進去把使用者已完成的請求一起弄失敗、過期的從不刪)。另有一類是「事後說不清」:授權狀態只靠排程更新、網址型規則包內容被換掉而畫面沒變。本章要求的共同點是:紀錄是旁路,不得拖垮主流程,也不得被主流程的失敗連累而缺漏。
| # | 要求 | 來源 |
|---|---|---|
| SR-08.1 | 紀錄是旁路:寫失敗不拖垮請求,超長先截斷,過期要真的刪 | 掃描驗證 |
| SR-08.2 | 目標由呼叫者填的動作要限量、收斂回應、稽核記操作者與目標 | 掃描驗證 |
| SR-08.3 | 刪除順序:先刪紀錄,紀錄真的刪掉才刪實體 | 掃描驗證 |
| SR-08.4 | 日誌轉送有送達確認或斷線告警,加密設定變更觸發重掛 | 掃描驗證 |
| SR-08.5 | 安全狀態當場算,排程只寫副本,兩者取較嚴 | 掃描驗證 |
| SR-08.6 | 網址型規則包內容漂移可見,抽取失敗的版本不得派工 | 標準做法 |
| 欄位 | 內容 |
|---|---|
| 要求 | 操作日誌寫入必須是旁路:寫入失敗不得使已完成的請求失敗(錯誤走標準出口記錄,不往上拋);欄位寫入前必須截到上限,截斷後仍失敗必須補一筆最小替代紀錄(至少含操作者、動作、時間),不得整筆丟失;過期的紀錄必須真的被刪(保存期限生效);分區表的維護必須有排程並以擁有者身分執行 |
| 為什麼 | 網址後加一段無意義參數撐過欄位上限,操作照做但寫日誌整筆失敗,事後查不到誰刪了資料;反過來資料庫那一刻寫不進去,使用者已做完的請求被一併弄成失敗;保存期限從沒生效,含密碼原文的舊日誌一直留著 |
| 適用連線 | C05 api → 資料庫;推及:C02 前門 → api(所有寫操作日誌的端點)、C03 前門 → socketio(即時連線事件的紀錄) |
| 對應威脅 | C05 T5 紀錄表本身:寫不進去拖垮請求、寫太長就不留痕、該刪的不刪**(5 條) 🟡 |
| 驗證方式 | 對寫操作端點在網址後加超過欄位上限的參數,操作成功且日誌必須有一筆含操作者與動作的紀錄;暫時讓日誌表不可寫,業務請求必須仍成功;查日誌表,早於保存期限的資料必須不存在,且下個月的分區必須已建好 |
| 來源 | 掃描驗證:C05 D5(實例 M09-6、M09-5、M04-4、M04-5) |
| 欄位 | 內容 |
|---|---|
| 要求 | 目標由呼叫者填的動作(測試連線、掃描、分享)必須:單次目標數有上限;回應只回成功/失敗,逐台診斷只進日誌;稽核日誌必須記操作者、客戶、設定、工具、代理程式與完整目標清單;目標變更必須留紀錄;誰能設定目標必須限定在被指派人與專案管理者 |
| 為什麼 | 目標由人填時,代理程式變成內網探測器:從「連得上/被拒/逾時」的差異畫出內網拓撲;若動作沒留下是誰按的、填了什麼目標,事後無從追查,也無法向客戶說明一次異常掃描的來源 |
| 適用連線 | C21 api → agent 資料面(:8443)、C23 agent → 受檢主機、C23a agent → 工具伺服器、C25 掃描引擎 → 目標;推及:C16 api → 聊天 webhook(Discord/Telegram)(測試按鈕的目標位址)、C10 api → 客戶 SMTP(寄測試信) |
| 對應威脅 | C21 T3 測試連線連到哪,由按的人自己填——代理程式變成內網探測器 🟡、C23 T1 連到哪由呼叫者填——代理程式替人敲遍內網 🟡、C23a T3 把 agent 當跳板,叫工具去打不該打的地方(無掃描實例)、C25 T1 拿客戶的掃描器當武器打第三方(無掃描實例)、C25 T2 掃描流量打掛內網脆弱設備(無掃描實例) |
| 驗證方式 | 送一個超過單次上限的目標清單,必須被拒;送一份含存活與不存活主機的清單,回應內容必須只有成功/失敗而不含逐台診斷;執行後查稽核日誌,必須有操作者、客戶、設定、工具、代理程式與完整目標清單;修改掃描任務的目標後,必須有一筆變更紀錄 |
| 來源 | 掃描驗證:C21 D3(實例 M03-6)、C23 D1(實例 M03-6);標準做法:C23a D4◇、C25 D1◇、C25 D2◇ |
| 欄位 | 內容 |
|---|---|
| 要求 | 刪除時必須先刪資料庫紀錄,確認紀錄真的被刪掉(不得忽略刪除結果)才刪實體檔;原廠共用檔對寫入(含刪除)必須一律拒絕;紀錄刪除被租戶隔離或其他規則擋下時,必須回失敗而非「刪除成功」 |
| 為什麼 | 先刪實體再刪紀錄時,一般員工對原廠公版檔按刪除,實體檔已沒了、紀錄刪除被隔離擋下卻回「成功」,之後所有客戶打開這份公版都是壞檔——一個帳號讓原廠給所有客戶的共用範本全部打不開 |
| 適用連線 | C07 api → 檔案儲存;推及:C02 前門 → api(所有含附件的刪除端點) |
| 對應威脅 | C07 T4 先刪實體、再刪紀錄——紀錄被擋下但實體已經沒了 🟡 |
| 驗證方式 | 以一般租戶帳號對原廠公版檔的編號送刪除,必須回失敗,且檔案實體與資料庫紀錄都必須仍在;刪自己租戶的檔,紀錄與實體都必須消失;人為讓紀錄刪除失敗,實體檔必須仍在 |
| 來源 | 掃描驗證:C07 D4(實例 M02-12) |
| 欄位 | 內容 |
|---|---|
| 要求 | 日誌轉送(SIEM)必須有送達確認,或至少在連線斷掉時告警;轉送的加密設定被變更時,必須觸發重新掛載轉送處理器,使線上行為與畫面所示一致;加密時憑證驗證必須恆開(自簽憑證改貼信任憑證,不提供「不驗」開關) |
| 為什麼 | UDP 送出去就算,設定錯、SIEM 掛了、路徑被截三種情況全都靜默——客戶以為稽核事件都進了監控,實際已斷線;加密設定改了沒重掛,畫面說加密、線上仍明文 |
| 適用連線 | C12 api → 客戶 SIEM(日誌轉送) |
| 對應威脅 | C12 T1 在路上側錄全部日誌 🟡 |
| 驗證方式 | 把 SIEM 端關掉,必須在設定的時間內產生斷線告警;在設定頁把轉送改為加密並存檔,不重啟服務,抓封包必須看到加密連線;用自簽憑證的 SIEM 而不貼信任憑證,加密連線必須被拒 |
| 來源 | 掃描驗證:C12 D1(實例 M09-3);標準做法:C12 D5◇ |
| 欄位 | 內容 |
|---|---|
| 要求 | 授權到期、唯讀這類安全狀態的判斷必須在每次寫入時按當下時間重算;排程只負責寫副本;若重算值與存的狀態不同,必須取較嚴的那個;排程沒在跑時不得使系統停留在較寬鬆的狀態 |
| 為什麼 | 授權在午夜過期,排程每天早上 10 點才跑,資料庫裡的狀態仍是「正常」,客戶照常新增修改最長將近一天;排程沒在跑就一直可寫,商務授權形同虛設 |
| 適用連線 | C09 api → worker(背景工作);推及:C18 api → 授權簽發站(授權到期與停權) |
| 對應威脅 | C09 T6 安全狀態只靠排程更新,週期就是空窗 ⚪ |
| 驗證方式 | 把一份授權的到期時間設為一分鐘前、不執行排程,立刻對任一寫入端點送請求,必須被唯讀規則擋下;停掉排程服務,過期的授權仍必須擋下寫入 |
| 來源 | 掃描驗證:C09 D6(實例 M18-11) |
| 欄位 | 內容 |
|---|---|
| 要求 | 網址型規則包必須定期(或每次派工前)重抓並比對 sha256,與落庫值不符時必須警告管理員「網址內容已變更,請重新審核」,派工時不符必須拒派;清單頁必須說得出「這是哪一刻的快照」;抽取失敗(網址抓不到、不是合法規則包)的版本不得進入可派工狀態 |
| 為什麼 | 網址的主人事後換成惡意版本,雲端畫面上顯示的控制項清單還是舊的,每次派掃描 agent 都去抓最新的——使用者看到的與 agent 實際跑的不一致;抽取失敗仍可建立時,未經審的內容照樣被派下去 |
| 適用連線 | C24 agent → 規則包網址、C19 api → 規則包網址 |
| 對應威脅 | C24 T2 網址的主人事後換內容——雲端看到的是 A、agent 跑的是 B(無掃描實例)、C24 T3 用規則包網址讓 agent 替人探內網、或抓巨檔撐爆(無掃描實例) |
| 驗證方式 | 建一個網址型規則包並審過,之後換掉網址上的內容,下一次重抓必須產生告警,派工必須被拒;清單頁必須顯示快照時間;建一個網址指向非規則包的內容,該版本必須不能被選去派工 |
| 來源 | 標準做法:C24 D3◇、C19 D6◇、C24 D5◇ |
來源:連線頁的防線(D);去重對照在 requirements/_drafts/D-to-SR.md。