Page 211 - 《软件学报》2026年第7期
P. 211
2896 软件学报 2026 年第 37 卷第 7 期
逻辑的后续影响, 可结合前述多段数据流分析方法进行. 以下将详细介绍基于多标签数据流的原型链污染漏洞检
测算法的实现.
T = {t input ,t proto }: 输入污染标签 t input , 用于
● 污染标签配置. 原型链污染检测规则使用两种类型的污染标签, 即
标记用户输入污染数据; 原型对象标签 t proto , 用于标记与原型对象相关的数据.
● 污点源匹配. 原型链污染的漏洞特性, 决定了污点源的匹配方式根据分析目标而异: 对于第三方库, 可采取
更保守的匹配方式, 将所有外部可访问方法 (如包含 export 关键字) 的参数标记为输入类型污点; 规则中不配置与
原型对象相关的污点源模式, 即原型对象污染变量并非由直接匹配得到, 而是在污染传播追踪过程中进行转化.
● 污点传播追踪. 该阶段中, 算法配置如下的跨标签污染传播谓词:
′
′
isCrossTag(⟨v,t input ⟩,⟨v ,t proto ⟩) ≡ ∃obj ∈ P, v = Read(obj.v)∧isVariable(v) (6)
即关注代码语句中的动态属性读取操作或等价形式, 当访问的对象属性名称为用户输入类型污点时, 将访问结果
标记为原型对象类型污点, 实现跨标签污染传播. 例如图 7 中代码第 5 行的动态属性访问操作 curState[keys[i]],
当分析至该语句时, 污染变量集合中包含 ⟨keys[i],t input ⟩ 元素, 攻击者可将 keys[i] 的值设置为__proto__, 进而劫持
curState 的原型对象. 因此, 算法将根据如上的跨类型污点传播谓词, 将 ⟨curState[keys[i]],t proto ⟩ 加入污染变量集合
中. 此处 curState 同样为用户输入类型污染变量, 但实际上算法对于属性访问的目标对象是否污染并无要求, 仅要
求其原型对象为 Object.prototype.
1 exports.setData = function(state, keys, value) { t input t proto
2 let curState = state;
value keys
3 let len = key.length − 1;
ॴѓద
ԮѬ
4 for (let i = 0; i < len; i++) {
keys[i] curState[keys[i]]
5 curState = curState[keys[i]];
6 } keys[len] curState
7 curState[keys[len]] = value;
8 };
curState[keys[len]] = value;
图 7 原型链污染漏洞检测过程
● 敏感操作检测. 原型链污染漏洞的约束条件谓词采取如下定义方式:
isVuln(V taint ) ≡ ∃⟨obj,t proto ⟩,⟨v,t input ⟩ ∈ V taint ,Write(obj.v)∨Delete(obj.v) (7)
具体而言, 算法关注代码语句中的动态属性赋值操作 (如图 7 中第 7 行) 或动态属性删除操作 (如 delete
curState[key]), 并基于当前语句处的污染变量集合信息进行判断, 若目标对象包含原型对象污染标签, 且目标属性
包含用户输入污染标签, 证明攻击者可对 Object.prototype 产生实际影响, 此时将报告原型链污染漏洞.
3 MultiFlow 分析系统实现
基于第 2 节中介绍的两类多数据流污点分析算法及其应用场景, 本文实现了一个面向 Web 应用安全的静态
漏洞检测原型系统 MultiFlow. 该系统采用 Java 和 TypeScript 作为开发语言, 支持对 Java Web/JavaScript Web 应
用的安全漏洞静态检测, 并具备扩展至其他编程语言场景的潜力. MultiFlow 的整体工作流程如后文图 8 所示, 分
为 3 个主要阶段: 基础分析、多数据流污点分析及漏洞报告生成.
3.1 系统输入
MultiFlow 以待分析程序和漏洞规则为输入, 采取与现有 Web 应用静态分析工具 [6,9] 类似的漏洞规则配置方
式, 支持为目标漏洞指定三元组信息, 以及污点传播条件等其他常见安全相关方法配置. 此外, MultiFlow 在规则中

