OceanAltOceanAlt
latest2026-07-207 分鐘讀完

攻防實驗室 #4:我們能悄悄抹掉自己的攻擊記錄——審計日誌不設防

上期我們汙染了審計鏈的「源頭」,這期去刪「記錄本身」。真實結果:一次被攔下的攻擊,管理員兩下就能從威脅庫和審計日誌裡刪乾淨、不留痕跡——我們自己的「刪除」按鈕就是證據。支柱5(可追溯/不可抵賴)形同虛設。我們把審計日誌改成 hash 鏈:刪或改任意一條都會斷鏈、可被校驗發現。

OOceanAlt 編輯部
分享:XLinkedInFacebookTelegramWhatsApp微博🖼 海報(英文)

攻防實驗室 · 第 4 期。上期結尾我們說:要去打審計鏈——被攔下的攻擊,日誌能不能被偽造或抹掉? 答案是:能。兩下就夠。

前三期我們打身份、打限額、打歸因。這一期打的是支柱 5:可追溯與不可抵賴——出了事,能不能查到、賴不掉。

結果:我們連"出過事"這件事本身都能抹掉。

攻擊:讓一次攻擊從沒發生過

網關攔下攻擊後,會寫兩處記錄:一條 ThreatEvent(威脅庫),一條 AuditLog(審計日誌)。聽起來很完備。

問題是——這兩張表就是普通的數據庫行。誰有後臺權限,誰就能刪。而且我們自己就給了刪除按鈕:威脅庫頁面那顆"刪除",清空演示數據那顆"清空"。

真實運行結果(線上後臺):

1) 攻擊者發起一筆越權支付
   → 被攔於 Firewall/Limit,寫入 ThreatEvent #4021 + AuditLog

2) 管理員(或任何拿到後臺的人)點"刪除"
   → ThreatEvent #4021 消失
   → 審計日誌裡也沒有"這條被刪過"的任何痕跡

3) 事後審計
   → 查無此事。攻擊像從沒發生過。

第 2 步是致命的:記錄攻擊的表,和被攻擊者能刪的表,是同一張。 一個能被清空的日誌,不是日誌,是留言板。

更陰的一種玩法是不刪、改:把一條威脅記錄的對手方地址改成一個無辜地址,事後審計就指向錯的人——和第 3 期"汙染歸因"殊途同歸,只是這次改的是結果而不是源頭

病根:追加 ≠ 刪不掉

我們默認"寫進數據庫"就等於"留下了證據"。不是的。

普通數據庫行天生可增、可刪、可改。證據的價值不在於它被寫下來,而在於它被改動時你能發現。 我們做到了前者,沒做後者。這就是支柱 5 之前的真相:一個誠實的人刪不掉、不誠實的人隨手就刪的日誌。

補:hash 鏈式防篡改日誌

改法不復雜,但它把"悄悄刪一條"變成了"必須重寫整條尾鏈":

每條審計記錄現在都嵌入前一條記錄的哈希,像賬本那樣首尾相扣:

記錄N.hash = sha256( 序號 | 時間 | 操作者 | 動作 | 對象 | … | 記錄N-1.hash )
  • 刪掉中間任意一條 → 後一條的"前哈希"對不上,鏈斷。校驗會定位到斷在第幾條。
  • 改動任意一條的內容 → 這條重算出的哈希和存的不一樣,當場暴露。
  • 想神不知鬼不覺,就得把這條之後的每一條全部重算重寫;而鏈尾的最終哈希(我們把它作為"賬本指紋"顯示在審計頁)會跟著變——只要指紋被外部記過一次,整條尾鏈的重寫就藏不住。

而且我們把**"刪威脅記錄"這個動作本身也寫進了這條鏈**。你依然能刪掉一條威脅,但"你刪了它"這件事,進了一個你改不動的賬本。

補完之後,同樣的攻擊:

| 攻擊 | 修復前 | 修復後 | |---|---|---| | 刪掉一條威脅 / 審計記錄 | 🔴 無痕消失 | ✅ 校驗立即報"鏈斷裂 @ 第 N 條" | | 篡改一條記錄的內容 | 🔴 無痕改寫 | ✅ 重算哈希不符,當場暴露 | | 正常追加新記錄 | 寫入 | ✅ 自動入鏈,不影響使用 |

這次修復沒做到的(必須說清)

hash 鏈不讓行"刪不掉",它讓"刪和改"變得"藏不住"。 有數據庫權限的人依然能物理刪除整段記錄——只是校驗會告訴你"這裡斷了"。要做到連我們自己都無法抵賴,還差一步:把鏈尾的賬本指紋,錨定到一個我們自己也控制不了的地方(定期公示,或寫到外部鏈上)。那一步做完,"重寫尾鏈"這條後路才算徹底堵死。我們沒有假裝已經做到——這正是下一期的活。

三個教訓

1. 存證的表,不能是當事人能刪的表。 我們把攻擊記錄,和被攻擊者的操作權限,放進了同一層。裁判和選手不能是同一個人。

2. "寫進了數據庫"給人一種虛假的踏實。 這和第 3 期那個"會撒謊的 KYA"是同一類錯誤:看起來有記錄,真要用時發現記錄能被隨手改。以為有證據的人,比知道沒證據的人更危險。

3. 我們連續四期都打穿了自己。 擋住六發、漏了累計、地基是空的、日誌能抹掉。這不丟人,不敢公開才丟人。 一個標準值不值得信,不看它宣稱多完備,看它被自己人打穿時敢不敢把結果貼出來——包括這一條"我們本可以抹掉證據"。

下一期

我們會把賬本指紋錨定到外部,讓"重寫尾鏈"這條後路也斷掉;順帶看看:授權意圖(mandate)能不能被重放——一張簽過的授權,拿去付第二次會怎樣?

親手打一次:oceanalt.com/firewall · 用你自己的 Agent 測:集成指南

(OceanAlt 攻防實驗室 · 研究筆記)

分享:XLinkedInFacebookTelegramWhatsApp微博🖼 海報(英文)

這篇內容的出處與狀態

署名
OceanAlt 編輯部
首次發佈
2026-07-20
最後更新
2026-08-14
原始資料
未標註來源

引用這篇內容

OceanAlt 編輯部(2026)。《攻防實驗室 #4:我們能悄悄抹掉自己的攻擊記錄——審計日誌不設防》。OceanAlt。https://oceanalt.com/zh/articles/attack-lab-4-erasing-the-evidence(訪問日期:2026-09-16)

本文遵循 編輯準則與事實核查標準。發現錯誤請告訴我們,核實後會在此處公開更正。

先試一下 · 免費、不用註冊

付款前把收款地址粘進去,看它有沒有上過制裁名單、混幣器或詐騙標籤。

這套判斷也可以放進你自己的產品

一行代碼,不碰你的樣式和 JS。同一套結算前風險判斷可以出現在你的文章、你的錢包確認頁,或者作為接口供你的 Agent 在付款前調用。

組件不收集讀者身份。接入不代表 OceanAlt 對你的產品或頁面上的地址作安全背書。