dongtai agent分析
字数 2244 2025-08-29 22:41:10
DongTai IAST Java Agent 深度解析与教学指南
一、概述
DongTai IAST Java Agent 是一个基于字节码插桩技术的交互式应用安全测试工具,主要用于Java应用的安全监控。它通过Java Agent和ASM技术实现对运行中Java应用的动态检测。
项目地址:https://github.com/HXSecurity/DongTai-agent-java.git
二、核心模块
- iast-agent:启动模块,负责项目启动和引擎加载
- iast-core:核心插桩模块
- iast-spy:其他辅助模块
三、启动流程分析
1. AgentEngine.run()
io.dongtai.iast.core.AgentEngine.run()
包含两个主要部分:
- ConfigEngine.init:加载iast的sink/source/propagator/http相关规则hook点
- TransformEngine.start:字节码插桩核心部分
关键方法:
inst.addTransformer()classFileTransformer.reTransform()
2. IastClassFileTransformer.transform
插桩关键方法,使用ASM进行hook:
- 判断类是否需要转换(基于策略配置和类名过滤)
- 构建类上下文和继承关系
- 通过插件系统对类进行转换:
ClassVisitor cv = plugins.initial(cw, classContext, policyManager); - 插入监控代码(用于后续污点分析):
cr.accept(cv, ClassReader.EXPAND_FRAMES); - 返回转换后的字节码
四、插件系统(PluginRegister)
1. 插件处理链
- DispatchApiCollector:处理Spring MVC/Spring Boot应用
- DispatchJ2ee:处理Java EE/Jakarta EE组件
- DispatchKafka
- DispatchJdbc:处理JDBC操作,检测SQL注入
- DispatchShiro
- DispatchFeign
- DispatchDubbo
- DispatchClassPlugin:通用类插桩,加载所有污点分析关键逻辑(最核心)
2. 关键实现
核心在ClassVisit.visitMethod方法中的lazyAop方法:
-
MethodAdapter数组:
SourceAdapter:处理污点源,识别外部输入PropagatorAdapter:处理污点传播,跟踪数据流动SinkAdapter:处理危险方法调用点ValidatorAdapter:处理验证器,检测数据安全检查
-
规则匹配:
policy.getPolicyNodesMap() // 获取服务端规则 -
方法匹配与处理:
- 使用
MethodMatcher检查方法是否匹配规则 - 创建
MethodAdviceAdapter实例进行转换
- 使用
-
核心处理方法:
AbstractAdviceAdapter.trackMethod // 定义污点处理过程 SpyDispatcherImpl.collectMethod // 具体实现
五、规则系统
1. 规则加载
ConfigEngine.init() // 加载source、sink等规则
PolicyBuilder.fetchFromServer() // 从服务端获取规则
规则最终保存在Policy.policyNodesMap中。
2. 规则实现
不同适配器的处理位置:
- Source/Propagator/Validator:主要在方法返回前插桩(
onMethodExit) - Sink:主要在方法执行前插桩(
onMethodEnter)
数据收集:
- Source:收集外部输入数据,标记为污点
- Propagator:记录数据转换和传递过程
- Sink:检查输入参数是否包含污点数据
- Validator:记录数据验证操作
六、污点分析与漏洞检测
1. SpyDispatcherImpl实现
SpyDispatcherImpl.collectMethod根据策略类型做不同处理:
- Source处理:
- 创建
TaintValue对象记录污点信息
- 创建
- Propagator处理:
- 检查输入参数是否包含污点
- 标记返回值并计算新污点范围
- Sink处理:
- 检查输入参数是否包含污点
- 触发安全检查
- Validator处理:
- 更新污点安全状态
2. 漏洞检测实现
io.dongtai.iast.core.handler.hookpoint.vulscan.dynamic.DynamicPropagatorScanner#scan
io.dongtai.iast.core.handler.hookpoint.vulscan.dynamic.DynamicPropagatorScanner#sinkSourceHitTaintPool
3. 污点标签系统
每种漏洞类型有两组标签:
- 必须存在的标签:污点数据必须具有的特征(如
UNTRUSTED) - 不应存在的标签:如果存在则不视为漏洞(如
HTML_ENCODED)
七、污点跟踪机制
1. 核心数据结构
io.dongtai.iast.core.EngineManager
-
TRACK_MAP:
- 线程局部缓存
- 记录方法调用事件和调用关系
- 存储所有被监控的方法调用事件(Source/Sink/Propagator)
-
TAINT_HASH_CODES:
- 线程局部集合
- 记录被污点标记对象哈希码
- 提供快速查找机制
-
TAINT_RANGES_POOL:
- 线程局部映射
- 存储污点数据详细信息(污染范围和标签)
- 支持部分污染跟踪
2. 污点生命周期
-
污点标记阶段(Source):
io.dongtai.iast.core.handler.hookpoint.controller.impl.SourceImpl#solveSource- 检查方法返回值和类型
- 通过
trackTarget将结果放入污点池 - 处理Map/Collection/Array等复杂类型
-
污点传播阶段(Propagator):
PropagatorImpl#solvePropagator- 检查污点链
- 根据规则判断source是否命中
- 标记target并更新污点池
-
漏洞检测阶段(Sink):
- 污点到达危险方法时触发检测
- 参考前文漏洞检测部分
八、总结
DongTai IAST Java Agent通过精细的字节码插桩和污点跟踪机制,实现了高效的交互式应用安全测试。其核心在于:
- 基于ASM的字节码转换技术
- 灵活的插件系统架构
- 完善的污点跟踪机制
- 精确的漏洞检测算法
通过深入理解这些机制,可以更好地应用和扩展DongTai IAST的功能,提升Java应用的安全检测能力。