应用程序
我们有一个小型 Java 应用程序,它使用一些 Camel 路由从 Web 服务器获取上传的文件、对其进行处理并发送一些包含结果的电子邮件。
运行此应用程序的服务器已退役。目前,我们必须在性能不足的硬件上运行它,因为我无法说服管理员在 Web 服务器(实际上是多用途服务器)上安装 JRE。
害怕
我本人是一名 Java 应用工程师,以编写 JEE 代码为生,每周处理价值数万欧元的 B2B 交易。但我很难找到可靠的来源来驳斥 Java 本身不安全的说法。
管理员反对安装 JRE 的两个主要理由:
- Java 应用程序占用了我所有的 RAM
- Java 充满漏洞
真相?
当 Java 应用程序占用内存时。好吧...我认为我们必须为 Xmx 设置适当的值。完成。
现在有很多消息来源都在谈论 Java 的诸多漏洞。这些消息来源主要针对运行美国雷德蒙德公司特定操作系统的最终用户。据我所知,对于配置为自动执行所有小程序的未打补丁版本的 Java 浏览器插件来说,很有可能成为驱动感染的受害者。就像在上下班途中与火车上的每个人发生无保护性行为时有感染性病的风险一样。
但我在全世界的互联网上找不到任何人谈论无头运行的服务器应用程序或 JRE。那是另一回事。
或者我在这里遗漏了什么?
[编辑 2014-08-28] 澄清:我只关心服务器上的 Java。我不关心 Java 插件和/或用 Java 开发的特定软件的问题。
答案1
Java 给您的环境带来的额外安全面很复杂,因此不要忽略它或试图简化它,这一点很重要。
首先,JRE 的安全漏洞记录非常糟糕。很难指出具体是哪个漏洞,而这正是最可怕的部分——这些漏洞绝大多数都是未指明的漏洞,且攻击载体也未指明。
当我作为一名安全顾问阅读“允许远程攻击者”等条款而没有进一步了解其含义时,我发现这很可能意味着进入某个函数的某些参数可能会引发易受攻击的情况,即使您只运行自己编写的代码。而且,由于这些条款没有具体说明,您无法知道自己是否受到了影响。
更妙的是,Oracle 发布的规范 JRE 规定了关键更新的季度更新周期,包括几乎所有安全更新。在过去四年中,他们总共创建了 11 次周期外补丁。这意味着你有可能容易受到安全漏洞的攻击报告后三个月内在你有任何办法修复它之前。
Java 还存在其他问题,这里就不多说了,但实际上,这似乎是有道理的,尤其是对于多用途服务器而言。如果您必须运行这些东西,您至少应该为它制作一个单一用途的 VM,并将其与其他东西隔离开来。
具体来说,如果 JRE 中有一个远程程序允许攻击者获得 RCE,而 PHP 中的另一个远程程序也允许攻击者获得 RCE,Ruby 中的另一个远程程序也允许攻击者获得 RCE,那么您必须修补这三个程序。随着情况的发展,这三个程序似乎都有可能被修补,攻击者可以选择最方便的程序,然后控制整个服务器。这就是为什么我们应该使用虚拟机来分离软件,尤其是像托管语言框架这样有缺陷的软件,尤其是那些每年只捆绑四次安全补丁并且属于某个供应商专有的软件,而该供应商不顾所有证据,声称自己是安全的典范。
为了更新,以下是我从 ChrisS 的链接 CVE 搜索中精心挑选的一些 CVE,作为演示。
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-5884
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-5910
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-5456
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-3007
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-2454
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-2447
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1557
我最喜欢的,因为我去过那里:
顺便说一句,这只是一个小样本。
答案2
Java 应用程序占用了我所有的 RAM
使用 RAM 的替代方案是浪费 RAM。您无法将其保存以备后用。
Java 充满漏洞
这其实并不重要,因为你不会将 JVM 暴露给外界。我假设你不会运行任何恶意程序,如果你运行恶意程序,那么 Java 比大多数其他语言都更安全。重要的是你的应用程序是否存在漏洞。
答案3
聘请一家公司对您的程序进行静态分析。例如,Veracode 就是我过去专门用来审计 Java 程序代码安全性的公司。
显然,要向你的管理团队收取费用代码。
答案4
解释一下,所有其他语言(或虚拟机)都可能因为部署到其上的代码而变得不安全,就像 Java 一样。如果他认为其他平台本质上是安全的(或比 Java 更安全),而没有正确解决安全性问题,那么他就是在自欺欺人。
您的公司显然已经投资聘请了一名 Java 开发人员,为什么系统管理员拒绝支持公司决定使用的技术?
我会反问他,他提出了哪些替代方案,以及它们如何比最新的 Server JRE 更安全,具体来说。同时,努力表明你了解你的技术、可能的攻击面,并且你已努力将其最小化(例如不必要的框架、第三方代码等)。验证你的代码,查找过去 X 年中你所依赖的框架发布的漏洞,将其与其他语言/框架进行比较(确保也包括市场份额,没有发布漏洞的晦涩框架毫无意义)。
我们不可能知道你们之间的整个转换是如何发生的,但如果这是他的两个论点,我相信你正在与一名初级系统管理员打交道。他有 Java 应用服务器经验吗?也许他对这项技术不熟悉,并且害怕在没有彻底理解它的情况下将某些东西投入生产(那么这是良好的系统管理员态度)。