据统计,90% 以上的应用都在使用第三方软件库,这些软件大部分都是开源的。与此同时,有超过一半的全球 500 强公司都在使用存在漏洞的开源软件。这幅漫画生动的描述了一个大型应用软件的组件架构,它可能建立在一个极其脆弱的开源组件基础之上,这个组件可能是二十年前开发的,且可能已经没有人进行维护了。一旦该组件被发现漏洞并发起攻击,整座应用软件的大厦将轰然倒塌,损失不可估量。
在日常软件开发中,我们不可避免的需要依赖开源第三方组件,因此要求我们必须认真对待开源软件的潜在安全风险。总体来说,我们需要建立一套完善敏捷的开源软件使用与响应机制。在引入第三方开源组件之前,需要对这些组件进行全面的质量与安全评估,进行漏洞扫描,排除漏洞风险;应用上线后,需要周期性同步漏洞信息,检查是否有新发现的开源组件漏洞报告;一旦发现漏洞,立即升级在线应用,规避漏洞可能引起的攻击,降低在线应用安全风险。建立漏洞快速响应机制是尤其重要的环节,它能最大限度缩短在线应用被漏洞攻击的时间窗口。因此,有必要在应用软件架构设计阶段,充分考虑漏洞响应机制,以应对可能出现的漏洞攻击。
一个比较尴尬的事实是,大部分组织对开源软件的事实态度是: 只求索取,而不贡献。倘若开源软件贡献者长期得不到合理的回报,相信这种活动是不可持续的。只有对开源社区投入适当资源,个人贡献者获得合理的回报,才能促进他们贡献更加优质的开源软件,从源头提升开源软件质量,从而降低漏洞安全风险,形成整个软件生态的良性互动与发展。作为大量使用开源软件的商业性公司,更有责任和义务反馈开源社区。
阿里云基础软件程序语言与编译器团队一直以来受益于开源软件,也积极回馈开源社区。目前为止,本团队在编程语言与编译器领域进行了诸多有益探索与实践。不仅给集团内部业务带来技术红利,同时也积极将这些成果开源,回馈社区。主要内容包括Java虚拟机、编译器、工具与安全,C++协程基础库与LLVM编译器,以及Python&Node.js 等开源贡献。
软件本身就具有安全风险属性。一方面,即使经验丰富的程序员,编写的软件也可能存在缺陷,是人就可能犯错;另一方面,不存在某种测试方法可以找出软件中所有潜在的缺陷。加上软件规模越来越大,复杂度呈指数级上升。因此不难推测,我们的应用软件极大概率隐藏着安全漏洞,只是我们暂时不知道它隐藏在哪里。
回顾目前的开源软件漏洞管理机制,不难发现我们的应对模式始终存在滞后性和被动性。假设漏洞是被黑客发现,黑客会偷偷地利用漏洞发起攻击,窃取各种隐私或机密数据,牟取非法利益。大家知道漏洞情报的时候,很可能损失已经发生,这时也只能亡羊补牢了。中间有个攻击时间窗口,是目前的开源软件应用管理机制没办法消除的。
阿里云程序语言与编译器团队提出了一种更加积极的开源软件安全防护实践策略。在介绍该方案之前,让我们先了解下机密计算技术。大家知道数据有三种形态,存储中的数据、传输中的数据和计算中的数据。存储与传输中的数据采用传统加解密技术,能够很好地保证数据安全。但计算中的数据通常是明文的,一旦进程中的依赖组件在运行时发起攻击,可以很容易获取进程内的各种敏感数据,比如私钥和用户敏感信息等。而运行时明文数据恰恰是黑客攻击的主要目标之一。机密计算技术正是为了解决运行时数据安全问题而产生的。
实现机密计算大致可以分为两种技术路线,一种是通过算法实现运行时数据在密态进行计算,比如同态加密或差分隐私计算等,这种方式没有特殊的硬件依赖;另一种是通过芯片提供一个 TEE 可信执行环境,该环境对运行在里面的数据和代码进行特别保护,通过对内存数据进行加密,保证运行时数据的机密性和完整性。在 TEE 外部,攻击者无法恶意窥探和篡改 TEE 内的数据和代码。
本文主要介绍基于硬件 TEE 的 Java 机密计算安全防护方案。首先我们对一个复杂的应用进行功能划分,把涉及到敏感数据和算法的部分抽象成相对独立的功能模块,我们将这个功能模块运行在 TEE 之中。同时确保该功能模块的依赖组件尽量少且质量高,尽量减少该功能模块本身出现漏洞的可能性,降低攻击界面。然后我们将剩下的主功能模块部署在普通执行环境中,这部分业务模块由于涉及到复杂的功能,可能会依赖大量开源软件,发生漏洞并被攻击的可能性也更大。
假设当主业务模块由于漏洞被发起注入攻击时,攻击者试图获取 TEE 内敏感数据,但由于 TEE 的保护,攻击者将无法成功。即便是恶意程序攻破底层组件(内核/hypervisor),试图通过劫持 root 权限获取 TEE 内数据也将不可得,这正是 TEE 可以帮助我们从根本上保证 TEE 数据安全的核心所在。由此可见,通过这种 Partition 的方式,将敏感数据和代码通过 TEE 保护起来,可以有效降低开源组件漏洞所带来的攻击风险,保护敏感数据不被泄漏。
JavaEnclave 是阿里云程序语言与编译器团队研发的一款针对 Java 生态的机密计算编程框架。基于该框架定义的 Host-Enclave Partition 编程模型,可以帮助用户进行高效的 Java 机密计算应用开发,同时提供完善的编译与部署工具链,提升 Java 机密计算开发与构建体验。JavaEnclave 编程框架采用 Java 静态编译技术,将 Enclave 部分的 Java 代码编译成 Native 形式运行在 TEE 环境中。Host 部分按照 Java 传统的编译与部署方式运行,本示意图以阿里云 Dragonwell11 JDK 为例进行说明。
这种静态编译的方式,从语言特性层面增加了 TEE 内业务代码的运行时安全性。静态编译后的 Native 包其逻辑空间是封闭式的,不会动态加载不可预知的 Java 代码;所有的反射调用都需要进行显示配置;只有路径可达的 Java 代码会被最终编译进 Nativ e 包中。这些特性都极大降低了 TEE 内业务的攻击面,进一步提升了 TEE 内业务的安全性。
JavaEnclave 目前已经捐赠给 Apache 社区,成为 Teaclave孵化项目的其中一员,项目名更新为Teaclave Java TEE SDK。希望借助 Apache 社区平台,能够让更多的开发者可以使用 JavaEnclave,从而促进 JavaEnclave 更好地发展。
阿里云程序语言与编译器团队开源项目链接:
(1) Dragonwell8: https://github.com/alibaba/dragonwell8
(2) Dragonwell11: https://github.com/alibaba/dragonwell11
(3) EMT4j: https://github.com/adoptium/emt4j
(4) Jifa: https://github.com/eclipse/jifa
文/阿里云编译器团队
原文链接
本文为阿里云原创内容,未经允许不得转载。
版权归原作者 阿里云技术 所有, 如有侵权,请联系我们删除。