Javaバッファオーバーフローがありますか?はいの場合、シナリオを教えていただけますか?
Java文字列はchar配列に基づいており、Javaは自動的に配列境界をチェックするため、バッファオーバーフローは異常なシナリオでのみ可能です。
JavaおよびC#などの管理言語にはこれらの問題はありませんが、実際にコードを実行する特定の仮想マシン(JVM/CLR/etc)には問題があります。
すべての意図と目的のために、いいえ。
Javaには配列 境界チェック があり、割り当てられた配列以外の領域からデータにアクセスできないことをチェックします。配列のサイズを超える領域にアクセスしようとすると、 ArrayOutOfBounds
例外がスローされます。
バッファオーバーランがある場合は、おそらくJava Virtual Machineのバグによるものであり、私の知る限り、Java言語仕様もJava仮想マシン仕様。
はいといいえ。いいえ、それはマネージドメモリモデルであるため、バッファオーバーフローの脆弱性を誤って作成することはできません。ただし、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ファイルを処理する場合。
スタックまたはヒープ自体を上書きするという厳密な意味でのバッファオーバーフローには、次のいずれかが必要です。
バッファを使用するコードがあり、コードがそれを正しく解析する責任があるという意味でのバッファオーバーフローが、そうすることができない可能性があります。たとえば、XMLパーサーを作成し、パーサーの設計により、以前に検証されたデータをペイロードで上書きしてアプリケーションの動作を悪化させる不正な(または正当だが珍しい)要求を誰かが提供する可能性があります。
この後者の形式はあまりありませんが、広く配布されているSQL文字列のクレンジング機能が不十分であり、このような問題があると魅力的なターゲットになります。
Java(および.Net)仮想マシンは、予約メモリの外側に書き込もうとするコードをキャッチします。これを正しく処理しないアプリケーションは、依然としてセキュリティの問題を引き起こす可能性があります。悪意のあるユーザーが無効な入力を入力して例外をトリガーできる場合、たとえば、サービス拒否攻撃を行うことができます。
メソッドは、通常は整数オーバーフローを通じて、意図しない配列の有効なエントリに書き込むことができます。
たとえば、次は境界をチェックするには不十分です。
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC、StringBuffer
にはかつてそのようなバグがありましたが、それでできることは何もありませんでした。
既に指摘したように、Javaは、言語として、すべてのメモリアクセスの境界チェックを行っており、ここでエラーが発生した場合、JVMはプログラムではなく障害です。 Javaのメモリリークと同様の引数であることに注意してください。スタックを破壊することはできませんが、間違った場所でのArrayOutOfBoundsExceptionは正しく処理されず、システムを台無しにする可能性があります。
Java Native Interace(JNI)機能を使用して外部コードと外部コードを呼び出す場合、Javaプログラムでバッファオーバーフローを引き起こす可能性があります。ほとんどのアプリケーションは可能な限りJNIの使用を避けているため、これはかなり一般的ではありません。
Javaの重要な機能の1つは、セキュリティです。インタープリター言語で書かれたプログラムは、バッファーオーバーフローエクスプロイトの傾向がありませんが、インタープリター自体で常にバッファーオーバーフローを引き起こす可能性があります。 。同様にPythonもインタプリタ言語であり、バッファオーバーフローから安全です。