Apakah Java memiliki buffer overflows?

96

Apakah Java memiliki buffer overflows? Jika ya, bisakah Anda memberi saya skenario?

ecleel
sumber
2
Beberapa fungsi perpustakaan (diimplementasikan dalam kode asli) telah diketahui memiliki bug. Khususnya di wilayah Java 5 banyak eksploit dalam 2D, profil suara atau warna sudah dikenal.
eckes

Jawaban:

108

Karena Java Strings didasarkan pada array karakter dan Java secara otomatis memeriksa batas array, buffer overflows hanya mungkin dilakukan dalam skenario yang tidak biasa:

  1. Jika Anda memanggil kode native melalui JNI
  2. Di JVM itu sendiri (biasanya ditulis dalam C ++)
  3. Interpreter atau compiler JIT tidak bekerja dengan benar (Java bytecode mandated bounds check)
Michael Borgwardt
sumber
24

Bahasa yang dikelola seperti Java dan C # tidak memiliki masalah ini, tetapi mesin virtual tertentu (JVM / CLR / dll) yang sebenarnya menjalankan kode tersebut mungkin.

Brian Rasmussen
sumber
5
C # dalam konteks yang tidak aman dapat memiliki buffer overflows. Java sebagai bahasa sepenuhnya melarang ini (Anda harus mengubah bahasa melalui JNI untuk mendapatkan akses penunjuk yang tidak diubah)
ShuggyCoUk
1
Poin yang bagus. Dengan C # yang tidak aman, Anda jelas tidak lagi berada dalam kotak pasir di dunia yang dikelola dengan nyaman.
Brian Rasmussen
1
Benar, dan bahkan jika ANDA tidak menulis sesuatu yang tidak aman atau melakukan interop apa pun, Anda dapat menggunakan perpustakaan yang melakukannya. Jadi itu sesuatu yang harus diperhatikan.
BobbyShaftoe
13

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.

burung coobird
sumber
10

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.

BobbyShaftoe
sumber
9

Buffer overflow dalam arti yang tepat untuk menimpa tumpukan atau heap itu sendiri akan membutuhkan:

  1. Bug dalam kerangka kerja (ini telah ada di masa lalu dan mungkin juga terjadi lagi)
  2. Penggunaan JNI (pada dasarnya tidak lagi menggunakan kode yang dikelola)

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.

ShuggyCoUk
sumber
4

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.

Mendelt
sumber
3

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.

falstro
sumber
3

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.

Tim Howland
sumber
3

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, StringBufferpernah memiliki bug seperti itu, tetapi tidak ada hal menarik yang dapat Anda lakukan dengannya.

Tom Hawtin - tackline
sumber
Apa yang cukup untuk memeriksa batas?
Broam
1
@ Broam: 0 <= off && 0 <= len && off <= buff.length-lenSaya 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)
Tom Hawtin - tackline
Saya harus melihat ini sedikit tetapi Anda benar. off + len bisa meluap dan membungkus ... di C. Di Jawa , kecuali saya salah - Anda akan mendapatkan pengecualian luapan sebelum itu terjadi, bukan?
Broam
1
Tidak. Aritmatika integer membungkus secara diam-diam. C # memiliki "mode" di mana pengecualian dilemparkan pada overflow, tetapi menurut saya ini tidak banyak digunakan (jika Anda berpikir untuk menggunakannya, Anda mungkin akan berpikir untuk melakukan hal yang benar).
Tom Hawtin - tackline
1

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.

ABHISHEK SRIVASTAVA
sumber