当前位置: 首页 > 后端技术 > Java

浅谈开源软件安全与对策——Java机密计算技术应用实践

时间:2023-04-01 16:29:01 Java

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