Kontrolsüz biçim dizesi - Uncontrolled format string

Kontrolsüz biçim dizisi , 1989'da keşfedilen ve güvenlik açıklarında kullanılabilecek bir tür yazılım güvenlik açığıdır . Başlangıçta zararsız olduğu düşünülen biçim dizisi istismarları, bir programı çökertmek veya zararlı kod yürütmek için kullanılabilir . gibi biçimlendirme gerçekleştiren belirli C işlevlerinde biçim dizesi parametresi olarak denetlenmeyen kullanıcı girdisinin kullanılmasından kaynaklanır . Kötü niyetli bir kullanıcı , çağrı yığınından veya muhtemelen bellekteki diğer konumlardan veri yazdırmak için diğerlerinin yanı sıra ve biçim belirteçlerini kullanabilir . Ayrıca , yığında depolanan bir adrese biçimlendirilmiş bayt sayısını yazmak için komutlar ve benzer işlevler sağlayan biçim belirtecini kullanarak rasgele konumlara rasgele veriler yazılabilir. printf()%s%x%nprintf()

Detaylar

Tipik bir istismar , bir işlemin talimat işaretçisinin (IP) kontrolünü ele geçirmek için bu tekniklerin bir kombinasyonunu kullanır ; örneğin, bir programı bir kitaplık işlevinin adresinin veya yığındaki dönüş adresinin bir işaretçi ile bazı kötü amaçlı yazılımlara işaretçisinin üzerine yazmaya zorlayarak. kabuk kodu . Biçim belirteçlerini biçimlendirmek için doldurma parametreleri, çıktı bayt sayısını kontrol etmek için kullanılır ve %xbelirteç, biçim dizesinin başına ulaşılana kadar yığından baytları çıkarmak için kullanılır. Biçim dizesinin başlangıcı, %nbiçim belirtecinin yürütülecek kötü amaçlı kodun adresiyle üzerine yazabileceği adresi içerecek şekilde hazırlanmıştır .

Bu yaygın bir güvenlik açığıdır, çünkü biçim hatalarının önceden zararsız olduğu düşünülür ve birçok yaygın araçta güvenlik açıklarına neden olur. MITRE'nin CVE projesi, Haziran 2007 itibariyle yaklaşık 500 savunmasız programı listeliyor ve bir eğilim analizi, onu 2001 ile 2006 arasında en çok rapor edilen 9. güvenlik açığı türü olarak sıralıyor.

Biçim dizisi hataları, en yaygın olarak, bir programcı, kullanıcı tarafından sağlanan verileri (bir dosyaya, arabelleğe veya kullanıcıya) içeren bir dize çıktısı almak istediğinde ortaya çıkar. Programcı yanlışlıkla printf(buffer)yerine yazabilir printf("%s", buffer). İlk sürüm buffer, bir biçim dizesi olarak yorumlanır ve içerebileceği tüm biçimlendirme yönergelerini ayrıştırır. İkinci sürüm, programcının amaçladığı gibi ekrana bir dize yazdırır. Her iki sürüm de, dizgede biçim belirteçlerinin yokluğunda aynı şekilde davranır, bu da hatanın geliştirici tarafından fark edilmemesini kolaylaştırır.

Biçim hataları, C'nin bağımsız değişken geçirme kuralları tür açısından güvenli olmadığı için ortaya çıkar . Özellikle, varargsmekanizma verir fonksiyonları argüman (örneğin herhangi bir sayıda kabul etmeye printfpek olarak "haşhaş" tarafından) argümanlar kapalı çağrı yığını attı edilecek kaç ek argümanlar göstermek için erken argümanları güvenerek istedikleri gibi ve ne türleri .

Biçim dizisi hataları, Perl gibi C'nin yanı sıra diğer programlama dillerinde de ortaya çıkabilir, ancak daha az sıklıkta görünürler ve genellikle saldırganın tercih ettiği kodu yürütmek için kullanılamazlar.

Tarih

Biçim hataları ilk olarak 1989'da Wisconsin Üniversitesi'nde yapılan ve C kabuğunda (csh) komut geçmişi mekanizması ile güvenli dize girdisini varsayan bir hata rutini arasında bir "etkileşim etkisi" keşfeden tüy testi çalışmasıyla fark edildi .

Bir şekilde biçim dizesi böcek kullanımı saldırı vektörü tarafından Eylül 1999 yılında keşfedildi Tymm Twillman bir sırasında güvenlik denetim arasında Proftpd cini. Denetim snprintf, bir biçim dizesi olmadan kullanıcı tarafından oluşturulan verileri doğrudan ileten bir veriyi ortaya çıkardı . printf tarzı işlevlere yönelik uydurma argümanlar içeren kapsamlı testler, bunun ayrıcalık yükseltme için kullanılmasının mümkün olduğunu gösterdi. Bu, Eylül 1999'da Bugtraq posta listesinde, temel bir istismar da dahil olmak üzere bu güvenlik açıkları sınıfına ilişkin ilk gönderiye yol açtı . Bununla birlikte, güvenlik topluluğu, bu yöntemi kullanan diğer yazılımlar için istismarlar ortaya çıkmaya başladıkça, biçim dizisi güvenlik açıklarının tüm tehlikelerinin farkına varmadan önce hala birkaç ay geçti. Sorunu ortak bilince çıkaran ilk istismarlar (kod yürütme yoluyla uzaktan kök erişimi sağlayarak), Haziran 2000'de Przemysław Frasunek ve tf8 takma adını kullanan bir kişi tarafından Bugtraq listesinde eşzamanlı olarak yayınlandı . Bunları kısa bir süre sonra, lamagra takma adını kullanan bir kişi tarafından yayınlanan bir açıklama izledi . "Biçim hataları", Temmuz 2000'de Pascal Bouchareine tarafından Bugtraq listesine gönderildi. Tim Newsham'ın çığır açan "Biçim Dizisi Saldırıları" başlıklı makalesi Eylül 2000'de yayınlandı ve Eylül 2001'de, Biçim Dizisi Güvenlik Açıklarından Yararlanma gibi diğer ayrıntılı teknik açıklama belgeleri yayınlandı. , takım Teso tarafından .

Derleyicilerde önleme

Birçok derleyici, biçim dizelerini statik olarak kontrol edebilir ve tehlikeli veya şüpheli biçimler için uyarılar üretebilir. In GNU derleyicisi , ilgili derleyici bayrakları, -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, ve -Wformat=2.

Bunların çoğu, yalnızca derleme zamanında bilinen hatalı biçim dizelerini algılamak için kullanışlıdır. Biçim dizgisi kullanıcıdan veya uygulamanın dışındaki bir kaynaktan geliyorsa, uygulama onu kullanmadan önce biçim dizgisini doğrulamalıdır. Uygulamanın anında biçim dizeleri oluşturması veya seçmesi durumunda da dikkatli olunmalıdır. GNU C kitaplığı kullanılıyorsa, -D_FORTIFY_SOURCE=2parametre, çalışma zamanında meydana gelen belirli saldırı türlerini tespit etmek için kullanılabilir. -Wformat-nonliteralÇek daha sıkı olduğunu.

Tespit etme

Diğer birçok güvenlik sorununun aksine, x86 ile derlenmiş yürütülebilir dosyalarda biçim dizesi güvenlik açıklarının temel nedenini saptamak nispeten kolaydır: printf-aile işlevleri için, doğru kullanım, biçim dizesi ve biçimlendirilecek bağımsız değişkenler için ayrı bir bağımsız değişken anlamına gelir. Bu tür işlevlerin hatalı kullanımları, yalnızca işleve iletilen argümanların sayısı sayılarak tespit edilebilir; bir 'argüman eksikliği', işlevin kötüye kullanıldığının güçlü bir göstergesidir.

x86 ile derlenmiş ikili dosyalarda algılama

Argümanların sayısını saymak, çağıranın çağrıdan sonra yığın işaretçisine ekleyerek yığına itilen argümanları kaldırdığı bir çağrı kuralı nedeniyle x86'da genellikle kolaylaşır, bu nedenle yığın düzeltmesinin basit bir incelemesi, sayıyı verir. printf-aile işlevine iletilen bağımsız değişkenler .'

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar