Java'da arabellek taşmaları var mı?


97

Java'da arabellek taşmaları var mı? Cevabınız evet ise bana senaryolar verebilir misiniz?


2
Bazı kütüphane işlevlerinin (yerel kodda uygulanmış) hatalara sahip olduğu bilinmektedir. Özellikle Java 5 alanında, 2 boyutlu, ses veya renk profillerinde birçok istismar bilinmektedir.
25'te eckes

Yanıtlar:


109

Java Dizeleri karakter dizilerine dayandığından ve Java dizi sınırlarını otomatik olarak kontrol ettiğinden, arabellek taşmaları yalnızca olağandışı senaryolarda mümkündür:

  1. Yerel kodu JNI aracılığıyla ararsanız
  2. JVM'nin kendisinde (genellikle C ++ ile yazılır)
  3. Yorumlayıcı veya JIT derleyicisi doğru çalışmıyor (Java bayt kodu zorunlu sınır kontrolleri)

24

Java ve C # gibi yönetilen dillerde bu sorunlar yoktur, ancak kodu gerçekten çalıştıran belirli sanal makineler (JVM / CLR / vb.) Olabilir.


5
Güvenli olmayan bir bağlamda C # arabellek taşmalarına sahip olabilir. Bir dil tamamen bu yasaklar gibi Java (eğer unmanged işaretçi erişmek için JNI aracılığıyla dilleri değiştirmeli)
ShuggyCoUk

1
İyi bir nokta. Güvenli olmayan C # ile rahatça yönetilen bir dünyada artık korumalı alanda değilsiniz.
Brian Rasmussen

1
Doğru ve güvenli olmayan herhangi bir şey yazmasanız veya birlikte çalışmasanız bile, bunu yapan bir kitaplık kullanıyor olabilirsiniz. Yani bu dikkat edilmesi gereken bir şey.
BobbyShaftoe

13

Tüm niyet ve amaçlar için hayır.

Java, verilere tahsis edilen dizinin dışındaki alandan erişilemediğini kontrol edecek dizi sınırları denetimine sahiptir. Dizinin boyutunun ötesinde bir alana erişilmeye çalışıldığında, bir ArrayOutOfBoundsistisna atılacaktır.

Bir arabellek aşımı varsa, bu büyük olasılıkla Java Sanal Makinesi'ndeki bir hatadan kaynaklanmaktadır ve bildiğim kadarıyla Java Dil Belirtimlerinde veya Java Sanal Makine Belirtimlerinde yazılan amaçlanan davranış değildir.


10

Evet ve hayır. Hayır, çünkü bu, yönetilen bir bellek modeli olduğu için kendinizi yanlışlıkla bir arabellek taşması güvenlik açığına açamazsınız. Ancak, JVM ve JDK'da arabellek taşması güvenlik açıkları olabilir. Secunia tavsiyesine bakın:

http://secunia.com/advisories/25295

Veya önceki birkaç JDK ve JRE güvenlik açığı hakkındaki bu eski tavsiyelere bakın:

  • Java Runtime Environment (JRE) "unpack200" JAR Paket Açma Yardımcı Programındaki Tam Sayı ve Arabellek Taşması Güvenlik Açıkları Ayrıcalıkların Artmasına Yol Açabilir https://download.oracle.com/sunalerts/1020225.1.html

    Java Runtime Environment (JRE) içerisindeki tamsayı ve arabellek taşması güvenlik açıkları, "unpack200" JAR paket açma yardımcı programını kullanan paket açma uygulamaları ve Java Web Start uygulamaları, güvenilmeyen bir uygulamanın veya uygulamanın ayrıcalıkları artırmasına izin verebilir. Örneğin, güvenilmeyen bir uygulama, kendine güvenilmeyen uygulamayı çalıştıran kullanıcı tarafından erişilebilen yerel dosyaları okuma ve yazma veya yerel uygulamaları yürütme izinleri verebilir.

    Sun, iDefense VCP ( http://labs.idefense.com/vcp/ ) ve Google'dan Chris Evans ile birlikte çalışan "regenrecht" sayesinde bu sorunları dikkatimize sundukları için teşekkür eder .

  • Sun Java Development Kit (JDK) ve Java Runtime Environment (JRE) içinde birden çok güvenlik açığı belirlendi. https://security.gentoo.org/glsa/200705-23

    Fujitsu güvenlik ekibi, "sistem sınıflarının yanlış kullanımını" içeren, belirtilmemiş bir güvenlik açığı rapor etti. Ek olarak, Google Güvenlik Ekibi'nden Chris Evans, JPG veya BMP dosyalarıyla kullanılan ICC ayrıştırıcısında arabellek taşmasına ve belirli BMP dosyalarını işlerken / dev / tty'ye yanlış bir open () çağrısına neden olan bir tamsayı taşması bildirdi.


9

Yığının veya yığının kendisinin üzerine yazma anlamında bir arabellek taşması şunlardan birini gerektirir:

  1. Çerçevede bir hata (bunlar geçmişte vardı ve yine de olabilir)
  2. JNI kullanımı (esasen artık yönetilen kod kullanmamaktadır)

Bir arabellek kullanan koda sahip olmanız ve kodunuzun doğru bir şekilde ayrıştırılmasından sorumlu olması anlamında bir arabellek taşması, ancak bunu yapmamak mümkündür. Örneğin, bir XML ayrıştırıcı yazabilirsiniz ve birisi size hatalı biçimlendirilmiş (veya meşru ancak yaygın olmayan) bir istek sunabilir; bu, ayrıştırıcınızın tasarımı nedeniyle, uygulamanızın kötü davranmasına neden olacak bir miktar yük ile önceden doğrulanmış verilerin üzerine yazar.

Bu ikinci biçim daha az olasıdır, ancak kötü yazılmış bir sql dizesi temizleme işlevi, yaygın olarak dağıtılmış ve böyle bir sorunu olan, davetkar bir hedef olacaktır.


4

Java (ve .Net) sanal makineleri, ayrılmış belleğin dışında yazmaya çalışan kodu yakalar. Bunu doğru bir şekilde işlemeyen uygulamalar yine de güvenlik sorunlarına neden olabilir. Kötü niyetli kullanıcılar, geçersiz girdi girerek istisnaları tetikleyebilirlerse, örneğin hizmet reddi saldırıları gerçekleştirebilirler.


3

Daha önce de belirtildiği gibi, Java, bir dil olarak, tüm bellek erişimini sınırlandırmıştır ve burada bir hata varsa, programda değil JVM'de hata vardır. Bununla birlikte, Java'daki bellek sızıntılarına benzer bir argüman olan not edilmelidir; yığını parçalamak mümkün olmasa da, yanlış yerde bulunan ve doğru şekilde işlenmeyen bir ArrayOutOfBoundsException, yine de sisteminizi bozabilir.


3

Java Native Interace (JNI) özelliğini harici kodu çağırmak için kullanıyorsanız ve harici kodda yararlanılabilir bir sorun varsa, bir Java programında bir arabellek taşmasına neden olabilirsiniz. Çoğu uygulama mümkün olduğunda JNI kullanmaktan kaçındığından, bu oldukça nadirdir.


3

Bir yöntemin, tipik olarak tamsayı taşması yoluyla, istemediği bir dizinin geçerli girdilerine yazması mümkündür.

Örneğin, sınırları kontrol etmek için aşağıdakiler yeterli değildir:

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

IIRC, bir StringBufferzamanlar böyle bir hatayla karşılaştı, ancak onunla yapabileceğiniz ilginç bir şey yoktu.


Ne olduğunu sınırlarını kontrol etmek için yeterli?
Broam

1
@Broam: 0 <= off && 0 <= len && off <= buff.length-lenSanırım. Benden alıntı yapma. Aynı görünüyor, ancak olası bir taşma yok (orijinalde off + len negatif gidebilir ve bu nedenle açıkça dizi uzunluğundan daha küçük olabilir). Hiçbir bakım programcısının onu bariz biçimde "düzenlemediğinden" emin olun. Tam sayı taşmasını büyük ölçüde kafa karıştırıcı buluyorum. Bir süre düşünmek zorundayım ve sonra yanlış anladığıma dair dırdırcı bir şüphe var. Ama elbette, başka bir gözden geçiren ve orijinal programcı olmalı - elbette birlikte bir hatanın üstesinden gelmenin bir yolu yok! (not)
Tom Hawtin - tackline

Buna biraz bakmak zorunda kaldım ama haklısın. off + len taşabilir ve sarabilir ... C'de. Java'da , yanılmıyorsam - bundan önce bir taşma istisnası alırsınız, değil mi?
Broam

1
Hayır. Tamsayı aritmetiği sessizce etrafını sarar. C # 'nin taşma üzerine bir istisnanın atıldığı bir "modu" vardır, ancak bunun çok kullanıldığını düşünmüyorum (eğer kullanmayı düşünüyorsanız, muhtemelen yine de doğru şeyleri yapmayı düşünürsünüz).
Tom Hawtin -

1

JAVA'nın temel özelliklerinden biri Güvenliktir. Yorumlanmış dillerde yazılan programlar arabellek taşması istismarına eğilimli değildir, ancak Yorumlayıcının kendisinde her zaman bir arabellek taşmasına neden olabilirsiniz. Zor olsa da. Benzer şekilde Python da yorumlanmış bir dildir ve arabellek taşmasına karşı güvenlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.