題:
為什麼我聽到如此多的Java不安全感?其他語言更安全嗎?
gsingh2011
2014-05-09 22:39:24 UTC
view on stackexchange narkive permalink

我真的很喜歡Java編程語言,但是我不斷聽到它是多麼不安全。谷歌搜索“ java不安全”或“ java漏洞”會引出多篇文章,討論為什麼您應該卸載或禁用Java以保護計算機。 Java經常一次發布大量的安全補丁,但是仍然有大量的漏洞需要修補。

我知道軟件中總會存在bug,但是Java卻存在大量漏洞似乎不正常(或者我在想那嗎?)。更令人困惑的是,如果只有一個架構決策正在創建這些漏洞,那麼為什麼不更改該設計呢?還有許多其他的編程語言都沒有這個問題,因此必須有更好的方法來處理Java所做的錯誤。那麼,為什麼Java仍然如此不安全?

我發現確實有人認為Java是“不安全的”,這是不公平的,因為Java的沙箱概念存在一些缺陷,而其他大多數技術甚至都沒有沙箱,並且允許程序在運行的計算機上執行他們想要的任何事情。只有在Web瀏覽器中運行的applet的使用範圍非常狹窄的情況下,這種批評才是合理的,在Flash中,諸如Flash之類的替代項具有同樣糟糕的安全記錄。
您的問題類似於詢問“為什麼汽車仍會出現發動機問題?”。 (對於那些從“ C(++)”角度來看的人沒有這些!,請添加“我的自行車再也沒有!”)
因為小時候就被欺負了。
對於能夠在瀏覽器中運行的完整編程語言,Java幾乎沒有*安全漏洞(根據設計,大多數其他具有瀏覽器功能的語言不能執行某些操作)。 -您最近聽說的漏洞完全是惡意應用程序(已閱讀Applets),它們找到了一種突破沙箱並在系統上執行任意代碼的方法。可能有一個論點,認為Applet是Java的一部分,應該停止使用,但是許多技術仍然依賴它們(IMPI控制台,銀行網站等)。
@Philipp:我認為這一點都不不公平。如果將一種語言宣傳為沙盒,但其沙盒每年都有數十至數百個嚴重漏洞的歷史,那麼將其譴責為不安全是完全公平的。安全不是絕對的事情,而是遵守公開合同的問題。比較Java和C ++也許不公平,但是比較Java和Lua當然很公平。如果我沒有記錯的話,後者甚至還沒有通過沙箱逃生漏洞的個位數。
@R。沙箱僅適用於非常狹窄的上下文,這是Web瀏覽器中的Java applet。當您想說這些是不安全的時,我衷心同意。但是,正如您從這個問題可以看出的那樣,許多人通常將此批評擴展到Java,它涵蓋了用例,在這些用例中,小程序的沙箱問題根本不重要。
-1
我認為這是完全公平的,因為在沙箱外部實現的龐大標準庫實質上排除了提供安全沙箱環境的能力。這是Java嚴重錯誤而Lua正確的原因之一。
我同意,“ Java沙盒”被打破,“ Java語言”引起了很多負面宣傳。是否“公平”是一個判斷電話,但這是將兩者緊密結合的營銷決策的結果。在大多數係統上,僅安裝Java(出於任何目的)還安裝了瀏覽器組件,如果使用了瀏覽器,這些組件會將系統暴露給嚴重的遠程漏洞,因此可以這樣說,就是簡單地安裝Java,除非您不願意使用Java。阻止其在瀏覽器中的使用,是一個安全問題。
-1
@R ..比較Java和Lua當然是公平的。如果我沒記錯的話,後者甚至還沒有傳遞出沙箱逃逸漏洞的個位數。通過這種說法,我們所有人都應該使用PostScript,因為這樣的漏洞更少。 (PostScript _does_實際上提供了沙箱操作,如果配置正確,則可以讓您執行不受懲罰的惡意代碼,僅供參考)(如果您不完全理解我的意思,那是因為Java使用了_far,因此Java具有更多的_discovered_漏洞。比Lua更頻繁。)
實際上,PostScript歷來就有很多漏洞,尤其是在考慮要使用的環境時。在圖則(PostScript)的含義(文檔)的上下文中,任何圖靈完備的語言都是DoS漏洞,尤其是當您在打印機內部的1MHz微控制器上運行它。
至於Java vs Lua,使用它們的數量無關緊要。這是設計問題。 Lua有極少數潛在的故障點(其中之一是白痴):允許Lua代碼將字節碼直接饋送到虛擬機)。 Java有一個天文數字。
顯然,對於(白帽)黑客來說,研究Java漏洞比使用其他語言更有趣,就像Windows在其他操作系統上的調查一樣。
也許您可以澄清聲明的上下文。似乎您是在說自己感覺到Java代碼可能需要修復,並且軟件維護人員的工作還不夠好嗎?每個應用程序都將具有自己適用的代碼類型,因此應避免依賴任何一組編碼實踐。我敢打賭,客戶端Java應用程序將通過Flash很快消失。
哈哈,說說不公平:我們正在開發[Java瀏覽器](https://github.com/UprootLabs/gngr),人們將其與applet混淆,或將其與與applet混淆或與之關聯的Java關聯。安全經理沙箱以及更具體的applet沙箱...等等。
七 答案:
Steffen Ullrich
2014-05-09 23:24:59 UTC
view on stackexchange narkive permalink

如果您像大多數其他編程語言一樣使用Java,例如編寫獨立的應用程序,它不比其他語言安全,而且比C或C ++更安全,因為沒有緩衝區溢出等。

但是Java通常被用作網絡瀏覽器中的插件,例如類似於Flash。因為在這種情況下,用戶在未顯式安裝的情況下運行了不受信任的代碼,所以我們的想法是讓代碼在有限的沙箱中運行,在沙箱中,它不應以某種方式對系統或用戶採取行動(例如,讀取本地文件並發送)他們到網站,掃描本地網絡等)。這就是Java近年來失敗的地方,例如有時每天都會彈出新的錯誤,使您可以從沙箱中逃脫。

此外,有時字節碼解釋器或本機庫中的錯誤會導致緩衝區溢出,並可能危及系統,但就此而言,Flash通常被認為更糟。

至於其他更好的語言:它們通常甚至不能在沙箱中作為不受信任的代碼運行(JavaScript和Flash除外),所以它們會變得更糟,因為沒有固有的方法限制他們與系統的互動。

那麼服務器和桌面Java應用程序的漏洞比Java小程序的漏洞少嗎?
是的,主要的安全問題只是沙盒。
沒有堆棧溢出?我今天偶然觸發了無限遞歸。你是說緩衝區溢出嗎?
是的,我的意思是緩衝區溢出。感謝您的糾正。而且您仍然可以得到它們,但沒有C,C ++中的無處不在。
服務器上的Java可以讓Oracle出售數據庫許可證等,但是Java小程序對Oracle的業務沒有意義,因此不要指望Oracle會花更多的精力來消除與它們相關的漏洞。
@IanRingrose不同意。甲骨文沒有受到股東的約束,只能執行最小限度的維護,但是到目前為止,他們似乎已經非常認真地對待漏洞。如圖所示,漏洞反映在整個系統上,Webapp應用程序和Applet通常由Java中的服務器應用程序備份。總的來說,我認為沒有跡象表明Oracle不會認真對待這些失敗。另請注意,無論公司本身如何,開發人員自己通常都有強烈的責任感。黑白陳述在這裡沒有用。
@Lekensteyn Java語言規範要求實現要檢測堆棧溢出並拋出異常。在C / C ++中,這只是未定義的行為而已。因此,在某種程度上“堆棧溢出”仍然可以正常工作。
@SteffenUllrich進行詳細說明-這是因為沙箱試圖包含/限製成熟的編程語言的功能。與最初設計時沒有某些功能的其他一些啟用瀏覽器的語言不同(即,是否退出沙箱並不重要,因為您仍然無法做某些事情)。只要在您的瀏覽器中運行成熟的編程語言,它就有可能對您的本地系統起作用。如今,Java Applet仍然非常強大(IMPI控制台等)。
您的Java applet和JavaScript方程式是錯誤的。 JavaScript是瀏覽器的固有功能,而Java需要一個明確的,單獨安裝的插件。一個瀏覽器中的JavaScript漏洞與其他瀏覽器並不相同,但是applet漏洞在所有地方都可以使用,因為插件在所有地方都相同。此外,JavaScript並非旨在在大多數瀏覽器中提供操作系統功能,而是可以通過不同的方式進行沙箱處理(防止本機代碼執行)。最好將Java和Flash等同起來。
***大聲抱怨***,例如“類似於JavaScript”。只是將它們放在同一句話中,就是在引起混亂。它們實際上完全不同,JS確實不能像插件一樣工作。我現在已經閱讀了所有評論... @DCKing說了什麼。
@DCKing: Javascript實際上並不像您想像的那樣對瀏覽器內在的;實際上,Rhino,SpiderMonkey和V8之類的Java解釋器可以獨立於通常連接的瀏覽器運行。在主機應用程序(不一定是瀏覽器)和所有這些流行的Javascript引擎之間確實存在某種插件接口。
@LieRyan就是在爭論語義。每個主要的瀏覽器都使用不同的JavaScript實現,並且攻擊者對每個瀏覽器都要求不同的漏洞。插件到處都是一樣的。這才是重點。
meriton
2014-05-10 16:48:48 UTC
view on stackexchange narkive permalink

報告的安全漏洞與Java(編程語言)無關,由於JVM強制執行內存安全性,Java實際上比諸如緩衝區溢出的C或C ++語言更強大。緩衝區過度讀取仍然是一個威脅,並可能導致諸如Heartbleed之類的混亂。

相反,所報告的漏洞位於Java Sandbox中,該Java沙盒試圖實施特權模型以允許安全執行不受信任的代碼,並且最著名的是允許在瀏覽器中自動執行Java Applets。那個沙盒到處都是孔。而且,Oracle一年僅發布4次補丁(“關鍵補丁更新”)。不用說,瀏覽器廠商對此並不滿意。例如,從Firefox 26開始,Firefox 需要用戶授權才能啟動Java Applet

新聞報導沒有對此加以區分的原因是Oracle使用“ Java”既是該編程語言的商標,也是運行applet的瀏覽器插件的商標。實際上,如果普通用戶遇到Java商標,它可能是指Java商標。如果您問我,一個原因是,無論有無沙盒都使用相同的API,並且大多數Java代碼在沒有沙盒的情況下運行(因為該代碼受信任)。結果,開發人員很可能在更改Java API或其實現時忘記了這個晦澀的功能,意外地暴露了應該保護的內容(為了說明這是多麼容易,請遵守冗長的 Secure Coding Guidelines Java SE)。另一個但又相關的原因是Java API的龐大規模(對於Java SE 6, 5800類和近50,000種方法)。

恕我直言,這是最好的答案,因為它涉及保護嘗試執行所有操作的API的複雜性。一個完整的Java小程序版本(沒有IO)會帶來很多好處,但是當前的API對此太緊密了。
我只有這個答案的牛肉是:1)Heartbleed不是緩衝區溢出攻擊的結果。 2)由於明顯的原因,您也不能說與虛擬機結合的語言比另一種語言本身“更好”。除此之外,請充分注意該沙箱中的實際漏洞,編程語言不會比人類語言“安全”或“不安全”,而是歸結為編譯器或解釋器,並且*最*重要:人*使用*語言。
1)好的,根據Wikipedia的說法,Heartbleed是緩衝區被超讀而不是緩衝區溢出,因為超出緩衝區長度的訪問是讀訪問而不是寫訪問。將修復術語。 2)我認為這是一個有效的比較,因為Java **語言**規範[授權](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls -15.10.4)運行時環境執行此檢查。在Java中,內存安全是一種語言功能。在C或C ++中則不是。
dimo414
2014-05-11 00:55:51 UTC
view on stackexchange narkive permalink

還有很多其他的編程語言都沒有這個問題,因此必須有更好的方法來處理Java所做的錯誤。

高要求,您從哪裡得到的印象?

原則上講,之所以有這麼多的安全補丁,是因為Java曾經是Java的代名詞。設計為安全的,具有許多其他語言沒有的,以安全性為重點的功能。

Java語言環境

1.2.2健壯和安全

Java技術旨在在分佈式環境中運行,這意味著安全性至關重要。通過在語言和運行時系統中設計的安全功能,Java技術使您可以構建無法從外部入侵的應用程序。在網絡環境中,使用Java編程語言編寫的應用程序可以防止未經授權的代碼入侵並試圖在後台創建病毒或入侵文件系統。

如果不包括在內,在您的編程語言規範中“保持安全”,您幾乎不必發布安全補丁。另一方面,如果這是您規定的目標之一,那麼您將很難按不要

Thomas Pornin
2014-05-16 20:43:43 UTC
view on stackexchange narkive permalink

Java本身俱有極大的安全性資產,即其固有的抵抗緩衝區溢出和內存管理錯誤的能力:

  • 檢查所有數組訪問是否與分配的數組長度有關。因此,可靠地捕獲了緩衝區溢出,並觸發了一個更好的異常(這將遠程代碼執行漏洞變成僅僅是拒絕服務)。

  • 內存分配是通過以下方式管理的:垃圾收集器,可防止釋放後使用和釋放兩次的錯誤。此外,GC還使字符串的處理更加容易(Java中字符串是不變的),從而消除了大多數情況下出現緩衝區溢出錯誤的情況。

  • 強制執行嚴格的鍵入;代碼無法訪問不是它們的數據字節。這再次防止了漏洞(在編譯時或在更壞的情況下,將在運行時 ClassCastException 報告數據類型被破壞的錯誤)。

在安全性方面,使Java比許多編程語言(尤其是無用的C / C ++語言)強得多。

但是,Java設計人員試圖利用這種增強的安全性來使某些事情變得困難,例如 applets。問題是攻擊面:由於小程序可能是惡意代碼,因此必須對其進行控制。但是,如果要執行任何操作,那麼惡意代碼必須能夠使用“標準Java類”,因此必須在每個單個標準Java類上強制執行“控制點”。因此,攻擊面由數百個包含數千種方法的類組成,它們中的所有必須強制執行適當的檢查。

Java設計師懷雄心:犯下數千種方法的難度沒有任何檢查的檢查比他們想像的要高得多。所有的“ Java錯誤”都來自這個事實。

我們可以在這裡將Java與Javascript進行比較;例如,Java允許訪問磁盤上的文件,但是,除非小應用程序要求它並且用戶同意(這需要整個小應用程序簽名業務),否則不能將此權限授予小應用程序。雄心勃勃的Javascript根本沒有任何文件訪問方法:如果該函數實際上不存在,則對函數的訪問控制不能正確實現!

總結一下: Java很好和安全。 Java applets 意味著一個巨大的攻擊面,其安全性很難保證。但是,對於獨立的應用程序和服務器,如果需要安全性,使用Java是個好主意(這同樣適用於C#)。

Nitpick:它更像是數千個類和數以萬計的方法。除此之外:很好的答案!
Kasun
2014-05-10 01:53:36 UTC
view on stackexchange narkive permalink

這些天,找到更多漏洞可能並不意味著該軟件有多不安全。問題是每個軟件供應商的安全響應團隊對此有何反應以及補丁發布的速度如何。

只需檢查Firefox和Chrome的補丁速度有多快。

我還記得,Oracle有一個名為關鍵補丁更新(CPU)的程序,該程序每季度提供大量補丁。如果存在零日漏洞,他們還會發布不帶CPU的補丁。但是問題在於Oracle發布補丁所需的時間。

我同意第一句話。不*發現*其他軟件中的安全漏洞並不意味著沒有漏洞-人們是否正在密切關注?
John
2014-05-14 06:58:17 UTC
view on stackexchange narkive permalink

高估的恐懼.. Java本身很好。這些問題是在網絡瀏覽器中運行的老式Java-Applet發生的,但是我懷疑有人真的再創建了Applet-大多數開發公司至少在過去十年中一直將Flash或HTML4 / 5用於前端Web界面。

這些天,Java主要用於後端JEE,前端GUI客戶端(JFX / AWT / SWING),控制台應用程序和移動應用程序-因此沒有問題。

SSpoke
2014-05-11 08:07:39 UTC
view on stackexchange narkive permalink

答案很明顯。您可以使用JavaScript,HTML或Flash刪除計算機文件嗎?不,你不能。

Java呢?您可以刪除所有文件,使用Java小程序(託管在網站上)完全擦除硬盤驅動器嗎?答案是肯定的,如果您接受運行小程序。與任何其他Web瀏覽器語言不同。

Java具有執行諸如在計算機上執行程序(可執行文件)之類的能力,還具有寫入,更新或刪除硬盤驅動器上的文件的能力。

此外,Java病毒掃描程序無法檢測到applet:在大多數情況下,您甚至都不知道它會破壞您的計算機。一些掃描儀可能檢測到某些東西試圖刪除受限目錄中的文件:我知道的是 Kaspersky,但是大多數人默認情況下已關閉此功能。

Java applet可以做諸如更新Windows文件(例如 HAL.dll )之類的事情,這將阻止您的計算機啟動。當您接受運行小程序時,它可以對計算機執行任何操作。

在某些情況下,即使Java小程序已簽名還是未簽名也無關緊要-它仍將在計算機上下載文件。

更不用說Java了。

還有一種正在流行,叫做 Unity Engine(類似於Flash):它具有相同的功能Java等安全問題,可能會對您的計算機造成任何影響。 Unity Engine和Java之間的唯一區別是Unity在運行時不會詢問您是否要運行它。因此,如果某人安裝了Unity Player並運行包含病毒的遊戲,它將破壞您的計算機。

VBScript不太流行,但可能極度有害。我相信Microsoft Internet Explorer是當前唯一支持此功能的工具,但是我可能是錯的。它具有與Java相同的功能。

“答案很明顯。您可以使用JavaScript,HTML或Flash刪除計算機文件嗎?”我可以。我需要的是對JavaScript引擎或Flash插件的充分利用。
您必須針對特定版本的Flash和JavaScript涉及很多因素,似乎每個瀏覽器都為此使用了自己的引擎,是的,您畢竟可以針對一定比例,但擔心的人受到影響的可能性很小,有了一個語言而無需黑客代碼就能做到這一點,只有普通程序員才能用Java / Unity等做到這一點,如果他當然是邪惡的,那麼他只是想說人們不相信會危害甚至隱藏的東西。小傢伙試圖用鍵盤記錄器把我搞砸,沒什麼比讓我生氣的多了。哈哈
Java小應用程序通常也受到諸如刪除文件系統等情況的保護-首先,您必須逃避一些沙箱攻擊,這也需要您針對特定版本和零天。從這個角度來看,Java和Flash插件或多或少地在同一條船上。
Flash也有其應有的優勢。使用由本機引擎“解釋”並具有編程錯誤(Java,Flash是主要示例)的任何語言,都可以逃避它們構建的沙箱並影響主機系統,甚至可以注入本機代碼,然後利用主機的特權升級錯誤。
“如果您接受運行小程序,答案是肯定的。”如果我們在談論小程序,這是完全錯誤的(否則,所有賭注都關閉了,希望您知道在“名義上”的計算機上安裝了什麼)。請參閱:[Java開發工具包(JDK)中的權限](http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html)


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...