Java'da arabellek taşmaları var mı? Cevabınız evet ise bana senaryolar verebilir misiniz?
Java'da arabellek taşmaları var mı? Cevabınız evet ise bana senaryolar verebilir misiniz?
Yanıtlar:
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:
Java ve C # gibi yönetilen dillerde bu sorunlar yoktur, ancak kodu gerçekten çalıştıran belirli sanal makineler (JVM / CLR / vb.) Olabilir.
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 ArrayOutOfBounds
istisna 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.
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.
Yığının veya yığının kendisinin üzerine yazma anlamında bir arabellek taşması şunlardan birini gerektirir:
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.
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.
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.
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.
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 StringBuffer
zamanlar böyle bir hatayla karşılaştı, ancak onunla yapabileceğiniz ilginç bir şey yoktu.
0 <= off && 0 <= len && off <= buff.length-len
Sanı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)
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.