2026数字中国网络和数据安全积分争夺团队赛——数据安全赛道Writeup教学文档
1. 数据安全
1.1 接口未授权访问审计
题目背景
题目要求对一个HTTP流量包(pc.pcapng)进行分析,目标是找出所有存在未授权访问风险的API接口,并将这些接口按字符串长度从小到大排序后输出。
提交格式示例:
/api/test
/api/users
/api/admin/info
核心审计步骤
-
流量筛选:
- 目标服务地址为
172.16.5.139:50000。 - 在Wireshark中使用过滤条件:
http && ip.addr == 172.16.5.139 && tcp.port == 50000,以聚焦目标站点的HTTP流量。
- 目标服务地址为
-
接口识别与判定标准:
- 从流量中筛选出所有形如
/api/xxx的请求路径。 - 未授权访问的判定条件:
- 请求端:请求中没有明显的认证字段,例如
Authorization、Cookie、Token、Bearer等。 - 服务端:返回
HTTP/1.1 200 OK状态码,且响应体中包含真实的业务数据。
- 请求端:请求中没有明显的认证字段,例如
- 从流量中筛选出所有形如
-
发现未授权接口:
通过对流量包的详细分析,发现了5个符合判定标准的接口:
| 序号 | 接口路径 | 长度 | 说明 |
|---|---|---|---|
| 1 | /api/user/info |
14 | 返回大量用户敏感信息(用户名、生日、密码等),无认证信息,可直接访问。 |
| 2 | /api/get_comment |
16 | 返回评论数据(包含评论者、IP、内容等),可被任意未授权用户读取。 |
| 3 | /api/lottery/result |
19 | 该接口通过POST方式访问。虽然GET请求被禁止,但构造合法的POST请求(无需认证)即可获取业务数据,属于未授权访问。 |
| 4 | /api/lottery/winners |
20 | 返回中奖名单(姓名、脱敏手机号、奖品),属于敏感业务数据泄露。 |
| 5 | /api/lottery/participants |
25 | 返回参与者数据(ID、姓名、身份证、发票号),属于严重的个人敏感信息泄露。 |
- 结果输出:
- 注意:
/、/cryptodemo、/robots.txt等路径虽可访问,但并非题目定义的“API接口”,故不纳入答案。 - 将找到的接口按长度排序后,最终提交的答案为:
/api/user/info /api/get_comment /api/lottery/result /api/lottery/winners /api/lottery/participants - 注意:
1.2 前端加密方案安全性检验
题目背景
题目要求分析目标平台用于保护用户数据传输的前端加密方案,找出其中RSA算法的私钥指数 d,并提交其十进制字符串的MD5值作为答案。
关键步骤与漏洞分析
-
漏洞入口:
/cryptodemo接口未授权,返回了包含完整前端加密逻辑的页面源码。 -
加密方案还原:
- 前端采用了“AES + RSA”的混合加密模式。
- 加密流程:
- 业务数据(明文)使用 AES-ECB-PKCS7 模式进行加密。
- AES密钥(16字节随机数)被转换为十六进制字符串,截取前16个字符。
- 使用 RSA公钥 对处理后的AES密钥进行加密。
- 将加密后的密钥和数据一起传输。
-
安全性分析:
- AES-ECB模式不安全:该模式无法隐藏明文块模式,在加密重复数据块时存在安全隐患。
- 密钥生成不规范:将16字节随机密钥转为ASCII字符使用,降低了密钥空间。
- RSA致命缺陷:公钥参数存在严重问题,这是解题的核心。从页面源码中提取出的RSA公钥模数
n非常大,但其两个大素数因子p和q极其接近。
-
RSA私钥破解(费马分解):
由于p和q非常接近,可以利用 费马分解法 快速分解大整数n。- 原理:对于
n = p * q,如果p和q接近,则可设a = (p+q)/2,b = (p-q)/2,则n = a^2 - b^2。通过递增a并检查a^2 - n是否为完全平方数,即可找到p和q。 - 文档指出,本题中
p和q的差值极小,导致费马分解几乎瞬间完成。
- 原理:对于
-
计算私钥指数
d:- 已知公钥指数
e = 65537。 - 分解得到
p和q后,计算欧拉函数φ(n) = (p-1)*(q-1)。 - 计算私钥指数
d,满足e * d ≡ 1 (mod φ(n))。 - 最终计算得到
d的十进制字符串为:19568491357 - 对该十进制字符串计算MD5,得到最终答案:
96151b8cb05f1c42d40ce233c62714da
- 已知公钥指数
1.3 数据泄露关联分析
题目背景
基于流量包中的多个未授权接口泄露的数据,关联分析并还原出一位特定人员的完整信息链。
信息还原与关联过程
-
数据源梳理:
/api/lottery/winners:泄露中奖名单(姓名明文,手机号脱敏)。/api/get_comment:泄露评论(姓名脱敏,IP明文)。/api/lottery/participants:泄露参与者信息(姓名、身份证脱敏,发票号明文)。/api/user/info:泄露用户信息(用户名、生日、密码MD5)。/cryptodemo:泄露前端加密逻辑和RSA公钥。
-
核心突破口:
- 攻击者对
/api/lottery/result接口发起大量POST请求,请求体使用前述加密方案保护。 - 利用第2题已破解的RSA私钥,解密请求体中的AES密钥,进而解密数据。
- 解密后发现,攻击者是在“爆破”某个中奖人的完整手机号(尝试从脱敏状态恢复)。
- 攻击者对
-
信息关联还原:
- 定位目标:从解密的请求中,找到一条服务端返回“中奖”的请求,其中包含一个完整的手机号,例如
188****8888被还原为18812345678。 - 匹配中奖名单:在
/api/lottery/winners中查找匹配此手机号(脱敏后)的记录,定位到目标人员,例如:张*。 - 关联用户信息:在
/api/user/info中查找姓“张”的用户,找到与生日匹配的记录,获得用户名等信息。 - 关联参与者信息:在
/api/lottery/participants中,根据姓名(张*)和身份证号(脱敏)匹配到具体记录。身份证中间8位是出生日期,可恢复完整身份证号。 - 关联评论与IP:在
/api/get_comment中,根据姓名(张*)找到相关评论,获取其明文IP地址。
- 定位目标:从解密的请求中,找到一条服务端返回“中奖”的请求,其中包含一个完整的手机号,例如
-
构建完整信息链:
将以上信息按“姓名-用户名-生日-身份证号-手机号-IP地址”的顺序用“-”连接,形成最终答案。示例如下:张*_zhangwei_19900101_371423199001015896_18812345678_192.168.1.100
2. 数据访问安全分析
2.1 部门数据访问权限统计
附件:3张员工表图片、9个SQLite数据库、访问日志、IP地理信息CSV、答案哈希工具。
目标:根据各部门可访问的数据表范围,统计其可访问的表数量和数据库数量。
解题思路:
- 整理员工与部门关系:从员工表图片中提取员工工号、所属部门、权限等级。
- 解析数据库结构:读取9个数据库,获取所有表名,并按“系统”进行分类汇总。
- 映射部门权限:根据题目给出的各部门可访问系统范围,计算每个部门可访问的表总数和涉及的数据库总数。
- 信息技术部:人力资源管理系统(8表)+ 财务与综合管理系统中的3张特定表(系统运行日志、安防管理信息、音影像信息),共11张表,2个库。
- 风险管理部:风险合规管理系统(10表)+ 交易与支付系统(5表),共15张表,2个库。
- 零售业务部:客户信息管理平台中的个人客户相关表(12表)+ 零售银行业务系统(10表),共22张表,2个库。
- 公司业务部:客户信息管理平台中的企业客户相关表(10表)+ 公司银行业务系统(13表),共23张表,2个库。
- 运营管理部:保险核心业务系统(19表)+ 信托业务系统(5表)+ 财务与综合管理系统中的9张特定表,共33张表,3个库。
- 生成答案:将五个部门的统计结果按“表数量,数据库数量”的格式拼接,然后计算其MD5值提交。
2.2 越权访问记录识别
目标:从访问日志中,找出所有员工访问了不属于其部门管辖范围的数据表的行为记录(无论访问成功与否),按日志ID升序输出。
解题思路:
- 解析日志:读取
access_log.log,提取每条记录的日志ID、员工号、访问的数据表和数据库。 - 判定越权:根据第1题建立的“部门-允许访问表集合”映射关系,判断每条日志中员工访问的表是否在其所属部门的允许范围内。只要访问的表不在允许范围内,即判定为越权。
- 统计输出:将所有越权访问记录的日志ID提取出来,按升序排序。最终统计得到350条越权记录。将所有ID用逗号连接后计算MD5提交。
2.3 异常访问行为分析
目标:基于访问日志,识别三类异常行为,并统计每种异常类型的记录数。
异常类型与判定规则:
- 地理位置不可能跳转:
- 同一员工相邻两条日志(按时间排序)。
- 时间差 ≤ 7200秒(2小时)。
- 两城市间的直线距离 > 500公里。
- 则这两条日志均标记为该异常。
- 异常时段访问:
- 访问时间在 00:00:00 至 05:00:00 之间。
- IP地址突变:
- 计算每个员工的“常驻城市”(历史日志中出现次数最多的城市)。
- 若某条日志的访问城市与常驻城市的距离 > 300公里,则标记。
解题步骤:
- 数据准备:将日志中的IP地址与
dbip-city-ipv4-cn.csv匹配,获取城市经纬度,用于计算距离(使用Haversine公式)。 - 顺序处理:将日志按员工分组,并按时间排序。
- 规则判定:
- 地理位置不可能跳转:遍历每个员工的相邻日志对,计算时间差和距离,符合条件则标记两条日志。
- 异常时段访问:直接根据访问时间判断。
- IP地址突变:先统计每个员工的常驻城市,然后逐条判断。
- 去重与统计:
- 同一条日志可能同时命中多种异常。
- 同一日志的同一异常类型只计一次。
- 最终结果按“日志ID,异常类型”的格式输出,并按日志ID升序、同一ID下按异常类型字符串升序排列。
- 最终统计:
- 地理位置不可能跳转:720 条
- IP地址突变:290 条
- 异常时段访问:89 条
- 总计:1099条异常记录。将总条数转换为MD5提交。
3. 异常数据传输
3.1 传输文件完整性校验
目标:从HTTP流量中还原传输的图片文件,与提供的md5.csv比对,找出被篡改的文件。
解题步骤:
- 提取文件:从
流量.pcap中过滤出192.168.56.23向192.168.56.10:80发起的HTTP GET请求,提取所有/images/xxx.png的响应体,按Content-Length正确截断,保存为PNG文件。 - 计算并比对MD5:计算每个还原出的PNG文件的MD5值,与
md5.csv中的记录进行比对。 - 找出差异:发现以下三个文件的MD5不匹配:
009.png012.png021.png
- 生成答案:将这三个文件的编号按数字顺序排列,用英文逗号连接,得到字符串
"009,012,021",然后计算其MD5值提交。
3.2 隐写程序提取
目标:在异常文件中查找隐藏的提取程序,并计算其MD5。
解题步骤:
- 分析异常文件:
012.png的PNG文本块中包含一段提示代码,描述了在图片蓝色通道中隐藏数据的算法:按8x8分块,对每块做DCT变换,使用坐标(3,4)的系数,通过QIM隐写(步长QIM_STEP=36.0)嵌入数据,数据格式为“4字节长度前缀 + payload”。
- 提取隐藏程序:
- 根据提示,对
012.png的蓝色通道执行上述算法,提取出隐藏的字节流。 - 提取出的前4字节表示后续payload长度,读取相应长度的数据。
- 提取出的数据是一个Python字节码文件(
.pyc),文件头为0x550d0d0a。
- 根据提示,对
- 计算MD5:对该
.pyc文件计算MD5值并提交。
3.3 使用提取程序解密信息
目标:使用从012.png提取出的程序,从另一个异常文件中解密出隐藏的明文信息。
解题步骤:
- 分析提取程序:反汇编
.pyc文件,其逻辑是从一张PNG图片的Alpha通道最低有效位(LSB)中提取数据。提取流程同样是“先读取4字节长度,再读取对应字节数的payload”,最后将结果做Base64输出。 - 定位密钥:
009.png的PNG文本块中包含注释key: ctf2026,提示了后续解密的密钥。 - 执行提取与解密:
- 使用提取程序处理
009.png,从其Alpha通道LSB中提取出550字节的密文数据。 - 该密文结构是固定的11字节块重复50次。
- 使用
ctf2026(11字节)作为密钥,对550字节密文进行循环异或(XOR)解密。 - 解密后得到重复50次的明文信息,其核心内容为最终答案。明文示例如下:
The secret message is: Congratulations, you have recovered the hidden data! The flag is hidden in the alpha channel.
- 使用提取程序处理
4. 数据恢复与审计
4.1 数据库文件恢复
目标:从HTTP流量包(users.pcapng)中恢复被分片传输的数据库文件users.db,并提交其MD5。
解题步骤:
- 流量分析:在流量中发现对
/download/users.db的HTTP请求,服务器返回206 Partial Content,表明文件通过Range请求分片传输。 - 重组文件:
- 提取所有对该路径的响应,根据响应头中的
Content-Range字段(如bytes 0-6479/851968)确定数据片段的偏移和长度。 - 将每个响应体的数据写入到重建文件的对应偏移位置。
- 提取所有对该路径的响应,根据响应头中的
- 验证与提交:重组完成后,得到一个完整的
users.db文件(大小851968字节)。计算其MD5值(4741c655d6d1281b9d89cb9f7ef63c10)并提交。
4.2 数据库密码恢复
目标:从流量中恢复用于加密users.db数据库的密码。
解题步骤:
- 发现线索文件:在流量中发现另一个分片传输的文件
/download/important.eml,同样通过Range请求恢复。 - 解析邮件:恢复出的
.eml文件是一封邮件,正文经过Base64编码。解码后得到关键信息:- 密码格式为:
姓名小写全拼 + 4个字符 - 收件人为:
李伟
- 密码格式为:
- 推导密码:由此推断密码前缀为
liwei,需要爆破或结合其他信息确定后缀4字符。通过尝试或结合题目上下文,最终得到完整密码。 - 验证密码:使用
SQLCipher和恢复的密码liwei****(具体后缀需根据题目确定)成功打开数据库,验证密码正确。
4.3 数据脱敏审计
目标:解密数据库,根据规则审计users表中用户信息的脱敏情况,统计不同风险等级的用户数量。
审计规则:
- 敏感字段:
name(姓名),email(邮箱),phone(手机号),id_card(身份证号)。 - 脱敏判定:字段值中包含
*号即视为已脱敏。 - 基础风险等级:
- 严重风险:4项均未脱敏。
- 高风险:1项脱敏。
- 中风险:2项脱敏。
- 低风险:3项脱敏。
- 无风险:4项均脱敏。
- 风险升级规则:对于低、中、高风险的用户,如果其
created_at(创建/活跃时间)不在当前时间前推7天内,则其风险等级上升一级(无风险和严重风险不升级)。
审计步骤:
- 连接数据库:使用恢复的密码打开
users.db。 - 数据查询与判定:
- 编写SQL语句,逐行判断四个字段的脱敏状态。
- 根据脱敏数量确定基础风险等级。
- 根据
created_at字段与当前时间(题目给定)的差值,对符合条件的用户进行风险升级。
- 统计与提交:统计各风险等级的用户数量。文档示例结果为:
- 无风险:86
- 低风险:195
- 中风险:1187
- 高风险:2994
- 严重风险:5538
- 将结果按格式拼接为
86-195-1187-2994-5538,并计算其MD5值提交。
5. 人脸识别
5.1 可疑身份聚类
目标:对face_features.csv中的特征向量进行聚类,找出最大的可疑身份特征聚类,并在该聚类中选择平均相似度最高的特征作为代表。
解题步骤:
- 数据准备:解析CSV文件,获取每个
face_id的512维特征向量。 - 聚类分析:使用DBSCAN算法,参数设置为
eps=0.15,min_samples=3, 距离度量使用metric='cosine'(余弦距离)。 - 结果分析:
- 去除噪声点(标签为-1)。
- 找出样本数最多的聚类(非噪声簇)。文档中指出最大的簇包含220个特征。
- 选择代表特征:在最大的聚类内部:
- 计算任意两个特征向量之间的余弦相似度。
- 对聚类内的每个样本,计算其与同簇所有其他样本的平均相似度。
- 选择平均相似度最高的那个样本的
face_id作为代表。
- 输出结果:代表特征为
FACE_001308。
5.2 跨安全级别风险评分
目标:计算不同安全级别的特征对之间的风险评分,找出风险评分最高的特征对,提交其所属区域的组合(按字母顺序用下划线连接)。
风险评分公式:
风险评分 = 相似度 × (高安全级别 - 低安全级别) × 平均验证频次因子
其中:
相似度:两个特征向量间的余弦相似度。(高安全级别 - 低安全级别):两个特征安全级别值的差。平均验证频次因子:(log(特征1验证次数+1) + log(特征2验证次数+1)) / 2
解题步骤:
- 数据整合:
- 从
face_features.csv读取特征向量、区域(area)、安全级别(security_level)。 - 从
access_records.csv统计每个face_id出现的总次数作为“验证次数”。
- 从
- 计算特征对:
- 计算所有特征对间的余弦相似度。
- 只保留安全级别不同的特征对。
- 计算评分:对每一对符合条件的数据,根据上述公式计算风险评分。
- 找出最高分:找出风险评分最高的一对特征。
- 输出结果:提取这两个特征所属的区域,按字母顺序拼接。文档中结果为
Lobby_Security。
5.3 特征去重
目标:根据余弦相似度阈值对特征进行去重,并提交去重后剩余的特征总数。
去重规则:
- 设置余弦相似度阈值为 0.95。
- 找出所有相似度 ≥ 0.95 的特征对。
- 去重时,彼此直接或间接相似的特征视为一个组(连通分量),每组只保留一个特征。
- 保留规则:
- 优先保留安全级别更高的特征。
- 若安全级别相同,则保留
face_id字典序更小的特征。
解题步骤:
- 构建相似图:将每个特征视为节点。如果两个特征的余弦相似度 ≥ 0.95,则在它们之间连一条边。
- 寻找连通分量:使用并查集(Union-Find) 算法,找出图中所有连通分量。每个连通分量代表一组高度相似、需要去重的特征。
- 应用保留规则:在每个连通分量内部,根据上述保留规则,确定唯一保留的特征。
- 统计结果:统计去重后剩余的特征总数。文档中指出,原始特征总数为1550,去重后剩余1252个。
6. AI数据隐私
6.1 模型知识产权溯源
目标:从11组cover_i.jpg和model_i.pth文件中,提取并还原出隐藏的手机号。
核心原理:题目模拟了模型水印溯源场景。攻击者(内鬼)在模型的权重中叠加了可控噪声来隐藏信息(数字),并通过封面图的元数据提供了解码所需的索引和种子。
解题步骤:
-
从封面图提取元数据:
- 元数据存储在JPEG文件的JUMBF/C2PA块中,而非普通EXIF。
- 从
cover_i.jpg中直接解析字节,提取关键字段:sequence_index:数字水印的序号(1-11)。seed_timestamp:生成噪声所用的随机数种子。target_tensor:指示水印藏在哪个网络层(本题为conv1.weight)。
-
分析模型与水印:
- 加载
model_i.pth,这是一个ResNet风格的模型。 - 检查
conv1.weight(第一层卷积权重),发现其数值分布异常(标准差约15),远超正常预训练模型的幅度,表明被叠加了大幅高斯噪声。
- 加载
-
噪声还原与水印提取:
- 噪声模型:假定添加的噪声为
噪声 = 系数 * randn(seed)。从封面图元数据得到seed_timestamp,系数通过分析权重幅值估计为15。 - 去噪:用对应种子初始化随机数生成器,生成与
conv1.weight同形状的随机数,乘以系数15,然后从原始权重中减去,得到残差(residual)。 - 提取数字:
- 去噪后的
residual形状为[64, 3, 7, 7]。 - 数字水印被冗余写入到通道维度。通过对
[64, 3]两个维度进行投票(如取平均或众数),将其压缩为一个7x7的二维矩阵。 - 将此矩阵二值化,即可得到一个
7x7的点阵数字图像。人工识别或通过模板匹配可得到数字0-9。
- 去噪后的
- 噪声模型:假定添加的噪声为
-
按序拼接:
- 对11个模型分别执行步骤3,得到11个数字(按
model_1到model_11顺序)。 - 根据从封面图中提取的11个
sequence_index,将数字重新排序,得到正确的手机号序列。 - 文档中最终还原的手机号为:
19568491357。
- 对11个模型分别执行步骤3,得到11个数字(按
6.2 语义空间数据反演
目标:从包含1000个向量的数据库(database.npz)中,找出语义异常的目标向量(对应泄露的敏感文本)。
背景信息:
- 页面泄露了使用的模型是
all-MiniLM-L6-v2,向量维度384,使用余弦相似度。 - 页面源码注释泄露了一个备份脚本文件
data_inte.py.bak,其中显示了向量化前的原始文本模板:[Attention]核心客户{name}的手机号是 {phone},请勿外传。
解题思路:目标文本(警告语句)与数据库中的其他正常业务文本在语义上差异巨大,因此在向量空间中会成为明显的离群点。
解题步骤:
- 加载数据:加载
database.npz,得到1000个384维向量和对应的ID。 - 向量归一化:由于使用余弦相似度,先将所有向量进行L2归一化。
- 寻找异常点:
- 计算每个向量与其他所有999个向量的余弦相似度。
- 对于每个向量,找出其最大的余弦相似度(即与其最相似的邻居的相似度)。
- 正常情况下,语义相近的向量会有很高的最近邻相似度。而异常文本的最近邻相似度会显著偏低。
- 锁定目标:按最近邻相似度从低到高排序,相似度最低的向量即为最异常的点。文档中锁定为
vec_0792,其与最近邻的相似度远低于其他向量对的平均相似度。 - 输出结果:提交该异常向量的ID,例如
vec_0792。
6.3 密文推理对抗样本
目标:上传一张对抗样本图片,使其同时满足以下三个条件:
- L∞约束:与参考图片
target_image.png的像素偏差不超过2/255。 - 明文推理一致:在普通模型(明文)上的预测结果与参考图片一致(均为“正常”)。
- 密文推理翻转:在密文推理模型上的预测结果与明文相反(变为“肺炎”)。
系统分析:
- 模型是一个简单的CNN,末尾有一个全连接层。
- 密文推理:对全连接层的输入特征和权重进行量化,并在模数环中进行计算。
- 关键解码规则:设模数为
PLAIN_MODULUS。量化分数raw_score经过模运算解码后,如果raw_score > PLAIN_MODULUS // 2,则会被解释为负数(decoded = raw_score - PLAIN_MODULUS)。
攻击原理:
- 目标是构造一个微小扰动,使得目标类别的量化分数
raw_target被推到刚好超过PLAIN_MODULUS // 2的边界。 - 这样,在密文解码时,
decoded_target会变成一个较大的负数,导致密文预测结果从“正常”翻转为“肺炎”。 - 同时,由于扰动极小,普通浮点模型(明文)的预测结果保持不变。
攻击难点与方案:
- 难点:
L∞ ≤ 2/255的约束极强,普通的对抗攻击方法(如FGSM, PGD)生成的扰动通常超出此范围。 - 方案:在离散的整数像素空间(
[-2, -1, 0, 1, 2])内进行搜索。不能使用连续优化后取整,因为取整会破坏翻转效果。 - 步骤:
- 分析
target_image.png在明文和密文模型下的原始输出。 - 确定需要推动的量化分数目标区间。
- 使用启发式搜索(如坐标下降、遗传算法等),在严格的
L∞约束下,寻找能使密文分数越过临界值,同时保持明文预测不变的图片。 - 最终生成满足所有条件的对抗样本图片并提交。
- 分析
最终Flag:flag{96151b8cb05f1c42d40ce233c62714da}
6.4 隐私梯度逆向
目标:通过可控的模型参数上传和可下载的梯度,逆向推演出训练数据(即Flag)。
系统交互:
- 模型结构:一个简单的两层全连接网络(
W1: 16×17,b1: 16,W2: 1×16,b2: 1)。输入维度17,正好是flag{11位字符}的长度。 - 攻击者能力:可以上传自定义的模型参数
(W1, b1, W2, b2)。分行(客户端)使用固定本地数据(即Flag)进行一次训练,并返回加噪的梯度(noisy_grad_w1, noisy_grad_b1)。
攻击原理(参数控制法):
- 设计特殊参数,简化梯度形式,便于逆向输入
x:- 设
W1 = 0(零矩阵),b1 = 1(全1向量)。 - 设
W2 = [10, -10, 10, -10, ...](交替正负)。 - 设
b2 = 0。
- 设
- 在这种参数下,前向传播与梯度计算被极大简化:
- 第一层输出:
z1 = W1*x + b1 = 1,经过ReLU后仍为1(全导通)。 - 损失函数对
W1第i行、第j列的梯度近似为:∂L/∂W1[i,j] ≈ δ_i * x[j],其中δ_i是一个与W2[i]相关的标量。 - 损失函数对
b1第i个元素的梯度为:∂L/∂b1[i] ≈ δ_i。
- 第一层输出:
- 关键等式:因此,
(∂L/∂W1[i,j]) / (∂L/∂b1[i]) ≈ x[j]。即,用第i个神经元对应的权重梯度向量除以它的偏置梯度,就可以近似恢复出输入向量x的第j个分量。
攻击步骤:
- 上传设计的参数到服务端。
- 下载返回的加噪梯度
noisy_grad_w1和noisy_grad_b1。 - 利用关键等式进行恢复:对16个隐藏神经元(
i=0 to 15),分别计算r_i = noisy_grad_w1[i] / noisy_grad_b1[i],得到16个对输入x的估计值r_i(每个都是17维向量)。 - 去噪与校准:由于梯度加了噪声,每个
r_i与真实x存在线性偏差。利用Flag格式已知的前5位(f,l,a,g,{)和最后1位(})作为校准点,对每一行r_i拟合一个仿射变换s_i = a_i * r_i + b_i,使其在校准点上与真实ASCII值匹配。 - 聚合结果:将16行校正后的
si在每一维(字符位置)上取中位数,再四舍五入到最近的整数(ASCII值),最后转换为字符。 - 提取Flag:得到完整的17位字符串
flag{...},其中花括号内的11位字符即为答案。
文档中恢复的答案:9tHgr4d13nT