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                         在规则中
   206   207   208   209   210   211   212   213   214   215   216