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