草庐IT

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

阿里云技术 2023-04-12 原文

据统计,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

文/阿里云编译器团队

原文链接

本文为阿里云原创内容,未经允许不得转载。

有关开源软件安全与应对策略探讨 - Java 机密计算技术应用实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  5. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  6. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

随机推荐