Giriş

Üçüncü taraf bir karakter aygıtı sürücüsünün ioctl handler’ında, kullanıcı arabelleği iki kez okunuyordu — klasik TOCTOU. Bu yazı açığı syzkaller ile nasıl tetiklediğimi anlatıyor.

Yarış penceresi

copy_from_user ile alınan uzunluk doğrulanıyor, ama ikinci copy_from_user aynı arabelleği tekrar okuyor. İki okuma arasında başka bir thread değeri değiştirirse sınır kontrolü atlanıyor.

if (copy_from_user(&len, arg, 4)) return -EFAULT;
if (len > MAX) return -EINVAL;
copy_from_user(buf, arg+4, len);  // len yeniden okunabilir

Reproduce

syzkaller’a özel bir tanımlayıcı (description) yazıp iki paralel ioctl çağrısı tarifledim; KASAN birkaç saniyede heap overflow raporladı.

Sonuç

Yama, uzunluğu tek sefer okuyup yerel değişkende tutmak. Bakımcıya bildirildi, mainline’a alındı.