Javaにはバッファオーバーフローがありますか?


96

Javaにはバッファオーバーフローがありますか?はいの場合、シナリオを教えていただけますか?


2
一部のライブラリ関数(ネイティブコードで実装)にはバグがあることがわかっています。特にJava 5の領域では、2Dでの多くのエクスプロイト、サウンドまたはカラープロファイルが知られています。
eckes

回答:


108

Java文字列はchar配列に基づいており、Javaは配列の境界を自動的にチェックするため、バッファオーバーフローは異常なシナリオでのみ可能です。

  1. JNIを介してネイティブコードを呼び出す場合
  2. JVM自体(通常はC ++で記述)
  3. インタープリターまたはJITコンパイラーが正しく機能しません(Javaバイトコードで指定された境界チェック)

24

JavaやC#などのマネージ言語にはこれらの問題はありませんが、実際にコードを実行する特定の仮想マシン(JVM / CLR / etc)には問題がある可能性があります。


5
安全でないコンテキストのC#では、バッファオーバーフローが発生する可能性があります。言語としてのJavaはこれを完全に禁止します(管理されていないポインターアクセスを取得するには、JNIを介して言語を変更する必要があります)
ShuggyCoUk

1
いい視点ね。安全でないC#を使用すると、快適な管理された世界ではサンドボックス化されなくなります。
ブライアンラスムッセン

1
そうです、あなたが安全でないものを書いたり、相互運用性を実行したりしなくても、そうしたライブラリを使用している可能性があります。これは注意が必要なことです。
BobbyShaftoe 2009年

13

すべての意図と目的のために、いいえ。

Javaには、割り当てられた配列の外側の領域からデータにアクセスできないことをチェックする配列境界チェックがあります。配列のサイズを超える領域にアクセスしようとすると、ArrayOutOfBounds例外がスローされます。

バッファオーバーランが発生した場合、それはおそらくJava仮想マシンのバグによるものであり、私の知る限りでは、Java言語仕様やJava仮想マシン仕様で記述された意図された動作ではありません。


10

はいといいえ。いいえ、マネージドメモリモデルであるため、誤って作成してバッファーオーバーフローの脆弱性に自分を誤ってオープンすることはできません。ただし、JVMおよびJDKにバッファオーバーフローの脆弱性が存在する可能性があります。このSecuniaアドバイザリーをご覧ください:

http://secunia.com/advisories/25295

または、以前のいくつかのJDKおよびJREの脆弱性に関するこれらの古いアドバイザリを参照してください。

  • Javaランタイム環境(JRE)の「unpack200」JARアンパックユーティリティにおける整数およびバッファオーバーフローの脆弱性により、権限が昇格する可能性があるhttps://download.oracle.com/sunalerts/1020225.1.html

    「unpack200」JAR解凍ユーティリティを使用した解凍アプレットおよびJava Web StartアプリケーションでのJavaランタイム環境(JRE)における整数およびバッファオーバーフローの脆弱性により、信頼できないアプレットまたはアプリケーションが特権を昇格させる可能性があります。たとえば、信頼できないアプレットは、ローカルファイルの読み取りと書き込み、または信頼できないアプレットを実行しているユーザーがアクセスできるローカルアプリケーションの実行を許可することができます。

    Sunは、iDefense VCP(http://labs.idefense.com/vcp/)と協力して「regenrecht」とこれらの問題に注意を向けてくれたGoogleのChris Evansと協力して感謝します。

  • Sun Java Development Kit(JDK)およびJava Runtime Environment(JRE)に複数の脆弱性が確認されています。https://security.gentoo.org/glsa/200705-23

    「システムクラスの不正使用」に関連する不特定の脆弱性が富士通セキュリティチームによって報告されました。さらに、Google Security TeamのChris Evansが、JPGまたはBMPファイルで使用されるICCパーサーでの整数オーバーフロー、および特定のBMPファイルの処理時の/ dev / ttyへの不正なopen()呼び出しを引き起こすオーバーフローを報告しました。


9

スタックまたはヒープ自体を上書きするという厳密な意味でのバッファオーバーフローには、次のいずれかが必要です。

  1. フレームワークのバグ(これらは過去に存在しており、再び発生する可能性があります)
  2. JNIの使用(基本的にマネージコードを使用しない)

バッファを使用するコードがあり、コードがそれを正しく解析する責任があるが、そうしないと、バッファオーバーフローが発生する可能性があります。たとえば、XMLパーサーを作成し、誰かが不正な(または正当であるが一般的ではない)リクエストを提供すると、パーサーの設計により、以前に検証されたデータが、アプリケーションの動作が低下する原因となるペイロードで上書きされます。

この後者の形式は可能性は低くなりますが、広く分散されたSQL文字列クレンジング関数の記述が不十分であり、このような問題が魅力的なターゲットになる可能性があります。


4

Java(および.Net)仮想マシンは、予約されたメモリの外部に書き込もうとするコードをキャッチします。これを正しく処理しないアプリケーションでも、セキュリティ上の問題が発生する可能性があります。悪意のあるユーザーが無効な入力を入力して例外をトリガーできる場合、たとえばサービス拒否攻撃を行うことができます。


3

すでに指摘したように、Javaは言語としてすべてのメモリアクセスをチェックします。ここでエラーが発生した場合、JVMはプログラムではなく障害を起こしています。ただし、注意すべき点は、Javaのメモリリークと同様の議論です。スタックを破壊することは不可能ですが、間違った場所にあるArrayOutOfBoundsExceptionは正しく処理されず、システムを台無しにする可能性があります。


3

Java Native Interace(JNI)機能を使用して外部コードを呼び出し、外部コードに悪用可能な問題があった場合、Javaプログラムでバッファオーバーフローを引き起こす可能性があります。ほとんどのアプリケーションは、可能であればJNIの使用を避けるため、これはかなり一般的ではありません。


3

メソッドが、通常は整数オーバーフローを介して、意図していない配列の有効なエントリに書き込むことが可能です。

たとえば、以下は境界をチェックするには不十分です。

/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */

IIRCにはStringBufferかつてそのようなバグがありましたが、あなたがそれを使ってできる興味深いことは何もありませんでした。


何がある境界をチェックするのに十分な?
Broam

1
@ブルーム:0 <= off && 0 <= len && off <= buff.length-len私は思います。私を引用しないでください。見た目は同じですが、オーバーフローの可能性はありません(元のoff + lenでは負になる可能性があるため、明らかに配列の長さよりも小さくなります)。保守プログラマーがそれを明白な形に「整理」しないことを確認してください。整数オーバーフローは非常に混乱します。しばらく考えなければならないが、それから私はそれを間違えているというしつこい疑惑がある。ただし、もちろん、別のレビュー担当者と元のプログラマーがいるはずです。もちろん、エラーが発生する可能性はありません。(非)
トム・ホーティン-タックライン

私はこれを少し見つめなければなりませんでしたが、あなたは正しいです。off + lenはオーバーフローしてラップする可能性があります... CではJavaで、私が誤解しない限り、オーバーフロー例外が発生する前に例外が発生しますよね?
Broam

1
いいえ。整数演算はサイレントにラップします。C#には、オーバーフロー時に例外がスローされる「モード」がありますが、あまり使用されないと思います(使用すると考えれば、とにかく正しいことをすると思います)。
トム・ホーティン-タックライン

1

JAVAの主要な機能の1つはセキュリティです。インタープリター言語で書かれたプログラムは、バッファーオーバーフローの悪用の傾向はありませんが、インタープリター自体で常にバッファーオーバーフローを引き起こす可能性があります。難しいでしょうが。同様にPythonもインタプリタ言語であり、バッファオーバーフローから安全です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.