Format String Hataları
Bu bölümde en masum görünen fonksiyonların ne denli sorunlara yol açabileceğinin güzel bir kaç örneğine yer vereceğiz.
Aşağıdaki örnek kod, TortoiseSVN uygulamasından alınmıştır:
BOOL CPOFile::ParseFile(....)
{
....
printf(File.getloc().name().c_str());
....
}
Pek çok yazılımda standart çıktı aygıtına veya dosyaya bir şeyler yazdırılmak istendiğinde, aşağıdaki gibi kullanımlara yer verildiği görülmektedir:
printf(str);
...
fprintf(file, str);
Bu kullanım şeklinde str
değişkeni, uygulamanın daha önceki aşamalarında ayarlanmış şekilde bir karakter dizisini işaret etmektedir.
Normal şartlar altında sorun çıkarmayan bu masum kod parçacığı, str
içeriği Test%s%d%sTest%p%s
şeklinde olduğunda programınızın davranışı nasıl olacaktır?
Aynı mantıkla hareketle, ilk örneğimizde dosya adında %s
gibi printf
ailesi tarafından işlenen format string değerleri bulunması halinde, uygulamamız ekrana tuhaf karakterler basacak veya bazı durumlarda da çökecektir.
Bu gibi hataların önüne geçmek için, string bir alan olduğunu bilseniz dahi, format string parametrelerini ayrıca belirtmelisiniz. Bu durumda ilk örneğimiz için doğru kullanım şu şekilde olacaktır:
printf("%s", File.getloc().name().c_str());
Daha Tehlikeli Hatalar
Buraya kadar bahsettiğimiz format string hataları, en fazla uygulamamızın çökmesine yol açıyordu. Ancak bundan daha fazlası da var. Dikkatli bir şekilde atak edildiğinde uygulamanın sonlanması yerine, örneğin bir parola kontrolünün devre dışı bırakılması söz konusu olabilir. Şimdi bu konuyu örneklemeye çalışalım.