Page 205 - 《软件学报》2026年第7期
P. 205
2890 软件学报 2026 年第 37 卷第 7 期
1 app.post(“/comment”, (req, res) => { 1 @RequestMapping(“updatePassword”)
2 const {content} = req.body; 2 public void updatePassword(String password) {
3 db.query( 3 int userId = Integer.parseInt(SessionHelper.getOperateId());
4 “INSERT INTO comments (content) VALUES (?)”, 4 User user = new User();
5 [content] 5 user.setId(userId);
6 ); 6 user.setPassword(password);
7 res.redirect(“/”); 7 userMapper.update(user);
8 }); 8 }
9 app.get(“/”, (req, res) => { 9 <!-- UserMapper.xml -->
10 db.query( 10 <mapper namespace=“com.example.mapper.UserMapper”>
11 “SELECT * FROM comments”, 11 <update id=“update” parameterType=“com.example.entity.User”>
12 (err, results) => res.render(“index”, {comments: results}); 12 UPDATE user SET password = #{password} WHERE id = #{id}
13 ); 13 </update>
14 }); 14 </mapper>
(a) 跨控制流异步场景 (b) 细粒度输入场景
图 3 复杂 Web 应用程序逻辑示例
2 面向 Web 应用安全的多数据流分析方法
针对现有 Web 静态分析技术因底层污点分析局限而导致的适用性不足、检测准召率低等问题, 本文提出了
一种面向 Web 应用安全场景的多数据流静态分析方法. 该方法通过引入多段数据流分析与多标签数据流分析两
类子方法, 从多个维度对图 2 所示的传统污点分析算法进行增强, 显著提升其在复杂 Web 应用程序场景下的检测
能力. 同时, 该方法不依赖于具体的编程语言, 具备良好的泛用性. 以下将详细阐述多数据流分析方法的设计思路
及其应用场景.
2.1 方法设计
2.1.1 多段数据流分析
多段数据流分析方法的整体流程如图 4(b) 所示, 将传统的单次污点传播追踪过程扩展为多轮次 (multi-pass)
迭代分析形式, 从而实现对污点分析算法的纵向能力增强. 其核心思想是关注 Web 应用程序中常见的跨过程持久
化数据 (如数据库表、线程共享内存、全局会话变量, 以下简称共享数据). 在污点分析过程中, 方法通过记录污染
变量流入共享数据并存储的操作, 捕捉不同执行路径间的污染数据流关联, 从而实现对异步执行过程中的 Web 安
全漏洞检测能力.
算法 1 为多段数据流迭代分析的伪代码实现. 算法以待分析应用程序的中间表示 P 和目标漏洞规则 Rule 为
输入, 在实际分析中, P 可根据需求选用程序的抽象语法树、控制流图或其他中间表示形式. 算法首先基于规则中
配置的污点源模式信息, 初始化数据源模式集合 SourceSet 并执行首轮污点分析. 具体而言, 对于 SourceSet 中的每
个污点源模式, 在 P 中匹配符合该模式的输入变量并标记为污点, 之后遵循传统污点分析的工作原理, 沿控制流跟
踪污染变量在程序中的传播与净化过程, 将污染数据流经过的所有代码语句添加至 TaintStmts 集合中.
算法 1. 多段数据流迭代分析算法.
输入: 待分析应用 P, 漏洞规则 Rule;
输出: 安全漏洞集合 Vulns.
1. Vulns ← ∅;
2. SourceSet ← Rule.Source;
3. VisitedOps ← ∅;
4. repeat
5. TaintStores ← ∅;
6. TaintStmts = taintPropagation(P, SourceSet);

