浅谈被动式IAST产品与技术实现

笔者曾参与RASP研究与研发得到一些相关经验,近两年观察到IAST发展势头明显,但目前国内外对于IAST具体实现的细节相关文章较少,且笔者看到的开源IAST仅有洞态,故想通过笔者视角,对IAST的原理及技术实现进行探究及分享。

本文仅代表笔者个人观点,欢迎大家进行技术交流及学习。

什么是IAST

IAST是AST其中的一个类别,AST是Application Security Testing的简称,译为应用安全测试,在其之下衍生出来以下几种类型:

  • SAST(Static Application Security Testing)静态应用安全测试

  • DAST(Dynamic Application Security Testing)动态应用安全测试

  • MAST(Mobile Application Security Testing)移动应用安全测试

  • IAST (Interactive Application Security Testing)交互式应用安全测试

对于IAST的定义我并没有在Gartner找到其相关的术语表,但是在Gartner推荐的服务商中找到了一些关于IAST的定义,核心内容如下:

IAST使用运行时代理方法在测试阶段分析与监控应用程序的行为。这种类型的测试也不测试整个应用程序或代码,而只测试执行功能的部分。

有趣的是,多数人认为IAST是Gartner2012年提出来的术语,但我在Gartner的术语表内并没有找到IAST的相关定义(可能由于Gartner之前改版,导致这个术语丢失),于是我在Gartner推荐的服务商中找到了IAST相关的标签和简单的介绍。

图片

关于IAST的细分,可参考以下文章 https://www.freebuf.com/sectool/290671.html 这篇文章对IAST的分类有比较清晰的描述。本文以下内容主要围绕被动式IAST进行分析介绍。

国内外IAST产品

笔者对国内外的IAST相关的产品公司进行了一些整理,内容如下(该数据不代表所有的IAST厂商,仅为笔者搜索到的部分厂商):

图片

图片

图片

图片

图片

被动式IAST要想实现,那么其实和RASP差别不大,区别主要集中在埋点检测,从而达到对调用链的精准跟踪,在这一细小部分,我个人的理解是,对所有有可能导致source获取到的参数进行改变的方法进行埋点,包括但不限于类似以下几种情况(下面仅是伪代码,并不代表真实逻辑中的代码,仅便于大家理解):

new String(....)
"aa".replace(...)
StringBuilder sb = new StringBuilder();
Base64.decode(...)

此链路需根据实际业务情况进行完善,例如实现某个加解密的类等,又或者是加入对souce进行安全过滤处理的方法,然后将所有经过预埋点的堆栈信息进行拼接,在这个过程中,可以去判断这条链路经过了安全过滤处理方法,那么或许可以粗暴的不上报这条调用链信息,认为这是一个安全的请求(当然这种情况还是要谨慎,毕竟研发中难免会犯一些错误,所以在情况允许的环境下,还是全部上报,交给人工进行复验、排除是更为妥当的解决方式),然后将数据上报到服务端,到此完成一个IAST的技术理念逻辑。

那么其实是不是可以使用一些APM的开源技术,对它进行改造,从而实现IAST的部分功能。如果想深度控制IAST的流程,更好的方式就是自己实现一套IAST埋点、检测逻辑。

实现IAST所需要的一些技术

如果想要从零实现一个被动式的IAST,我们至少需要掌握关于字节码操作的技术,例如ASM、Javassist等,若不想从零或底层的方式去实现,可以试试使用AspectJ技术,或结合使用开源APM框架进行改造,让其成为一个简单的被动IAST。

本次所涉及的Demo源码已经公开,Github项目为: iiiusky/java_iast_example。

实验环境搭建

这次IAST相关的环境其实和之前的RASP环境基本差不多。大家可以参照之前的浅谈RASP技术攻防之实战[环境配置篇]文章内容去搭建一个本地的实验环境,唯一变的,可能就是包名了。

demo整体逻辑

这次实验的整体逻辑如果相比真正的IAST,肯定会有很多缺少的细节部分完善,所以仅仅适合用来学习了解被动IAST实现的大致流程,整体逻辑图如下:

图片

从上图可以看到,其实在这次demo实现的过程中,逻辑也并不是很复杂,大致文字版说明如下:

http->enterHttp->enterSource->leaveSource

enterPropagator->leavePropagator(…………此过程重复n次…………)

enterSink->leaveSink(可省略)->leaveHttp

以上大致完成了整个污点跟踪链路流程,在初始化HTTP的时候,将新建一个LinkedList<CallChain>类型的对象,用来存储线程链路调用的数据。

package cn.org.javaweb.iast.visitor;

import org.objectweb.asm.MethodVisitor;

/**
 * @author iiusky - 03sec.com
 */
public interface Handler {

	MethodVisitor ClassVisitorHandler(MethodVisitor mv, final String className, int access, String name, String desc, String signature, String[] exceptions);
}

实现Http埋点

为了方便对不同类型的点进行适配,抽象了一个Handler出来,然后在根据不同的类型实现具体的ClassVisitorHandler内容,Handler.java具体代码如下:

在Java EE中通过劫持javax.servlet.Servletservice方法和javax.servlet.Filter类的doFilter方法不但可以获取到原始的HttpServletRequestHttpServletResponse对象,还可以控制Servlet和Filter的程序执行逻辑。

可以将所有参数描述符为(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V的方法进行插入埋点,并缓存request、response对象。

实现的代码如下(示例代码为了便于理解未考虑异常处理):

package cn.org.javaweb.iast.vi
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值