攻防实验室 #4:我们能悄悄抹掉自己的攻击记录——审计日志不设防
上期我们污染了审计链的「源头」,这期去删「记录本身」。真实结果:一次被拦下的攻击,管理员两下就能从威胁库和审计日志里删干净、不留痕迹——我们自己的「删除」按钮就是证据。支柱5(可追溯/不可抵赖)形同虚设。我们把审计日志改成 hash 链:删或改任意一条都会断链、可被校验发现。
攻防实验室 · 第 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 攻防实验室 · 研究笔记)
这篇内容的出处与状态
- 署名
- OceanAlt 编辑部
- 首次发布
- 2026-07-20
- 最后更新
- 2026-08-01
- 原始资料
- 未标注来源

