Page 217 - 《软件学报》2026年第7期
P. 217

2902                                                       软件学报  2026  年第  37  卷第  7  期


                    MultiFlow  和  CodeQL  的漏洞检测结果总览如表      6  所示, 在  20  个  JavaScript 第三方组件和  10  个  JavaScript
                 Web 应用中, MultiFlow  共检测到  43  例原型链污染漏洞, 总体检测精确率为 83.72%; CodeQL         共检测到    20  例原型
                 链污染漏洞, 精确率为       85.00%. 可以发现, 在二者的漏洞检测精确率接近的情况下, MultiFlow             在检测召回率上具
                 备显著优势, 相较于      CodeQL  可检测到更多的原型链污染漏洞. 对于数据集中的               20  个开源第三方组件, MultiFlow
                 检测到的   15  例漏洞内共包含     3  例已知漏洞, 以及   12  例未知  0-day  漏洞. 本文已向  CVE  官方报告了所有未知漏洞,
                 截至目前共收到      8  个  CVE  编号, 具体信息如表   7  所示. 这一结果有力地证明了        MultiFlow 在真实场景下的 Web
                 漏洞检测能力.


                                              表 6 原型链污染漏洞检测结果对比

                                               MultiFlow                            CodeQL
                     数据集分类
                                   检测总数       TP    FP    Precision (%)  检测总数    TP    FP    Precision (%)
                   20 NPM packages    21      15    6       71.43         8       6     2       75.00
                   10 JavaScript Apps  22     21    1       95.45        12       11    1       91.67
                       合计             43      36    7       83.72        20       17    3       85.00


                                      表 7 20  个开源第三方组件中       MultiFlow  获得的  CVE  编号

                        组件名称            组件版本       漏洞CVE编号          组件名称        组件版本        漏洞CVE编号
                       apidoc-core       0.15.0   CVE-2025-57**7     midway       1.0.0    CVE-2025-57**2
                          dref           0.1.2    CVE-2025-26**8     rollbar     2.26.4    CVE-2025-57**5
                        fast-redact      3.5.0    CVE-2025-57**9   sassdoc-extras  2.5.1   CVE-2025-57**6
                   json-schema-editor-visual  1.1.1  CVE-2025-57**0  spmrc        1.2.0    CVE-2025-57**7

                    ● 误报分析. MultiFlow 的  7  例误报主要产生原因在于, 其污点传播追踪阶段存在对间接语义约束的分析缺失.
                 例如图   9(a) 展示的代码片段中, 变量       groupId  来源于用户输入参数, 但字符串拼接逻辑决定其无法被控制为
                 __proto__或  constructor.prototype  等危险属性, 不可用于劫持原型. 而     MultiFlow  难以判断该复杂约束, 将
                 style[groupId] 错误标记为  t proto  类型污染变量, 进而在第 6 行赋值语句处产生误报; CodeQL       基于其声明式查询设
                 计可实现更精细的污染净化逻辑, 在此类案例上表现优于                  MultiFlow.

                             1   const GROUP_PREFIX = “group_”;     1   app.get(“/”, (req, res) => {
                               ...                                  2   let {taint, key, val} = req.query.data;
                                                                      ...
                             2   app.post(“/style”, (req, res) => {
                             3   const style = ... // javascript object    3   let object = {};
                             4   const {id, name, key, value} = req.body;   4   object[taint].foo = “bar”;
                             5   const groupId = GROUP_PREFIX + name + “_” + id;   5  object[taint][key] = value;
                             6  style[groupId][key] = value;
                                              (a)                              (b)
                                             图 9 简化后原型链污染漏洞误报示例

                    ● 交集分析. 本文对     MultiFlow  与  CodeQL  检出的漏洞样本进行了详细对比分析, 漏洞检测结果的具体分布关
                 系如图   10  所示, 二者共同识别出的漏洞数量为          9  例, 其中包含  1  例误报. 此外, 对于前述的    15  例开源第三方组件
                 漏洞, CodeQL  仅能检出  4 例, 包含  2 例已知漏洞和    2 例未知漏洞. 考虑    CodeQL  检出而  MultiFlow  未检出的 9 例漏
                 洞, 分析发现其产生原因为二者对漏洞品质要求的差异性: CodeQL                 的检测规则中, 仅考虑原型对象 Object.prototype
                 是否被污染, 而未关注攻击者是否能够任意控制污染属性名, 例如图                     9(b) 中, 第  4  行的赋值语句仅能固定影响原
                 型对象的    foo  属性, 但  CodeQL  仍将其视为漏洞进行报告. 此类操作实际上利用条件较为苛刻、漏洞品质低, 在
                 MultiFlow  的检测规则中被视为非漏洞. 这进一步表明了            MultiFlow  相较于  CodeQL  拥有更强的原型链污染漏洞
                 检测能力. 综上所述, 可认为 MultiFlow 的多标签数据流分析方法在原型链污染漏洞检测任务中具备良好的有效
                 性, 检测性能表现优于      CodeQL  对应漏洞规则实现.
   212   213   214   215   216   217   218   219   220   221   222