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

毛祥煜 等: 面向   Web  应用漏洞检测的多数据流静态分析方法                                              2895


                    ● 污点传播追踪. 该阶段为两类污染变量独立执行污点传播与净化分析; 此外, 为实现鉴权操作识别, 算法将
                 关注代码中某些特定的操作模式, 并基于可信源与用户输入污染变量信息, 综合判断相关操作是否实现了对用户
                 身份的验证逻辑. 一般来说, 若鉴权操作中对可信源进行独立验证, 通常代表该操作为垂直鉴权; 将可信源与用户
                 输入变量进行共同验证, 则通常为水平鉴权逻辑. 具体而言, 算法总结了如下几类常见的鉴权模式.
                    (1) 垂直鉴权   I.  t trust  流入条件语句比较逻辑. 该类型鉴权逻辑实现方式为直接使用可信源验证用户身份信息.
                 例如图   6(a) 展示的代码片段中, 可信源变量        userType 被用于验证当前用户是否拥有管理员权限.
                    (2) 垂直鉴权   II.  t trust  流入数据库查询, 并通过验证查询返回结果实现权限校验. 例如图           6(b) 所示代码片段, 其
                 语义为根据可信源变量        userId, 在管理员表中查询是否存在当前用户.
                    (3) 水平鉴权   I.  t trust  与  t input  同时流入比较逻辑, 鉴权实现方式为验证用户输入与可信源中相关信息的一致性.
                 例如图   6(c) 代码片段中, 比较   userId  与  id  的值是否相等.
                    (4) 水平鉴权   II.   t trust  和   t input  同时流入数据库查询, 且要求  t trust  在查询的条件子句中被使用. 该类型鉴权逻辑意
                 在执行敏感操作时, 通过可信源直接限制操作的目标数据, 达到水平鉴权目的. 例如图                          6(d) 代码片段中, 用户输入
                 变量  password  与可信源变量  userId  同时流入了数据库操作, 在查询时通过          where 子句, 限制了该操作仅可修改当
                 前用户自身信息.
                    (5) 水平鉴权   III.   t trust  和  t input  同时流入数据库查询后验证, 其原理类似垂直鉴权  II 与水平鉴权  II 的结合形式.
                    对于符合以上模式的程序代码片段, 算法在识别后将其加入鉴权操作集合                         AuthOps 中. 需指出的是, 此处列出
                 的鉴权模式样例均为应用业务逻辑执行时的显式鉴权. 对于现代                     Web  应用中常见的框架鉴权、切面鉴权等其他
                 鉴权实现方式, 与显式鉴权的主要差异在于鉴权行为在代码执行流上的具体介入时机                             (例如在请求路由匹配后、
                 业务逻辑执行前完成鉴权). 考虑其鉴权机制核心实现, 通常仍涉及可信源与用户输入信息交互的相关代码逻辑,
                 故可将这些鉴权方式进一步归纳为相似建模处理.
                    ● 敏感操作检测. 根据越权访问漏洞的形成原理, 可将 isVuln 约束谓词定义为如下形式:

                                     ⟨    ⟩       flow
                           isVuln(s) ≡ ∃ v,t input ∈ V taint ,v −−→ s∧¬∃a ∈ AuthOps,(dominate(Entry,a)∧dominate(a, s))  (5)
                                               t input  标签的污染变量是否流入数据库增删改等敏感操作外, 还关注从程序
                 即在检测越权访问时, 算法除关注带有
                 入口到达敏感操作的控制流路径上, 是否存在控制流支配关系的鉴权操作                         (例如图   6(a) 所示代码片段, 易知在执
                 行用户表更新操作前, 必然执行了用户身份验证), 不存在则报告漏洞.
                  2.2.3    原型链污染
                    原型链污染 (prototype pollution) 是  JavaScript 语言独有的一类安全漏洞, 其产生根源为        JavaScript 中的动态
                 原型继承机制. 在     JavaScript 应用程序中, 所有对象通过隐式的__proto__属性与其构造函数的原型对象关联, 形成
                 一条原型链. 当访问对象属性时, JavaScript 会沿着原型链逐级向上查找, 直至找到目标属性或到达原型链顶端. 由
                 于  JavaScript 未限制对原型对象的修改, 攻击者可以通过某些不安全的操作, 将恶意属性注入顶层原型 Object.prototype
                 中, 进而在后续程序逻辑中影响所有继承该原型的对象, 可能导致拒绝服务 (denial of service, DoS)、远程代码执
                 行或其他高危后果.
                    与传统注入类      Web  安全漏洞相比, 原型链污染不存在明确的敏感操作锚点, 且与                 JavaScript 引擎原型链解析
                 机制存在高度关联、污染逻辑与正常业务逻辑交织紧密、涉及隐式传播等诸多特性, 使得无法直接采用传统污点
                 分析算法进行检测. 现有的原型链污染检测相关工作                 [4,5] 多从  JavaScript 语言底层特性出发, 通过对象属性图等复
                 杂数据结构模拟代码中的隐式数据依赖与传播关系, 其检测方法开销极大, 在工业级场景下难以应用.
                    本文通过分析若干真实漏洞样例发现, 从语义层面来看, 典型场景下原型链污染漏洞的利用过程可概括为两
                 个阶段: (1) 通过恶意操作劫持顶层原型对象           Object.prototype; (2) 向原型对象中注入污染属性, 或覆盖其原有属性.
                 基于这一特性, 可利用多标签数据流分析方法, 通过独立的污点类型跟踪原型对象及其相关污染数据流的传播过
                 程, 实现轻量级的原型链污染检测方案. 需要指出的是, 本文聚焦于原型链污染漏洞中污染步骤的检测, 即攻击者
                 通过恶意输入对      JavaScript 顶层原型对象  Object.prototype 属性进行污染的行为. 若需进一步分析污染属性对程序
   205   206   207   208   209   210   211   212   213   214   215