Skip to content

污点跟踪技术

Lian的污点跟踪基于状态流图SFG(State Flow Graph)进行。SFG将语义分析阶段得到的符号、状态及其依赖关系组织为统一的图结构,为数据传播计算提供可直接遍历的基础。

在污点分析过程中,系统通过位向量对敏感数据进行标记与区分。每一个污点源对应一个独立的标记位,传播过程中通过位运算维护污点集合,从而支持多源同时传播的精确建模。

1 污点源与汇聚点配置

污点相关配置由RuleManager统一管理。这些配置文件位于default_settings目录下。系统支持使用YAML文件定义污点源(source)、污点汇聚点(sink)以及传播规则。

  • source.yaml:用于描述敏感数据的产生位置,例如用户输入、文件读取或环境变量访问;
  • sink.yaml:用于描述潜在危险操作的位置,例如数据库查询、命令执行或外部接口调用;
  • propagation.yaml:用于描述数据在指令、函数调用及字段访问过程中的传播规则。

规则管理器负责解析配置文件并生成内部Rule对象,规则可按语言维度进行区分,从而支持多语言分析场景下的差异化建模。

2 污点传播框架

污点传播逻辑由TaintAnalysis类驱动。Lian以状态流图为分析对象,在图结构上执行基于worklist的计算过程。传播算法由PathFinder负责调度,其基本过程是在SFG上不断取出待处理节点,根据节点类型和传播规则更新相邻节点的污点状态,直至达到不动点。

传播过程中区分三类节点:

  • 符号节点(Symbol)
  • 状态节点(State)
  • 指令节点(Stmt)

3 不同节点上的传播规则

符号节点用于描述变量级别的传播。当某一符号被标记为污点时,其污点信息会同步传播至该符号关联的状态节点,并进一步影响使用该符号的指令节点。

状态节点用于描述抽象内存对象上的传播。一方面,污点可以逆向传播至所有指向该状态的符号;另一方面,污点也可以沿字段或子状态向下传播,用于刻画对象内部的数据流关系。

指令节点负责处理具体语句引入的传播行为。系统依据传播规则,将污点从语句使用的输入传递到语句定义的输出。对于方法调用等具有副作用的语句,会额外处理其对对象状态产生影响的传播路径。

4 污点状态管理

系统通过多层状态管理组件维护污点信息的一致性。

  • TaintEnv:负责维护符号与状态的当前污点集合;
  • TagBitVectorManager:提供位向量的分配、合并与比较操作;
  • TaintStateManager:支持基于访问路径的污点跟踪,用于精确刻画字段读写和对象嵌套结构。

跨函数传播通过参数与形参之间的同步完成,使污点能够沿调用边在不同函数之间传递。

5 分析结果与路径记录

污点分析的结果不仅包括是否存在从源到汇的传播关系,还包含完整的数据流路径信息。Flow类用于记录从污点源到汇聚点的传播路径,为漏洞定位和结果解释提供依据。

系统在分析过程中可对已访问节点进行标记,用于调试传播过程和验证分析行为。

6 总结

Lian的污点跟踪以状态流图为基础,将语义分析结果转化为可直接查询的数据传播结构。通过位向量标记、多节点传播规则以及跨函数同步机制,系统能够对复杂程序中的敏感数据流进行系统化建模和分析。