篡改不是"把数据删掉",而是"让数据还是那副样子,但内容已经不是原来那个了"——它攻击的是完整性,而完整性最难的地方在于:你不比对,就看不出来。
上一节(数据的偷窥)讲的是看(机密性)。这一节讲的是改(完整性)——攻击者从旁听席走到操作台前。
按第一章的三要素排,两节的顺序恰好对应它们的发现难度(见 信息安全的三要素):可用性出事你立刻知道,完整性出事你能查,机密性出事你这边一切正常。这一节正好落在中间那一档——它有痕迹,但需要你主动去比。
一、"可靠"在这里是什么意思
教材用的词是"可靠性",但落到实处,它说的是完整性的两层含义:
- 内容没被动过——你看到的就是原来那个;
- 来源没被换过——确实是那个人给的,不是别人冒充的。
这两层里,第一层是"数据完整性",第二层其实已经跨到了"真实性"(2-3 会专门讲)。所以这一节的重点是第一层:数据在存储、传输、处理的过程中,是否被非法改动。
要注意一个区别:
| 攻击方式 | 破坏的是什么 | 典型表现 |
|---|---|---|
| 删除/加密勒索 | 可用性 | 文件打不开、打不开了 |
| 篡改 | 完整性 | 一切看起来正常,内容是假的 |
篡改比删除更危险,因为删除是"明显的故障",篡改是"安静的谎话"。
二、篡改会发生在哪些环节
数据的一生有四个阶段,每个阶段都能被改:
- 传输中——数据在链路上被截下来改掉再放回去(中间人正好便于做这件事)。
- 存储中——直接改数据库、改文件、改日志。
- 处理中——代码或配置被改,于是计算结果是错的,但每一步都"正常执行"。这是最隐蔽的一种。
- 展示中——前端页面被改,后台数据其实是对的。这在网站被篡改(俗称"挂黑页")里最常见。
第四种最容易被低估:很多单位只查数据库,不查网页文件。但对外面的人来说,你网站上显示什么,你就是什么。
三、几种典型手法
- 网页篡改(挂黑页):把首页换成攻击者的内容,或者插入一堆陌生文件(
.txt、.html、.php)。动机常常不是钱,而是"留名"或表态。 - 供应链投毒:不改你的代码,改你引用的那个包。你下载的是"官方包",但那个包已经被污染——下游成千上万个系统一起中招。
- 日志篡改:把记录自己痕迹的那几行删掉或改掉。所以日志的保护要求和普通数据不一样:要能证明它自己没被动过(这也是第一章"责任可追溯性"的落点)。
- 中间人改写:在传输途中改内容。如果只是加密而不做完整性校验,有些攻击仍然能插入或改动。
四、怎么防:三个层次
把防篡改的手段按"能证明什么"排,从弱到强:
- 权限控制——不让不该改的人有权限改。属于第一道门(对应第一章的"最小权限原则")。
- 完整性校验(校验和/散列)——给数据算一个"指纹",需要时重算一遍比对。指纹变了就说明动过,但注意:它只能发现改动,不能阻止改动,也不能防止"改了之后把指纹一起改掉"。
- 数字签名——用私钥签名。这一层同时解决三件事:完整性(内容改了签名就不对)、真实性(确实是持私钥的人签的)、不可抵赖性(事后不能否认)。这就是第一章里说的"数字签名一次覆盖三项"。
对要长期保存、要经得起质疑的数据,第三层才是终局。前两层是日常。
五、动手 Demo:文件完整性监控怎么发现网页被改
下面这段脚本给一个网站做"体检":先记下一份基线(每个文件的摘要),再和当前状态比对,找出所有变化。
# 基线:网站发布时的文件与摘要
baseline = {
"index.html": "a1b2c3d4",
"about.html": "77e0f19a",
"product.html": "3c9d52be",
"contact.html": "b81f6a07",
"media/logo.png": "5e2ac114",
"media/promo.jpg":"9f4d7b62",
"js/app.js": "d0c3e881",
"js/vendor.js": "6a7f0d29",
}
# 当前:逐项比对,找出 内容改动 / 新增 / 删除 三类变化
实跑输出:
文件 基线摘要 当前摘要 判定
------------------------------------------------------------------
index.html a1b2c3d4 ff0012ab 内容已改动
about.html 77e0f19a 77e0f19a 一致
product.html 3c9d52be 3c9d52be 一致
contact.html b81f6a07 b81f6a07 一致
media/logo.png 5e2ac114 5e2ac114 一致
media/promo.jpg 9f4d7b62 9f4d7b62 一致
js/app.js d0c3e881 d0c3e881 一致
js/vendor.js 6a7f0d29 48c1ba90 内容已改动
shell.php —— e3b0c442 新增(基线里没有)
结果:一致 6 | 已改动 2 | 新增 1 | 删除 0
① 最该看的不只是【被改的】,还有【多出来的】——
一个本该只放静态页面的站,多出一个 shell.php,
说明攻击者已经能往服务器上写文件了。
② js/vendor.js 这类第三方脚本文件被改,往往是从上游组件带进来的——
这是 2026 年最典型的一类篡改,改的不是你的代码,是你引用的代码。
③ 文件完整性监控的作用不是阻止篡改,而是【让篡改被看见】。
没有基线,改了也不知道;有基线,改动本身就是证据。
读这个输出:注意两处。第一处是 shell.php 那行——它是新增,不是改动。这意味着攻击者已经拿到了往服务器写文件的能力,比首页被换掉严重得多。第二处是 js/vendor.js——它是个第三方脚本,被改往往不是有人直接动了你的服务器,而是上游的包被投毒了。这两种"被改"的处置方式完全不同,所以分类比发现更重要。
六、⚠️ 2026 现状
- 网页篡改没有消失,反而在规模化。 2026 年上半年仍是被点名的显著威胁,攻击者会批量扫描同类网站结构(相同的目录、相同的第三方组件),一次打进成百上千个站。典型动机已经从"要钱"变成"表态"或"留名",因此受影响的行业很分散——零售、百货、家居、保健品、美妆、电商都在名单上。
- 一次典型的规模化篡改: 2026 年 2 月 27 日起,针对某电商平台的未授权文件上传漏洞,攻击者篡改了 7,500 多个域名、15,000 多个主机名,其中包括多家国际品牌的地区站与子站。手法只是往服务器上放纯文本文件,但已经足够改变页面内容。
- 篡改是"坏消息里最轻的那个"。 那条权威安全警示说得很直白:即使没有确认数据泄露,网站完整性被破坏本身就说明——攻击者已经拿到了未授权的访问权限。所以一旦发现篡改,处置动作不是"把页面改回来就完了",而是当成一起入侵事件来查:入侵路径、恶意文件、漏洞修复、口令重置、持续监控。
- 供应链方向的篡改在 2026 年成了主战场。 这一年 npm 生态连续爆发自复制蠕虫(Shai-Hulud 系列、ChainDrop 等),一次维护者账号被劫持,就能把该账号能发布的所有包一次性投毒,并继续感染下游。最麻烦的变化是这些包带着有效的签名与构建来源证明——验签全过。 也就是说,传统的"验签名"这一步在 2026 年已经不足以判断一个包是否可信。
- "零 CVE"这个数字最能说明问题。 有统计盘点了近两年 59 个供应链投放活动、657 个恶意包样本,其中没有任何一个被分配 CVE 编号。原因是这类攻击利用的不是代码缺陷,而是信任假设——所以"打补丁"这条路走不通,能做的只有:锁定依赖的确切版本、审计依赖清单、及时轮换凭据。
30 秒实验
做一次最简单的完整性检查:
- 选一个文件(比如一份重要合同的扫描件),给它算一个摘要值。Windows 可以在 PowerShell 里用
Get-FileHash 路径;Linux/macOS 用shasum -a 256 路径。 - 把结果抄在纸上或另存到别处(不要存在同一个文件夹里)。
- 改一个字符再保存,重算一次摘要,看两个值是不是完全不同——你会发现哪怕只改一个标点,摘要也会面目全非。
这一节要带走的一句是:篡改不需要让你看见它——所以你必须提前留一个"原样"的凭据,不然你连"变了"都不知道。
常见误区
-
错误:文件加了权限,别人改不了,所以不会有事。——纠正:权限控制的是合法路径。攻击者一旦拿到了高权限账号(或被攻破的应用进程),你设的权限就形同虚设。能改而没改和改不了是两回事,需要靠"有没有被改"的证据来判断。
-
错误:算了校验和就够了,不用签名。——纠正:校验和只能证明"现在的内容和摘要对得上"。如果改动者连摘要一起改,校验就通过了。要对抗这一点,摘要本身必须被保护起来(存到攻击者碰不到的地方,或者用私钥签名)。校验和的强度取决于摘要存放在哪里。
-
错误:网站被篡改,恢复一下文件就行。——纠正:篡改是入侵成功的信号,不是孤立事件。要按入侵事件处置:查入侵路径、清恶意文件、修漏洞、重置凭据、持续观察。只恢复页面,等于把门开着把报警器关掉。
-
错误:第三方的组件改了不关我的事。——纠正:只要你的系统在用它,后果就是你的。对供应链的处置是:锁定依赖的确切版本、留一份依赖清单、对关键更新先验证再上。"我没改"和"没被改"不是同一个意思。
自测三问(点开对答案)
1. 为什么说篡改比删除"更危险"? —— 因为**可见性不同**。删除造成的是明显故障,用户立刻知道;篡改让数据保持原来的形态,**内容却是假的**,可以长期不被发现。而且假数据往往会被**当作事实使用**——用于决策、对外发布、进入报表,**污染扩散出去之后收不回来**。 2. 校验和与数字签名,各自能证明什么?差在哪里? —— 校验和只能证明**内容与摘要一致**(完整性),但摘要本身可以被一起改掉。数字签名在完整性之外还提供**真实性**(确认是谁签的)和**不可抵赖性**(事后不能否认),并且**签名无法被伪造**。所以校验和适合日常快速比对,数字签名适合需要长期、可对外证明的场景。 3. 为什么发现网页被篡改后,不能"把页面改回来就完事"? —— 因为篡改说明**攻击者已经具备未授权访问的能力**。他今天改页面,明天可能读数据、装后门、改配置。正确处置是把它当**入侵事件**:查明入侵路径、清除恶意文件、修补被利用的漏洞、重置相关凭据、并持续观察是否还有残留。**只修表面症状,等于把已确认的门锁漏洞留着不动。**- ☐ 下一节(2-3 冒充特定的人物)
相关笔记
- 数据的偷窥 —— 上一篇:先能听到,才能改
- 冒充特定的人物 —— 下一篇:完整性之外,还要确认"到底是谁"
- 设置用于攻击的后门 —— 篡改服务器的下一步:装一个长期入口
- 三要素以外的特性 —— 数字签名为什么一次覆盖三项
- 🛡️ 网络与信息安全 · 索引 —— 全课路线图