Apakah Java memiliki buffer overflows? Jika ya, bisakah Anda memberi saya skenario?
Jawaban:
Karena Java Strings didasarkan pada array karakter dan Java secara otomatis memeriksa batas array, buffer overflows hanya mungkin dilakukan dalam skenario yang tidak biasa:
Bahasa yang dikelola seperti Java dan C # tidak memiliki masalah ini, tetapi mesin virtual tertentu (JVM / CLR / dll) yang sebenarnya menjalankan kode tersebut mungkin.
Untuk semua maksud dan tujuan, tidak.
Java memiliki pemeriksaan batas larik yang akan memeriksa bahwa data tidak dapat diakses dari area di luar larik yang dialokasikan. Saat seseorang mencoba mengakses area yang melebihi ukuran larik, fileArrayOutOfBounds
pengecualian akan dilemparkan.
Jika ada buffer-overrun, itu mungkin dari bug di Java Virtual Machine, dan menurut pengetahuan saya, bukan perilaku yang dimaksudkan yang tertulis dalam Spesifikasi Bahasa Java atau Spesifikasi Mesin Virtual Java.
Iya dan tidak. Tidak, karena Anda tidak dapat benar-benar membuat kesalahan membuka diri terhadap kerentanan buffer overflow karena ini adalah model memori yang dikelola. Namun, mungkin ada kerentanan buffer overflow di JVM dan JDK. Lihat nasihat Secunia ini:
http://secunia.com/advisories/25295
Atau lihat nasihat lama ini pada beberapa kerentanan JDK dan JRE sebelumnya:
Kerentanan Integer dan Buffer Overflow di Java Runtime Environment (JRE) "unpack200" JAR Unpacking Utility Dapat Menyebabkan Peningkatan Hak https://download.oracle.com/sunalerts/1020225.1.html
Kerentanan integer dan buffer overflow di Java Runtime Environment (JRE) dengan membongkar applet dan aplikasi Java Web Start menggunakan utilitas "unpack200" JAR unpacking dapat memungkinkan applet atau aplikasi yang tidak tepercaya untuk meningkatkan hak istimewa. Misalnya, applet yang tidak tepercaya dapat memberikan izin untuk membaca dan menulis file lokal atau menjalankan aplikasi lokal yang dapat diakses oleh pengguna yang menjalankan applet yang tidak tepercaya.
Sun mengucapkan terima kasih, "regenrecht" yang bekerja dengan iDefense VCP ( http://labs.idefense.com/vcp/ ) dan Chris Evans dari Google karena telah menyampaikan masalah ini kepada kami.
Berbagai kerentanan telah diidentifikasi di Sun Java Development Kit (JDK) dan Java Runtime Environment (JRE). https://security.gentoo.org/glsa/200705-23
Kerentanan yang tidak ditentukan yang melibatkan "penggunaan kelas sistem yang salah" telah dilaporkan oleh tim keamanan Fujitsu. Selain itu, Chris Evans dari Tim Keamanan Google melaporkan overflow integer yang mengakibatkan buffer overflow di parser ICC yang digunakan dengan file JPG atau BMP, dan panggilan open () yang salah ke / dev / tty saat memproses file BMP tertentu.
Buffer overflow dalam arti yang tepat untuk menimpa tumpukan atau heap itu sendiri akan membutuhkan:
Buffer overflow dalam artian Anda memiliki kode yang menggunakan buffer dan kode Anda bertanggung jawab untuk menguraikannya dengan benar, tetapi mungkin gagal melakukannya. Misalnya Anda mungkin menulis pengurai XML dan seseorang dapat memberi Anda permintaan dalam format yang salah (atau sah tapi tidak umum) yang, karena desain pengurai Anda, menimpa data yang sebelumnya divalidasi dengan beberapa muatan yang akan menyebabkan aplikasi Anda berperilaku buruk.
Bentuk yang terakhir ini kecil kemungkinannya tetapi fungsi pembersihan string sql yang ditulis dengan buruk didistribusikan secara luas yang memiliki masalah seperti ini akan menjadi target yang mengundang.
Mesin virtual Java (dan .Net) menangkap kode yang mencoba menulis di luar memori yang dicadangkan. Aplikasi yang tidak menangani ini dengan benar masih dapat menyebabkan masalah keamanan. Jika pengguna jahat dapat memicu pengecualian dengan memasukkan masukan yang tidak valid, mereka dapat melakukan serangan penolakan layanan misalnya.
Seperti yang telah ditunjukkan, Java memiliki, sebagai bahasa, membatasi pemeriksaan pada semua akses memori, dan jika ada kesalahan di sini, JVM salah dan bukan programnya. Namun, yang harus diperhatikan, yaitu argumen yang mirip dengan kebocoran memori di Java; meskipun tidak mungkin untuk menghancurkan tumpukan, ArrayOutOfBoundsException di tempat yang salah, yang tidak ditangani dengan benar, mungkin masih akan mengacaukan sistem Anda.
Anda dapat menyebabkan buffer overflow dalam program Java jika Anda menggunakan fasilitas Java Native Interace (JNI) untuk memanggil kode eksternal, dan kode eksternal memiliki masalah yang dapat dieksploitasi. Ini tidak umum, karena sebagian besar aplikasi menghindari penggunaan JNI jika memungkinkan.
Ada kemungkinan metode untuk menulis entri yang valid dari sebuah array yang tidak dimaksudkannya, biasanya melalui luapan integer.
Misalnya, berikut ini tidak cukup untuk memeriksa batas:
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC, StringBuffer
pernah memiliki bug seperti itu, tetapi tidak ada hal menarik yang dapat Anda lakukan dengannya.
0 <= off && 0 <= len && off <= buff.length-len
Saya pikir. Jangan mengutip saya. Ini terlihat sama tetapi tidak ada kemungkinan overflow (dalam bahasa asli off + len mungkin negatif dan karena itu jelas lebih kecil dari panjang array). Pastikan tidak ada programmer pemeliharaan yang pernah "merapikan" ke dalam bentuk yang jelas. Saya menemukan integer overflow sangat membingungkan. Harus memikirkannya sebentar, dan kemudian ada kecurigaan yang mengganggu bahwa saya salah. Tetapi tentu saja, harus ada peninjau lain dan pemrogram asli - bersama-sama tentu saja tidak mungkin ada kesalahan yang bisa terjadi! (tidak)
Salah satu fitur utama JAVA adalah Keamanan. Program yang ditulis dalam bahasa interpreter tidak rentan terhadap eksploitasi buffer overflow, tetapi Anda selalu dapat menyebabkan buffer overflow di Interpreter itu sendiri. Meski akan sulit. Demikian pula Python juga merupakan bahasa yang ditafsirkan dan aman dari buffer overflow.