开源软件安全与应对策略探讨--Java 机密计算技术应用实践

简介: 本文主要介绍基于硬件 TEE 的 Java 机密计算安全防护方案。

vcg_VCG211259270554_RF.jpg

(文/阿里云编译器团队)

据统计,90% 以上的应用都在使用第三方软件库,这些软件大部分都是开源的。与此同时,有超过一半的全球 500 强公司都在使用存在漏洞的开源软件。这幅漫画生动的描述了一个大型应用软件的组件架构,它可能建立在一个极其脆弱的开源组件基础之上,这个组件可能是二十年前开发的,且可能已经没有人进行维护了。一旦该组件被发现漏洞并发起攻击,整座应用软件的大厦将轰然倒塌,损失不可估量。

640.png

在日常软件开发中,我们不可避免的需要依赖开源第三方组件,因此要求我们必须认真对待开源软件的潜在安全风险。总体来说,我们需要建立一套完善敏捷的开源软件使用与响应机制。在引入第三方开源组件之前,需要对这些组件进行全面的质量与安全评估,进行漏洞扫描,排除漏洞风险;应用上线后,需要周期性同步漏洞信息,检查是否有新发现的开源组件漏洞报告;一旦发现漏洞,立即升级在线应用,规避漏洞可能引起的攻击,降低在线应用安全风险。建立漏洞快速响应机制是尤其重要的环节,它能最大限度缩短在线应用被漏洞攻击的时间窗口。因此,有必要在应用软件架构设计阶段,充分考虑漏洞响应机制,以应对可能出现的漏洞攻击。

一个比较尴尬的事实是,大部分组织对开源软件的事实态度是: 只求索取,而不贡献。倘若开源软件贡献者长期得不到合理的回报,相信这种活动是不可持续的。只有对开源社区投入适当资源,个人贡献者获得合理的回报,才能促进他们贡献更加优质的开源软件,从源头提升开源软件质量,从而降低漏洞安全风险,形成整个软件生态的良性互动与发展。作为大量使用开源软件的商业性公司,更有责任和义务反馈开源社区。

阿里云基础软件程序语言与编译器团队一直以来受益于开源软件,也积极回馈开源社区。目前为止,本团队在编程语言与编译器领域进行了诸多有益探索与实践。不仅给集团内部业务带来技术红利,同时也积极将这些成果开源,回馈社区。主要内容包括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


—— 完 ——

加入龙蜥社群


加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。

640 (5).png

相关文章
|
6天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
37 7
|
17天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
29 6
|
11天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
9天前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
21 5
|
7天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
10天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
13天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
37 5
|
11天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
20 2
|
12天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
48 1
|
17天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
22 2