Biçim Dizesi Güvenlik Açıkları
printf biçim dizelerini istismar ederek rastgele belleği okuyun ve rastgele adreslere yazın.
Biçim Dizesi Güvenlik Açıkları, CoddyKit'te ücretsiz bir Cyber Security Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Cyber Security Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Cyber Security Academy kursu toplamda 4 dersten oluşur.
Biçim Dizesi Güvenlik Açığı Nedir?
Biçim dizesi güvenlik açığı, kullanıcı girdisi doğrudan printf() veya benzer işlevlere biçim dizesi bağımsız değişkeni olarak geçirildiğinde ortaya çıkar. Saldırgan bellek okuyabilir, yığın adreslerini sızdırabilir ve istenen değerleri yazabilir.
Güvenlik Açığı İçeren Örüntü
Güvenlik açığı içeren ve güvenli kullanım:
// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);
// SAFE - user input is a data argument:
printf("%s", user_input);%x ve %p ile Bellek Okuma
Karşılık gelen bağımsız değişkenleri olmayan biçim belirleyicileri, yığından değerler okur:
# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!Biçim Dizesi Sızıntılarıyla ASLR'yi Aşma
Yığın genellikle libc'ye, yığına ve ikili dosyaya işaretçiler içerir. Saldırgan, bunları %p veya %lx belirleyicileriyle sızdırarak taban adreslerini hesaplayabilir ve başka bir güvenlik açığı olmadan bile ASLR'yi etkisiz kılabilir.
%s ile İstenen Belleği Okuma
%s, yığın değerini bir işaretçi olarak ele alır ve bu adresteki dizeyi yazdırır. Hedef adresi yığındaki doğru konuma yerleştirip parametre erişimini (%7$s) kullanarak saldırgan, istediği bellek konumlarını okuyabilir.
# Direct parameter access:
printf("%7$s") # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory%n ile Bellek Yazma
%n, o ana kadar yazdırılan karakter sayısını karşılık gelen bağımsız değişkenin gösterdiği adrese yazar. Bu, istenen değerlerin istenen adreslere yazılmasını sağlar ve potansiyel olarak işlev işaretçilerinin veya dönüş adreslerinin üzerine yazılmasına yol açar.
Uygulamalı Yazma Tekniği
%n kullanarak belirli bir değer yazmak için:
- Yığında hedef adresi gösteren bir işaretçiyi denetleyin
%Xc%N$nkullanarak X karakter yazın, ardından sayıyı N'inci parametreye (hedef adrese) yazın
pwntools gibi araçlar, biçim dizesi istismarının oluşturulmasını otomatikleştirir.
Biçim Dizesi Hatalarını Bulma
Biçim dizesi güvenlik açıklarını sınama:
# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)
# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vulnSavunma: Kodu Düzeltme
Çözüm son derece basittir: kullanıcı girdisini her zaman veri bağımsız değişkeni olarak geçirin; asla biçim dizesi olarak geçirmeyin.
// WRONG:
printf(buffer);
// RIGHT:
printf("%s", buffer);
// Compiler warning:
// gcc -Wformat-security will flag thisDiğer Dillerde Biçim Dizeleri
Biçim dizesi güvenlik açıkları birçok dilde ortaya çıkar:
- C:
printf(input) - Python: aynı değildir — ancak sözlük girdisiyle yapılan
%biçimlendirmesi değişkenleri açığa çıkarabilir - Java:
String.format(input)— daha az tehlikelidir, belleğe erişim sağlamaz
Gerçek Dünya Örnekleri
Biçim dizesi hataları şu yazılımları etkilemiştir:
- ProFTPD — FTP komutları üzerinden uzaktan kod çalıştırmayı etkinleştirdi
- WU-FTPD — biçim dizeleri aracılığıyla uzaktan kök kullanıcı istismarına olanak sağladı
- 2000 öncesindeki çeşitli Linux artalan hizmetleri
Modern derleyiciler ve FORTIFY_SOURCE yardımcı olur, ancak bu güvenlik açığı sınıfını tamamen ortadan kaldırmaz.
Hızlı Kontrol: Biçim Dizeleri
Biçim dizesi saldırısında istenen bir bellek adresine yazmak için hangi biçim belirleyicisi kullanılabilir?
Ders Özeti
Biçim dizesi güvenlik açıkları, kullanıcı girdisi doğrudan bir printf biçim dizesi olarak kullanıldığında ortaya çıkar. %p/%x, yığın belleğini sızdırır; %s, istenen adresleri okur; %n, istenen adreslere yazar. Çözüm tek bir karakterdir: printf("%s", input). Bu hataları yakalamak için derleyici seçeneklerinde -Wformat-security seçeneğini etkinleştirin.
Sıkça Sorulan Sorular
“Biçim Dizesi Güvenlik Açıkları” dersi ücretsiz mi?
Evet — “Biçim Dizesi Güvenlik Açıkları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Cyber Security Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Cyber Security Academy kursu toplamda 4 dersten oluşur.
“Biçim Dizesi Güvenlik Açıkları” dersinde ne öğreneceğim?
printf biçim dizelerini istismar ederek rastgele belleği okuyun ve rastgele adreslere yazın. Cyber Security Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Cyber Security Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Cyber Security Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Biçim Dizesi Güvenlik Açıkları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Cyber Security Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Cyber Security Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yığın Tamponu Taşmaları
- Return-Oriented Programming (ROP)
- Biçim Dizesi Güvenlik Açıkları
- Heap İstismarı: Use-After-Free ve Heap Spraying