Linux 7.2 kernel: szigorúbb védelem a múltbeli lejárati idővel regisztrált timerek ellen

A Linux 7.2 kernel a timer-alrendszerben több belső változtatást vezet be, amelyek hibás vagy rosszindulatú felhasználói folyamatok ellen zárnak le eddig nyitva hagyott támadási felületeket. A legjelentősebb módosítás a HRTIMER mechanizmust érinti, mivel a kernel korábban nem ellenőrizte timer regisztrálásakor, hogy a megadott lejárati idő már a múltba esik-e. Ez a viselkedés jogosultság nélküli folyamatok számára is lehetővé tehette, hogy szolgáltatáskimaradást idézzenek elő.

Linux 7.2 kernel: szigorúbb védelem a múltbeli lejárati idővel regisztrált timerek ellen

Thomas Gleixner egy áprilisi patch-sorozatban írta le a hiba hátterét, miután egy felhasználó olyan esetről számolt be, ahol a CPU a felhasználói térben ragadt, majd az NMI watchdog lefagyást jelzett. Gleixner magyarázata szerint a múltbeli lejárati idővel bejegyzett timer az adott processzormaghoz tartozó hrtimer-nyilvántartásban a legközelebb esedékes elemként jelenhet meg. Emiatt a clockevent eszköz a lehető legkisebb késleltetési értékre áll be.

Gyors hardveren ez önfenntartó ciklust hozhat létre. A rendszer újra és újra minimális deltaértékre programozza az óraeszközt, de a tényleges megszakítás nem jut el a végrehajtásig. Emiatt a timer-megszakítás folyamatosan kiszorul a végrehajtásból, majd a lockup detector is riaszt, mivel a saját hrtimer-alapú visszahívása sem tud lefutni.

Gleixner szerint a patch-sorozat visszaportolásának pontos mértékéről még egyeztetni kell. Az első javítás, amely közvetlenül a lefagyást akadályozza meg, korábbi kernelverziókba is átültethető. A patch sorozat többi része vitathatóbb, de Gleixner ezek visszaportolása mellett érvel, mert megakadályozzák, hogy hibás vagy szándékosan rosszindulatú felhasználói programok indokolatlanul sok timer-megszakítást kényszerítsenek ki.

A timer-alrendszerben egy másik, régóta jelen lévő hiba is megszűnik. A POSIX CPU timerek kódjában PID-referenciaszám-szivárgást azonosítottak, amely egy hibakezelési útvonalon jelentkezett. A hiba egészen a Linux 2.6.12-es kiadásáig vezethető vissza, vagyis több mint húsz évig maradt a kernelben, mielőtt a fejlesztők azonosították és javították.

A Linux 7.2 timer alrendszerhez kapcsolódó módosításai már bekerültek a kernel Git-fájába, részletes leírás a kapcsolódó pull requestben olvasható.