web-dev-qa-db-ja.com

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

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

90
ecleel

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

  1. JNI経由でネイティブコードを呼び出す場合
  2. JVM自体(通常はC++で記述されています)
  3. インタープリターまたはJITコンパイラーが正常に動作しません(Javaバイトコードの必須の境界チェック)
102

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

24
Brian Rasmussen

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

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

バッファオーバーランがある場合は、おそらくJava Virtual Machineのバグによるものであり、私の知る限り、Java言語仕様もJava仮想マシン仕様。

13
coobird

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

http://secunia.com/advisories/25295

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

  • Java Runtime Environment(JRE) "unpack200" JAR Unpackingユーティリティの整数およびバッファオーバーフローの脆弱性により、権限がエスカレーションされる可能性がある https://download.Oracle.com/sunalerts/ 1020225.1.html

    Java Runtime Environment(JRE)とアプレットのアンパックおよびJava "unpack200" JARアンパックユーティリティを使用するWeb Startアプリケーションの整数およびバッファオーバーフローの脆弱性により、たとえば、信頼されていないアプレットは、ローカルファイルの読み取りと書き込み、または信頼されていないアプレットを実行しているユーザーがアクセスできるローカルアプリケーションの実行を許可します。

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

  • Sunで複数の脆弱性が確認されましたJava Development Kit(JDK)and Java Runtime Environment(JRE)。 https://security.gentoo .org/glsa/200705-2

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

9
BobbyShaftoe

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

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

バッファを使用するコードがあり、コードがそれを正しく解析する責任があるという意味でのバッファオーバーフローが、そうすることができない可能性があります。たとえば、XMLパーサーを作成し、パーサーの設計により、以前に検証されたデータをペイロードで上書きしてアプリケーションの動作を悪化させる不正な(または正当だが珍しい)要求を誰かが提供する可能性があります。

この後者の形式はあまりありませんが、広く配布されているSQL文字列のクレンジング機能が不十分であり、このような問題があると魅力的なターゲットになります。

9
ShuggyCoUk

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

4
Mendelt

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

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

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

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

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

3
falstro

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

2
Tim Howland

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

1