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.