vlambda博客
学习文章列表

源码分析 - 洞态IAST JAVA agent如何实现AOP

前言

IAST JAVA agent方法调用链,污点值传播等信息的采集功能的实现很大程度上依赖着AOP,IAST JAVA agent是怎么实现AOP的呢,请继续往下看。 

1

源码分析


首先我们来看一下 ENGINEENTRYPOINTCLASS 即 com.secnium.iast.core.AgentEngine这个类。 


源码分析 - 洞态IAST JAVA agent如何实现AOP


install方法通过反射被调用,入参里的Instrumentation inst对AOP功能的实现十分重要,我们继续跟着inst看下去。agentEngine.init(mode, propertiesFilePath, inst);方法分别调用了各个引擎的init方法,其中的TransformEngine明显和AOP有关。


源码分析 - 洞态IAST JAVA agent如何实现AOP


inst通过init方法传给了TransformEngine类的成员变量,在调用start方法时又传给了IastClassFileTransformer.init这个静态方法。


源码分析 - 洞态IAST JAVA agent如何实现AOP


如图添加了iastClassFileTransformer到inst中,用它来执行字节码转换。类的字节码在载入JVM之前会调用ClassFileTransformer的transform方法。而IastClassFileTransformer实现了ClassFileTransformer接口。这块代码很多,重点在下图。


源码分析 - 洞态IAST JAVA agent如何实现AOP


ClassVisitor和ClassWriter是ASM框架中常用的类。这里先是创建了ClassWriter,之后通过PLUGINS.initial方法返回合适的ClassVisitor,cr.accept修改字节码。


源码分析 - 洞态IAST JAVA agent如何实现AOP


随意查看一个继承自ClassVisitor的类。这里重写了visitMethod方法,添加了判断的逻辑,这个方法在访问类里的每个方法时都会被调用,在适当的时候会返回ServletDispatcherAdviceAdapter的实例。而这个类正是实现AOP的关键。


源码分析 - 洞态IAST JAVA agent如何实现AOP


由图可见,ServletDispatcherAdviceAdapter继承了AbstractAdviceAdapter。而AbstractAdviceAdapter最终继承了MethodVistor,同时实现AsmTypes和 AsmMethods这两个接口。搞清楚继承关系后,我们继续看ServletDispatcherAdviceAdapter的源码。


源码分析 - 洞态IAST JAVA agent如何实现AOP


ServletDispatcherAdviceAdapter重写了AbstractAdviceAdapter的before和after方法,将代码插入到方法前后。这里调用了ASM框架的API给方法添加了try-catch结构并插入AsmMethods里的方法以实现污点值传播的追踪。为什么重写这两个方法能实现插入代码呢。继续看AbstractAdviceAdapter。


源码分析 - 洞态IAST JAVA agent如何实现AOP


这里用abstract关键字修饰了这两个方法,然后onMethodEnter和onMethodExit分别又调用了这两个方法。


源码分析 - 洞态IAST JAVA agent如何实现AOP


这几个类都重写了这两个方法,可见后续如果要适配新的web框架,只需要添加一个继承自AbstractAdviceAdapter同时重写这两个方法的类就行了。继续看它的父类。 


源码分析 - 洞态IAST JAVA agent如何实现AOP


这个类由ASM提供,方便我们插入代码。实际上这个类也是重写了MethodVisitor的visitCode等方法,最终实现了AOP。

2

总结

通过 -javaagent参数指定IAST JAVA agent来启动Instrumentation,并加载IastClassFileTransformer利用ASM实现修改类文件的功能。同时也实现了插件化,方便后续开发。


账号申请

SaaS版本账号申请

源码分析 - 洞态IAST JAVA agent如何实现AOP

洞态IAST合作伙伴计划之整体开源联合开发,申请方式请扫描下方二维码

源码分析 - 洞态IAST JAVA agent如何实现AOP
源码分析 - 洞态IAST JAVA agent如何实现AOP


源码分析 - 洞态IAST JAVA agent如何实现AOP

【周度激励】




【相关精选文章】





火线Zone是[火线安全平台]运营的封闭式社区,社区成员必须在[火线安全平台]提交有效漏洞才能申请免费加入,符合要求的白帽子可联系[火线小助手]加入。


我们不希望出现劣币驱逐良币的结果,我们不希望一个技术社区变成一个水区!


欢迎具备分享精神的白帽子加入火线Zone,共建一个有技术氛围的优质社区!