· kaynak Hacker News – Front Page (native)
21 baytlık hazırlanmış .vpk dosyası, VPK demuxer'daki sıfıra bölme yoluyla FFmpeg uygulamalarını çökertiyor
FFmpeg'in hata takip sisteminde yayınlanan bir rapor, PS2 VPK ses demuxer'ındaki deterministik bir çöküşü anlatıyor: kanal sayısı sıfır olan 21 baytlık bir dosya, tamsayı sıfıra bölme hatası tetikleyerek güvenilmeyen medya dosyalarını açan her uygulamayı sonlandırıyor.
Ne oldu
Hacker News'in ön sayfasına yükselen, FFmpeg'in resmî hata takip sisteminde yayınlanan bir rapor, Sony PlayStation 2 VPK ses dosyalarını işleyen demuxer'daki bir tamsayı sıfıra bölme hatasını belgeliyor. Rapora göre, hazırlanmış 21 baytlık bir girdi, kötü niyetli bir .vpk dosyasını ya da akışını açan FFmpeg tabanlı herhangi bir uygulamayı çökertiyor. Raporu yazan kişi önem derecesini orta olarak değerlendiriyor: hata güvenilir bir hizmet dışı bırakma (denial of service) nedeni, kod çalıştırmanın önündeki bir basamak değil.
Sorun nerede ortaya çıkıyor
Sorun libavformat/vpk.c dosyasındaki vpk_read_packet fonksiyonunun içinde. Demuxer bir akışın son bloğuna ulaştığında bir blok boyutu ve bir atlama değeri hesaplıyor ve her iki hesaplamada da akışın kanal sayısına, yani par->ch_layout.nb_channels değerine bölme yapılıyor. Bu sayı sıfırsa, CPU bir aritmetik istisna olan SIGFPE sinyali yükseltiyor ve süreç anında sonlanıyor.
İşin ilginç tarafı, FFmpeg'in bu alanı zaten doğrulaması. Başlık ayrıştırıcısı olan vpk_read_header, kanal sayısı sıfır ya da negatif olan akışları reddediyor. Ancak hatayı bulan fuzzer, FFmpeg'i özel bir I/O katmanı üzerinden çalıştırıyor ve rapora göre probing sırasında ve başlık ayrıştırma sırasında görünen veri, daha sonra okunan veriden farklı olabiliyor. Paket okuma başladığında kanal sayısı sıfıra dönmüş durumda; son blok boyutu ve blok sayısı ise geçerli bir kanal düzeni içeren önceki veriden hesaplanmış. Dolayısıyla mevcut kontrol, paket okuma yolunu hiçbir zaman korumuyor.
Girdi ve izlediği yol
Çökme dosyası 21 bayt uzunluğunda ve VPK magic baytlarıyla başlıyor; bu yüzden format otomatik algılama, bir uygulama avformat_open_input çağırdığı anda dosyayı VPK demuxer'ına yönlendiriyor. Hata ayıklayıcı, vpk.c:89 satırındaki SIGFPE'yi gösteriyor; yığın (stack), ff_read_packet, read_frame_internal ve av_read_frame üzerinden geçiyor; bunlar neredeyse her FFmpeg kullanıcısının bel bağladığı standart okuma API'si. Dosyayı açmak dışında bir etkileşim gerekmiyor.
Raporu yazan kişi, dosyanın başlıktaki 0x0e ile 0x11 ofsetleri arasına sıfır kanal sayısı yerleştirdiğini söylüyor; ancak raporda yer alan hex dökümünde bu konumlarda görünür bir sıfır yok, bu da raporun kendisinin anlattığı başlık-okuma uyuşmazlığıyla tutarlı bir tuhaflık.
Hatayı, raporu yazan kişinin kendi fuzzer'ı bulmuş ve araç GitHub'da yayınlanmış; raporun başlığı aracı vibecoded olarak nitelendiriyor, yani ağır yapay zekâ desteğiyle geliştirildiği anlamına geliyor. Çökmenin ortaya çıkması yaklaşık 495.000 çalıştırma, yaklaşık 13.000 girdilik bir corpus ve on bir saatin altında bir fuzzing süresi almış.
Sömürülebilirlik ve önerilen düzeltme
Raporun değerlendirmesi net: çökme deterministik, tetikleyici yüzeysel ve girdi kendi kendine yeterli olduğundan hiçbir ön koşul yok. Ama aynı zamanda salt bir çökme. Burada sınır dışı erişim, use-after-free, null dereference ya da kontrollü yazma yok; bu nedenle pratik etki yalnızca hizmet kesintisiyle sınırlı.
Önerilen düzeltme, vpk_read_packet'ın en başına, kanal sayısı sıfırken FFmpeg'in standart geçersiz veri hatasını döndüren bir koruma eklemek; böylece başlık ayrıştırıcısında zaten mevcut olan doğrulama örneklenmiş oluyor. Raporda ayrıca 21 baytlık girdiyi demuxer'a veren ve sinyal değil temiz bir hata dönüşü bekleyen bir regresyon testi de var. Rapor, bir yamanın henüz upstream'e girip girmediğini belirtmiyor.
Neden önemli
FFmpeg sayısız medya oynatıcının, transcoder'ın, önizleme görseli üreticisinin ve bulut medya hattının içinde yer alıyor ve avformat_open_input üzerinden güvenilmeyen yüklemeleri açan tümü, 21 baytlık bir payload ile hedeflenebilir durumda. Bu hata ayrıca medya ayrıştırma kodlarındaki ince bir başarısızlık örneğini gözler önüne seriyor: bir alanı yalnızca başlık okunurken bir kez doğrulamak, sonraki aşamalar aynı kaynaktan yeniden okuma yaptığında yeterli değil; dolayısıyla türetilmiş değerlerin kullanım noktasında güvenilmez olarak ele alınması gerekiyor. Son olarak, yapay zekâ destekli bir yan proje fuzzer'ın, var olan en yoğun denetlenen C kod tabanlarından birinde gerçek bir kusur ortaya çıkarması, güvenlik araştırmasına giriş engelinin ne kadar düştüğü hakkında çok şey söylüyor.
- #ffmpeg
- #security
- #fuzzing
- #denial-of-service
- #open-source