IAST学习笔记

0x00 认识IAST

笔者初识IAST,不曾深化接触,源于兴味开端学习,可能有了解不到位的中央,请多多包涵指导。

IAST全称Interactive Application Security Testing 交互式应用程序平安测试,它在程序运转过程中运用插桩技术监控和搜集信息,依据这些信息来判别程序能否存在告警。它对来自客户端产生的恳求和响应停止剖析,这点相似于DAST;而它可以监控数据流信息,经过污点剖析产生告警又相似于SAST。IAST有很多种形式,代理形式、流量镜像形式,插桩形式等,可参考https://www.freebuf.com/articles/web/290863.html。

本次重点引见插桩形式,插桩完成主要经过动态hook和污点传播。
hook技术:Java最常见的hook的是JVM层,经过JVMTI接口Instrumentation在类被加载之前对类停止拦截,经过插入字节码停止修正并重载类完成hook;
污点传播:污点传播剖析技术是信息流剖析技术的一种理论办法,经过对系统中敏感数据停止标志跟踪数据在程序中的传播来停止平安检测。

插桩形式有主动插桩形式和被动插桩形式。
主动插桩形式:在关键函数hook到流量后,会添加payload停止扫描,包含了相似DAST的功用,主动对目的应用停止扫描,应用效劳器的IAST agent不会追踪整个污点数据流,仅搜集关键数据,将数据发送给IAST管理端,IAST管理端会向应用效劳器发送结构好的重放流量来考证风险能否存在;

被动插桩形式:不会主动发送payload,对来自客户端的恳求响应停止污点传播数据流监控,依据能否经过无害化处置判别能否存在破绽。

本文主要针对JAVA类应用,需求用到的技术包括污点剖析、插桩技术Instrumentation&agent、字节码加强技术如ASM、javassist,接下来的笔记是先把这些技术停止引见,然后再对被动插桩式IAST demo项目停止改动,以SQL注入和log4j2 CVE-2021-44228破绽停止深化了解并且记载遇到的问题。

0x01 污点剖析:

污点剖析能够笼统成一个三元组<sources,sinks,sanitizers>的方式:
1、source即污点源,代表直接引入不受信任的数据或者秘密数据到系统中;
2、sink即污点会聚点,代表直接产生平安敏感操作(违背数据完好性)或者泄露隐私数据到外界(违背数据失密性);
3、sanitizer即无坏处理,代表经过数据加密或者移除危害操作等手腕使数据传播不再对软件系统的信息平安产生危害。

从source到sink数据能否经过了sanitizer无坏处理,假如经过则以为信息流是平安的,不经过那么以为信息流存在平安问题的。如下图是一个SQL执行的示例,我们需求经过污点剖析思想判别它能否存SQL注入破绽,假定String sql = "select * from user where id=" + value;中的value能够经过用户输入获取,我们判别它就是一个source,而执行SQL语句的代码以为是敏感操作,判别为sink,中间代码是在SQL语句后面添加'和转义处置语句中的单引号,属于sanitizer无坏处理,当sql经过无坏处理后,不再存在SQL注入破绽,假如未经无坏处理直接执行,则存在SQL注入破绽。

经过上面示例,我们大约晓得了经过污点剖析可以发现一些平安问题,想理解更多能够看看这篇文章简单了解污点剖析技术。

0x02 插桩技术:

JVM不能直接执行.java 代码或者.class文件,它只能执行.class 文件中存储的指令码。class需求经过classLoader 装载以后才干被执行。假如我们想要在JVM加载class前或加载class后修正class字节码,添加埋点逻辑并重新停止加载,需求用到Instrumentation与ASM,Instrumentation能够拦截ClassLoad加载或者重新对class加载,ASM操作修正字节码 增加代码逻辑。接下来我们就Instrumentation和ASM技术停止引见。

Instrumentation

Instrumentation主要用于类定义动态改动和操作,在JVM运转状态拦截class加载并提供类转换效劳。

ClassFileTransformer

ClassFileTransformer是一个类文件转换器,提供类字节码操作效劳,能够在transform办法中定义字节码的修正并返回新的字节码数组。ClassFileTransformer通常被Instrumentation用来注册转换器在类加载时停止类的转换,接口定义如下:

package java.lang.instrument;

import  java.security.ProtectionDomain;
public interface ClassFileTransformer {
  byte[] transform(  ClassLoader         loader, // 类加载器
                   String              className, // 类名
                   Class<?>            classBeingRedefined, // 类重定义
                   ProtectionDomain    protectionDomain, //维护域
                   byte[]              classfileBuffer) //类的字节码数组
    throws IllegalClassFormatException;
}
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像王及0