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

二、核心模块

  1. iast-agent:启动模块,负责项目启动和引擎加载
  2. iast-core:核心插桩模块
  3. 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:

  1. 判断类是否需要转换(基于策略配置和类名过滤)
  2. 构建类上下文和继承关系
  3. 通过插件系统对类进行转换:
    ClassVisitor cv = plugins.initial(cw, classContext, policyManager);
    
  4. 插入监控代码(用于后续污点分析):
    cr.accept(cv, ClassReader.EXPAND_FRAMES);
    
  5. 返回转换后的字节码

四、插件系统(PluginRegister)

1. 插件处理链

  • DispatchApiCollector:处理Spring MVC/Spring Boot应用
  • DispatchJ2ee:处理Java EE/Jakarta EE组件
  • DispatchKafka
  • DispatchJdbc:处理JDBC操作,检测SQL注入
  • DispatchShiro
  • DispatchFeign
  • DispatchDubbo
  • DispatchClassPlugin:通用类插桩,加载所有污点分析关键逻辑(最核心)

2. 关键实现

核心在ClassVisit.visitMethod方法中的lazyAop方法:

  1. MethodAdapter数组

    • SourceAdapter:处理污点源,识别外部输入
    • PropagatorAdapter:处理污点传播,跟踪数据流动
    • SinkAdapter:处理危险方法调用点
    • ValidatorAdapter:处理验证器,检测数据安全检查
  2. 规则匹配:

    policy.getPolicyNodesMap() // 获取服务端规则
    
  3. 方法匹配与处理:

    • 使用MethodMatcher检查方法是否匹配规则
    • 创建MethodAdviceAdapter实例进行转换
  4. 核心处理方法:

    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根据策略类型做不同处理:

  1. Source处理
    • 创建TaintValue对象记录污点信息
  2. Propagator处理
    • 检查输入参数是否包含污点
    • 标记返回值并计算新污点范围
  3. Sink处理
    • 检查输入参数是否包含污点
    • 触发安全检查
  4. Validator处理
    • 更新污点安全状态

2. 漏洞检测实现

io.dongtai.iast.core.handler.hookpoint.vulscan.dynamic.DynamicPropagatorScanner#scan
io.dongtai.iast.core.handler.hookpoint.vulscan.dynamic.DynamicPropagatorScanner#sinkSourceHitTaintPool

3. 污点标签系统

每种漏洞类型有两组标签:

  1. 必须存在的标签:污点数据必须具有的特征(如UNTRUSTED
  2. 不应存在的标签:如果存在则不视为漏洞(如HTML_ENCODED

七、污点跟踪机制

1. 核心数据结构

io.dongtai.iast.core.EngineManager
  1. TRACK_MAP

    • 线程局部缓存
    • 记录方法调用事件和调用关系
    • 存储所有被监控的方法调用事件(Source/Sink/Propagator)
  2. TAINT_HASH_CODES

    • 线程局部集合
    • 记录被污点标记对象哈希码
    • 提供快速查找机制
  3. TAINT_RANGES_POOL

    • 线程局部映射
    • 存储污点数据详细信息(污染范围和标签)
    • 支持部分污染跟踪

2. 污点生命周期

  1. 污点标记阶段(Source)

    io.dongtai.iast.core.handler.hookpoint.controller.impl.SourceImpl#solveSource
    
    • 检查方法返回值和类型
    • 通过trackTarget将结果放入污点池
    • 处理Map/Collection/Array等复杂类型
  2. 污点传播阶段(Propagator)

    PropagatorImpl#solvePropagator
    
    • 检查污点链
    • 根据规则判断source是否命中
    • 标记target并更新污点池
  3. 漏洞检测阶段(Sink)

    • 污点到达危险方法时触发检测
    • 参考前文漏洞检测部分

八、总结

DongTai IAST Java Agent通过精细的字节码插桩和污点跟踪机制,实现了高效的交互式应用安全测试。其核心在于:

  1. 基于ASM的字节码转换技术
  2. 灵活的插件系统架构
  3. 完善的污点跟踪机制
  4. 精确的漏洞检测算法

通过深入理解这些机制,可以更好地应用和扩展DongTai IAST的功能,提升Java应用的安全检测能力。

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() 包含两个主要部分: ConfigEngine.init :加载iast的sink/source/propagator/http相关规则hook点 TransformEngine.start :字节码插桩核心部分 关键方法: inst.addTransformer() classFileTransformer.reTransform() 2. IastClassFileTransformer.transform 插桩关键方法,使用ASM进行hook: 判断类是否需要转换(基于策略配置和类名过滤) 构建类上下文和继承关系 通过插件系统对类进行转换: 插入监控代码(用于后续污点分析): 返回转换后的字节码 四、插件系统(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 :处理验证器,检测数据安全检查 规则匹配: 方法匹配与处理: 使用 MethodMatcher 检查方法是否匹配规则 创建 MethodAdviceAdapter 实例进行转换 核心处理方法: 五、规则系统 1. 规则加载 规则最终保存在 Policy.policyNodesMap 中。 2. 规则实现 不同适配器的处理位置: Source/Propagator/Validator :主要在方法返回前插桩( onMethodExit ) Sink :主要在方法执行前插桩( onMethodEnter ) 数据收集: Source :收集外部输入数据,标记为污点 Propagator :记录数据转换和传递过程 Sink :检查输入参数是否包含污点数据 Validator :记录数据验证操作 六、污点分析与漏洞检测 1. SpyDispatcherImpl实现 SpyDispatcherImpl.collectMethod 根据策略类型做不同处理: Source处理 : 创建 TaintValue 对象记录污点信息 Propagator处理 : 检查输入参数是否包含污点 标记返回值并计算新污点范围 Sink处理 : 检查输入参数是否包含污点 触发安全检查 Validator处理 : 更新污点安全状态 2. 漏洞检测实现 3. 污点标签系统 每种漏洞类型有两组标签: 必须存在的标签 :污点数据必须具有的特征(如 UNTRUSTED ) 不应存在的标签 :如果存在则不视为漏洞(如 HTML_ENCODED ) 七、污点跟踪机制 1. 核心数据结构 TRACK_ MAP : 线程局部缓存 记录方法调用事件和调用关系 存储所有被监控的方法调用事件(Source/Sink/Propagator) TAINT_ HASH_ CODES : 线程局部集合 记录被污点标记对象哈希码 提供快速查找机制 TAINT_ RANGES_ POOL : 线程局部映射 存储污点数据详细信息(污染范围和标签) 支持部分污染跟踪 2. 污点生命周期 污点标记阶段(Source) : 检查方法返回值和类型 通过 trackTarget 将结果放入污点池 处理Map/Collection/Array等复杂类型 污点传播阶段(Propagator) : 检查污点链 根据规则判断source是否命中 标记target并更新污点池 漏洞检测阶段(Sink) : 污点到达危险方法时触发检测 参考前文漏洞检测部分 八、总结 DongTai IAST Java Agent通过精细的字节码插桩和污点跟踪机制,实现了高效的交互式应用安全测试。其核心在于: 基于ASM的字节码转换技术 灵活的插件系统架构 完善的污点跟踪机制 精确的漏洞检测算法 通过深入理解这些机制,可以更好地应用和扩展DongTai IAST的功能,提升Java应用的安全检测能力。