交互式应用安全测试(Interactive application security testing IAST)是一个在应用和API中自动化识别和诊断软件漏洞的技术。如果从名字的缩写来看,插桩(Instrumented)式应用安全测试或许是一个更好的说法。IAST不是一个扫描器,IAST持续地从内部监控你应用中的漏洞,在整个开发生命周期中,IAST通过你在开发和测试中使用的工具(比如说DAST、漏洞扫描等),实时地提供报警。
IAST最显著的特性是它使用插桩来收集安全信息,直接从运行中的代码发现代码风险问题(代码漏洞、不规范的编码方式等),不是源代码扫描(SAST),也不是HTTP 扫描(DAST)。但那并不意味着你要等到产品上线时才使用它,恰恰相反,你可在IDE中,当开始编写和测试第一行代码时,就使用IAST。
了解IAST在完整的应用安全技术策略中的位置非常重要,有两个主要自动化应用安全的方法,你都要考虑到:
IAST技术在2010年出现,许多最大的金融、技术和医疗保健公司已经采用了IAST技术。在本文中,我们将探索如何把IAST集成到整个软件生命周期中,实现最经济的漏洞检测。
参考链接:
https://www.youtube.com/watch?v=J5XV41Lt2RQ https://www.contrastsecurity.com/glossary/interactive-application-security-testing https://www.contrastsecurity.com/search-results?term=IAST&type=BLOG_POST&type=LISTING_PAGE
问题很简单,我们在应用安全方面,有大量的问题。但应对这些问题的安全专家有限,全世界几乎有2000万的开发人员。传统的工具要求安全专家和应用一起工作(安全深度介入开发过程),训练工具,解释结果。这些工具80%的费用是有效使用工具的“人的费用“,没有真正的自动化。
“工具困境”是指你为工作准备的工具都不是很好用,因此,你不得不运行一系列工具,希望能得到一个好的结果。
在安全领域十余年来,业内一直在尝试这种“混合”的方法,但确实没什么作用。想像一下,使用SAST,DAST,还有SCA工具的结果去检测CSRF漏洞的情形:
运行所有这些工具,浪费时间和宝贵的安全技能。但更重要的是,很难关联安全测试结果。静态工具能够报告源代码行数,动态工具报告HTTP请求,开源工具报告库版本号,没有好的方法来关联这些报告。最好的关联工具减少15%-35%发现结果。因此,如果你有两个工具,每份报告了200个发现结果(对于静态工具,一个保守的估计),你会得到缩减后的340个结果。总之,仅仅合并噪音和不精确的报告是不经济的。
现代软件开发速度更快,正在加速发展。许多项目按周、天,甚至小时的频率来部署代码。不幸的是,像SAST、DAST、模糊测试、人工渗透测试、人工代码检查无法跟上现代软件的速度和规模。
综合来看,传统应用安全工具的最大挑战,IAST都可以具备比较好的解决方案:
交互式应用安全测试使用软件插桩收集安全信息,并直接从运行中的代码发现问题,以实现自动化识别和诊断在应用和API中的软件漏洞。
除了在独立场景中发挥作用之外,在实际的应用安全体系建设中,IAST可以和其他工具和防护手段有效配合。下图显示IAST在NIST的Cybersecurity Framework中的位置,IAST完全集中在应用安全这一行,除了检测和识别漏洞,某些IAST实施能帮助识别和分析应用。
使用基于插桩的方法来提供安全能力并不限于应用层。安全专家已经认识到,我们可以不再只从外部来检测漏洞,外部的视角并不能提供足够的上下文信息精准地识别漏洞,从内部做漏洞检测更容易更精确。这种基于插桩(和基于扫描的安全测试对比)的安全测试趋势,正在从网络向应用全栈中扩展。
下表详细介绍了现代网络应用程序堆栈的各层及其基于插桩的安全解决方案。
LAYER | INSTRUMENTATION | EXAMPLE PRODUCTS | TESTING |
---|---|---|---|
Application | IAST |
|
Tests the security of applications and APIs by instrumenting software |
Container | Container Security |
|
Tests the container security by instrumenting the container |
Operating System | Endpoint |
|
Tests operating system security by instrumenting the OS |
Network | Network Security |
|
Tests network security by instrumenting the network stack. |
如您所见,IAST是一种针对应用程序层的基于插桩的安全方法,许多针对其他堆栈层的安全产品也认识到了基于插桩方法的优势。在所有层面上,直接访问比从外部角度测试安全性具有巨大优势。
由于IAST将安全性直接构建到软件堆栈中,应用程序可以安全地部署在任何环境中,包括云、PAAS、VM和数据中心。
参考链接:
https://dzone.com/refcardz/introduction-to-iast
通常,IAST使用类似APM工具的技术,使用安全探针对插桩的应用和API进行调试排错,探针从运行的应用中直接检查安全相关的事件,并传递给分析引擎,引擎重新组装这些事件,识别出代码执行中的漏洞特征。
当一个应用或者API被加载到内存中,应用中的插桩是动态执行的。插桩本身很安全,并被广泛应用到日志、性能测试、及其他目的。许多常见的框架已经在运行时使用隐藏的插桩技术,很可能你已经在应用和API中使用过某种形式的插桩。
现代应用常常在运行时组装,使用依赖注入、动态加载、反向控制等其他技术。因为这个原因,源代码分析只能提供一个局部观察,验证安全最好的方法是直接检查运行时应用,IAST支持这种直接的检测。
IAST安全探针能够从应用中实际地提取任何信息。在许多方面,IAST是SAST和DAST的一个合集,包括代码和HTTP流量的分析,但IAST在它的分析中考虑到更多类型的信息,包括:
IAST常常使用多个不同的信息源来证实一个漏洞,例如,当一个暴露的端点,是non-XHR,或者状态正在改变,或者没有包含token检查,就可以确定是一个CSRF(跨站请求伪造)漏洞。IAST能够访问HTTP请求,分析是否一个交易修改了文件或写到存储设备里,评估是否一个控制流包含一个token检查。通过在漏洞分析中,使用所有这三种类型的数据,IAST得出准确的结果,不会漏报也不会误报。
对企业组织,IAST是一个能够横跨整个应用和API组件集,建立持续安全测试的有效方法。使用IAST,组织能在所有的应用组件中,持续并行地执行应用安全测试。
许多组织仅仅测试应用组件集中的一小部分,一些组织只测试重要的应用,其他组织的策略是测试所有面向外部的应用。更可能的是,你主要的网站没有受到攻击,而是合作伙伴的网站、一个复杂的移动API、或内网的业务应用受到攻击。这就是为什么保护所有应用和API,甚至非webAPI的重要性。
对许多外部和面向公共的应用,许多组织保留安全测试。事实上内部应用和外部应用的概念,取决于工作安全边界。不幸的是,由防火墙和其他网络安全设备建立起来的边界,已经变得千疮百孔,意义不大。例如,一台员工工作站,被攻击者变成内部的跳板,边界变得无关紧要,企业需要测试你的整个应用组件集,包括内部应用。
记住,IAST不像一个扫描器,IAST有效地变成了应用的一部分,它能在应用运行的任何地方运行,包括开发人员的IDE,本地测试服务器,QA机器等。作为CI/CD构建的一部分,IAST可以运行在容器中,在云中,你代码运行的任何地方。在整个软件生命周期中,你软件运行的任何地方,你都可以使用IAST。
下图描述了一个简单开发管道,使用IAST持续的发现漏洞。
在开发中,我们的目标是赋能开发人员发现和修复他们自己的漏洞,提交清洁的代码。但我们必须避免拖累他们或给出误报结果,避免浪费研发人员的时间。
开发人员使用IAST,在开发环境中,当生成和测试代码时,实时地做安全分析。开发人员必须要做的是把IAST代理增加到本地的服务器环境中,一旦IAST安装好了,开发人员可以做日常的工作和测试,自动或者手动,不用再做一次安全测试。开发人员通过他们使用的安全工具,如Eclipse,IDEA,VisualStudio,Slack,Hipchat,Chrome,JIRA,VSTS等,实时地收到安全漏洞通知。同时IAST可以提供精确的代码行,完整的HTTP请求,完整的数据和控制流,开发者的工作变得容易,他们能够修复代码,使用相同HTTP请求来再测试,验证问题是否解决,最后提交清洁代码。
IAST也可以用在QA、测试、CI/CD阶段,保证开发阶段没有漏洞。
不管是用来做自动化测试的测试服务器,还是CI/CD构建流程的一部分,只要把IAST代理添加到用来做QA的服务器中就可以实现目的。对于完全组装的应用,在QA中使用IAST是一个有效的最后检查手段,因为它会被配置和部署。
同时,IAST可以配置成自动化生成缺陷跟踪ticker,或停止软件构建。
传统的静态和动态工具不擅长测试API安全,这些工具无法处理复杂协议(JSON,XML,二进制,或其他payload),或者架构中用来构建API的复杂数据流和控制流。
大多数API使用软件框架,包含自动化payload解析,对象映射(object mapping,注释等手段把数据发送到合适的方法。因为IAST从API内部收集安全信息,和常见web应用工作方式一样,能够很容易识别API漏洞。
另一方面,IAST安装的过程非常简单,一个典型的IAST方案通常包括两部分,
第一步是在你的环境中增加IAST代理,方法和增加一个库一样只需要设置环境变量即可,当你使用应用时,IAST代理自动在后台做安全测试,重要的是,你不需要攻击应用就可以得到安全测试结果。IAST能被任何人使用,甚至刚开始做开发工作的新人。
IAST控制台让你管理整个应用组件集的安全,并行地处理和管理安全策略,配置安全控制,和其他常见开发工具集成,实现漏洞通知等。
在生产环境做安全测试并不是一个很好的主意。理想情况下,你应该在上线之前很久就修复任何安全问题。然而,常常有许多不再主动开发的传统应用,同时还有一些只存在于生产环境的第三方产品,我们仍然需要持续保证这些应用没有漏洞。我们也希望知道,是否有新的漏洞会影响这些应用。
虽然没有开发和测试环境中使用的这么普遍,IAST也能有效的使用在生产环境。因为IAST不要求源代码。能够在任何可以安装IAST代理的应用中使用,但也要考虑到IAST的性能问题。虽然速度很快,在开发和测试环境中没有被注意到,在生产中,即使几微秒也无法接受。
虽然开源软件漏洞常常看起来像洪水猛兽,但事实也许比看到的更严重。目前有几百万个开源库,但只有有限的安全专家在测试他们。
IAST根据CVE库,能自动地分析开源软件漏洞。因为IAST能持续运行并行地遍历整个应用的组件,可以在几分钟内检测新引入库中的增量问题,而传统的开源软件扫描器需要重新扫描整个企业。
除此之外,IAST能精确地告诉你,在开源软件库中到底调用了哪些代码,以及具体在哪些地方被调用。据统计,平均72%的库只包含在应用程序的编译依赖中,从来没有被应用程序真正调用。IAST能节省您升级不真正带来风险的库的工作。
IAST工具支持很宽范围的安全标准,包括:
IAST工具能生成报告,证明应用被完全安全测试过,没有漏洞被发现。因为这些报告任何时候都能生成,能显著的加快审计和合规流程。
IAST不仅支持漏洞规则,同时也支持代码编码规范相关的规则,它可以加强你组织自身的安全编码指南。你可以生成“正向”的规则,如“每个API必须调用AccessController.isAuthorized()方法来授权“。IAST能加强这些规则,给与开发人员即时反馈,告诉开发人员组织是如何实现安全的。
随着时间推移,组织能使用这个能力,从负面的“阻止漏洞模型”向正向的“使用企业安全控制”模型转变。
软件开发项目向DevOps转变过程中,构建和测试软件的流程加速了,使得SAST和DAST越来越难以使用。IAST格外适合DevOps,因为它赋能开发者得到及时和精准的反馈,不要求任何额外的流程步骤就可以发现和修复他们自己的安全漏洞。这就最小化了安全工作对开发的影响,明显减少了下游的安全工作。
使用IAST,你和以往一样构建、测试、部署代码,唯一的区别是IAST在后台运行,确保你不会引入任何危险的代码或库漏洞。
如上图所示,IAST扩展性好,非常容易的在几百上千个应用上,并行地持续执行应用安全测试。
参考链接:
https://dzone.com/refcardz/introduction-to-iast
在IAST解决方案选型的过程中,你要考虑多个不同的部门:
IAST能够快速评估,因为在一个非常短的时间内,你就会知道它是否能在你的应用上工作。你可以只在几个应用上部署IAST,运行测试,得出评估结果。