我真的很喜欢Java编程语言,但我不断听到它是多么不安全。谷歌搜索“ java不安全”或“ java漏洞”会带来多篇文章,讨论为什么您应该卸载或禁用Java以保护计算机。 Java经常一次发布大量的安全补丁,但是仍然有大量的漏洞需要修补。

我知道软件中总会有bug,但是Java的漏洞数量很大曾经看起来不正常(或者我在想那吗?)。更令人困惑的是,如果只有一个架构决策正在创建这些漏洞,那么为什么不更改该设计呢?还有许多其他的编程语言都没有这个问题,因此必须有更好的方法来处理Java所做的错误。那么,为什么Java仍然如此不安全呢?

评论

我发现确实有人认为Java是“不安全的”,这是不公平的,因为Java的沙箱概念存在一些缺陷,而其他大多数技术甚至都没有沙箱,并且允许程序在运行的计算机上执行他们想要的任何事情。只有在Web浏览器中运行的applet的使用范围非常狭窄的情况下,这种批评才是合理的,在Flash中,诸如Flash之类的替代项具有同样糟糕的安全记录。

您的问题类似于询问“为什么汽车仍会出现发动机问题?”。 (对于那些从“ C(++)”角度来看没有这些的人,请加上“我的自行车再也没有!”)

因为小时候就被欺负了。

@Philipp:我认为这根本不公平。如果将一种语言宣传为沙盒,但其沙盒每年都有数十至数百个严重漏洞的历史,那么将其谴责为不安全是完全公平的。安全不是绝对的事情,而是遵守公开合同的问题。比较Java和C ++也许不公平,但是比较Java和Lua当然很公平。如果我没有记错的话,后者甚至还没有通过沙箱逃生漏洞的个位数。

@R ..我工作的一家公司之所以使用LotusNotes,纯粹是因为很少有人使用它,因此它的确存在的安全漏洞(如所有漏洞)仍然未被发现。我担心Java在另一侧。它将发现的任何缺陷,并不意味着其他使用较少的事物会更安全,只有更少的人试图破解它们

#1 楼

如果您像大多数其他编程语言一样使用Java,例如要编写独立的应用程序,它不会比其他语言安全,而且由于没有缓冲区溢出等原因,它比C或C ++更安全。

但是Java通常被用作网络浏览器中的插件,例如类似于Flash。因为在这种情况下,用户在未显式安装的情况下运行了不受信任的代码,所以我们的想法是使代码在有限的沙箱中运行,在沙箱中,代码不应以某种方式对系统或用户采取行动(例如,读取本地文件并发送)他们到网站,扫描本地网络等)。这就是Java近年来失败的地方,例如有时每天都会弹出新的错误,这使得它们可以从沙箱中逃逸。

此外,有时字节码解释器或本机库中的错误会导致缓冲区溢出并可能危及系统,但是在这方面通常认为Flash更糟。

至于其他更好的语言:它们通常甚至不能在沙箱中作为不受信任的代码运行(JavaScript和Flash除外),所以它们会变得更糟,因为没有固有的限制他们与系统交互的方式。

评论


是的,主要的安全问题只是沙盒。

– Steffen Ullrich
2014年5月9日18:33



没有堆栈溢出?我今天偶然触发了无限递归。你是说缓冲区溢出吗?

– Lekensteyn
2014年5月9日19:13

是的,我的意思是缓冲区溢出。感谢您的纠正。而且您仍然可以获取它们,但没有C,C ++中的无处不在。

– Steffen Ullrich
2014年5月9日19:14



@IanRingrose不同意。甲骨文没有受到股东的约束,只能执行最小限度的维护,但是到目前为止,他们似乎已经非常认真地对待漏洞。如图所示,漏洞反映在整个系统上,Webapp应用程序和Applet通常由Java中的服务器应用程序备份。通常,我认为没有迹象表明Oracle不会认真对待这些失败。另请注意,无论公司本身如何,开发人员自己通常都有强烈的责任感。黑白陈述在这里没有用。

–马滕·博德威斯(Maarten Bodewes)
2014年5月10日15:32

您的Java applet和JavaScript方程式是错误的。 JavaScript是浏览器的固有功能,而Java需要一个明确的,单独安装的插件。一个浏览器中的JavaScript漏洞与其他浏览器不相同,但是applet漏洞在任何地方都可以使用,因为插件在任何地方都相同。此外,JavaScript并非旨在为大多数浏览器提供操作系统功能,而是可以以不同的方式进行沙箱处理(防止本机代码执行)。最好将Java和Flash等同起来。

– DCKing
2014年5月11日上午10:51

#2 楼

报告的安全漏洞与Java(编程语言)无关,Java通过JVM强制执行内存安全性,实际上比诸如C或C ++的语言更健壮,因为C或C ++的缓冲区溢出和缓冲区过度读取仍然是威胁,并且可能会导致诸如Heartbleed之类的混乱。

相反,所报告的漏洞在Java Sandbox中,该漏洞试图强制实施允许安全执行不受信任代码的特权模型,并且最著名的做法是允许自动执行在浏览器中执行Java Applets。那个沙盒到处都是孔。而且,Oracle一年仅发布4次补丁(“关键补丁更新”)。不用说,浏览器厂商对此并不满意。例如,从Firefox 26开始,Firefox就要求用户授权才能启动Java Applet。

新闻报道没有区别的原因是Oracle在编程语言中都使用了“ Java”商标。 ,以及运行小程序的浏览器插件。实际上,如果普通用户遇到Java商标,它可能是指Java商标。

为什么Sandbox仍然容易受到攻击,这在一定程度上是推测性的。如果您问我,原因是有和没有Sandbox都使用相同的API,并且大多数Java代码都在没有Sandbox的情况下运行(因为该代码是受信任的)。结果,当更改Java API或其实现时,开发人员很可能会忘记该晦涩的功能,而无意间暴露了应该保护的内容(为了说明这是多么容易,请看冗长的Java SE安全编码指南)。另一个但又相关的原因是Java API的庞大规模(对于Java SE 6,有5800个类和近50,000个方法)。

评论


恕我直言,这是最好的答案,因为它涉及保护尝试执行所有操作的API的复杂性。完整的Java小程序版本(无IO)会带来很多好处,但是当前的API对此太紧密了。

–马滕·博德威斯(Maarten Bodewes)
2014年5月10日15:39

我只有这个答案的牛肉是:1)Heartbleed不是缓冲区溢出攻击的结果。 2)由于明显的原因,您也不能说与虚拟机结合使用的一种语言本身比另一种语言“要好”。除此之外,请牢记沙箱中真正的漏洞,一种编程语言不会比人类语言“安全”或“不安全”,而是归结为编译器或解释器,最重要的是:语言。

– MDMoore313
2014年5月12日13:42

1)好的,根据Wikipedia的说法,Heartbleed是缓冲区被超读而不是缓冲区溢出,因为超出缓冲区长度的访问是读访问而不是写访问。将修复术语。 2)我认为这是一个有效的比较,因为Java语言规范要求运行时环境执行此检查。在Java中,内存安全是一种语言功能。在C或C ++中则不是。

– Meriton
2014年5月12日17:50



#3 楼


还有很多其他的编程语言都没有这个问题,因此必须有更好的方法来处理Java所做的错误。

这是一个很高的要求,在哪里你有那种印象吗?有许多其他的编程语言没有像Java那样步调一致,或者被广泛使用。
原则上,存在如此多的安全补丁的原因是因为Java被设计为安全,具有其他语言没有的许多以安全性为重点的功能。

Java语言环境
1.2.2强大而安全的
Java技术旨在运行在分布式环境中,这意味着安全性至关重要。通过在语言和运行时系统中设计的安全功能,Java技术使您可以构建无法从外部入侵的应用程序。在网络环境中,使用Java编程语言编写的应用程序可以防止未经授权的代码入侵,以防止其进入后台并创建病毒或入侵文件系统。

如果您不包括“安全”在您的编程语言规范中,您几乎不必发布安全补丁。另一方面,如果这是您声明的目标之一,那么您将很难避免这样做。

#4 楼

就其本身而言,Java具有极大的安全性资产,即其固有的抵抗缓冲区溢出和内存管理错误的能力:


检查所有数组访问是否与分配的数组长度有关。因此,可靠地捕获了缓冲区溢出,并触发了一个更好的异常(这将远程代码执行漏洞变成了仅拒绝服务)。
内存分配是通过垃圾收集器进行管理的,从而防止了后继使用。自由和双重自由错误。此外,GC还允许更轻松地处理字符串(在Java中字符串是不可变的),从而消除了大多数情况下出现缓冲区溢出错误的情况。
严格键入;代码无法访问不是它们的数据字节。这再次防止了漏洞(在编译时或在最坏的情况下,将在运行时报告错误的数据类型的错误ClassCastException)。

这使得Java比许多编程语言(特别是地狱语言)强得多C / C ++)。但是,Java设计人员试图利用这种增强的安全性来使某些事情变得困难,例如小程序。问题在于攻击面:由于小程序可能是恶意代码,因此必须控制它的所有操作。但是,如果要执行任何操作,那么恶意代码必须能够使用“标准Java类”,因此必须在每个单个标准Java类上强制执行“控制点”。因此,攻击面由数百个包含数千种方法的类组成,所有这些类都必须强制执行适当的检查。

Java设计师怀有雄心勃勃的罪行:在不破坏任何代码的情况下实现数千个检查的难度很大比他们想象的要高。所有“ Java错误”都来自这个事实。

我们可以在这里将Java与Javascript进行比较。例如,Java允许访问磁盘上的文件,但是,除非小应用程序要求它并且用户同意(这需要整个小应用程序签名业务),否则不能将此权限授予小应用程序。不那么雄心勃勃的Javascript根本没有任何文件访问方法:如果该函数实际上不存在,则对函数的访问控制不能正确实现!

总结:Java很好并且安全。 Java applet意味着巨大的攻击面,其安全性很难保证。但是,对于独立的应用程序和服务器,如果需要安全性,使用Java是个好主意(这同样适用于C#)。

评论


Nitpick:它更像是数千个类和数以万计的方法。除此之外:很好的答案!

– Meriton
2014年5月16日20:20

#5 楼

如今,发现更多漏洞可能并不表示该软件有多不安全。问题是每个软件供应商的安全响应团队对此有何反应以及补丁发布的速度如何。

只需检查Firefox和Chrome的补丁速度有多快。

我还记得,Oracle有一个名为关键补丁更新(CPU)的程序,该程序每季度提供大量补丁。如果存在零日漏洞,他们还会发布不带CPU的补丁​​。但是问题是Oracle发布补丁所需的时间。

评论


我同意第一句话。在其他软件中找不到安全漏洞并不意味着没有漏洞-人们正在(密切关注)吗?

–拉斐尔
2014年5月10日11:04



#6 楼

高估的恐惧.. Java本身很好。这些问题是在网络浏览器中运行的老式Java-Applet出现的,但是我怀疑有人真的再创建了Applet-大多数开发机构至少在最近十年中已将Flash或HTML4 / 5用于前端Web界面。

如今,Java主要用于后端JEE,前端GUI客户端(JFX / AWT / SWING),控制台应用程序和移动应用程序-因此没有问题。

#7 楼

答案很明显。您可以使用JavaScript,HTML或Flash删除计算机文件吗?不,你不能。

Java呢?您可以删除所有文件,使用Java小程序(托管在网站上)完全擦除硬盘驱动器吗?如果您接受运行小程序,答案是肯定的。与任何其他Web浏览器语言不同。

Java可以执行诸如在计算机上执行程序(可执行文件)之类的功能,还可以写入,更新或删除硬盘驱动器上的文件。

也,病毒扫描程序无法检测到Java applet:在大多数情况下,您甚至都不知道它会破坏您的计算机。一些扫描仪可能会检测到某些内容正在尝试删除受限制的目录中的文件:我知道的是Kaspersky,但是大多数人默认情况下已禁用此功能。

Java applet可以执行诸如更新Windows之类的操作。文件,例如HAL.dll,它们将阻止您的计算机启动。当您接受运行该applet时,它可以对您的计算机执行任何操作。

在某些情况下,即使Java applet已签名还是未签名也无关紧要-它仍会在您的计算机上下载文件。

更不用说Java了。

还有一种正在越来越流行,称为Unity Engine(类似于Flash):它具有与has相同的安全问题。 Java,可以对您的计算机执行任何操作。 Unity Engine和Java之间的唯一区别是Unity在运行时不会询问您是否要运行它。因此,如果某人安装了Unity Player并运行包含病毒的游戏,它将破坏您的计算机。

虽然不太流行,但VBScript可能会极为有害。我相信Microsoft Internet Explorer是当前唯一支持此功能的工具,但是我可能是错的。它具有与Java相同的功能。

评论


“答案很明显。您可以使用JavaScript,HTML或Flash删除计算机文件吗?”我可以。我需要的是对JavaScript引擎或Flash插件的充分利用。

– DCKing
2014年5月11日上午10:57

您必须针对特定版本的Flash和JavaScript涉及很多因素,似乎每个浏览器都为此使用了自己的引擎,是的,您毕竟可以针对一定比例,但担心的人受到影响的可能性很小,有了一个语言而无需黑客代码就能做到这一点,只有普通程序员才能用Java / Unity等做到这一点,如果他当然是邪恶的,那么他只是想说人们不应该信任那些有害的东西,甚至不隐藏它。小家伙试图用键盘记录器把我搞砸,没有什么比这更让我生气。哈哈

– SSpoke
2014年5月12日5:23



Java小应用程序通常也受到诸如删除文件系统等情况的保护-您首先必须进行一些沙盒逃避,这也需要您针对特定版本和零天。从这个角度来看,Java和Flash插件或多或少地在同一条船上。

– DCKing
2014年5月12日晚上8:41

Flash也有其应有的优势。使用由本机引擎“解释”并具有编程错误(Java,Flash是主要示例)的任何语言,都有可能摆脱它们构建的沙箱并影响主机系统,甚至可以注入本机代码,然后利用主机的特权升级错误。

– phyrfox
14年5月14日在1:35

“如果您接受运行小程序,答案是肯定的。”如果我们在谈论小程序,这是完全错误的(否则,所有赌注都关闭了,希望您知道在“名义上”的计算机上安装了什么)。请参阅:Java开发工具包(JDK)中的权限

– David Tonhofer
16年11月17日在12:40