Dva analytici z University of Valencia’s Cybersecurity research, Hector Marco a Ismael Ripoll, objevili v zavaděči Grub2 vážnou zranitelnost, která může být zneužita k překonání ochrany pomocí hesla a kompromitaci cílového počítače.
Není k tomu přitom potřeba žádný složitý postup: stačí 28krát stisknout klávesu backspace. Na některých linuxových distribucích tím zcela obejdete ochranu zavaděče heslem. V tu chvíli vám nic nebrání v předávání vlastních parametrů jádra nebo nastartování vlastního systému.
Grub2 je dnes jedním z nejpoužívanějších zavaděčů, rozhodně na platformě x86. Používá se ale i jinde, například na embedded zařízeních. Navíc nejen na Linuxu – například Solaris jej na x86 také pro zavádění používá.
Ve zveřejněném popisu chyby se píše, že po 28. stisku je překonána ochrana heslem a uživatel má plný přístup k „rescue shellu“ – příkazové řádce zavaděče. Konkrétně se problém týká verzí 1.98 (prosinec 2009) až 2.02 (prosinec 2015). Jde tedy o šest let starou chybu, která je rozšířena do mnoha distribucí.
Za problémem stojí chyba ve funkci grub_username_get
, která zaznamenává počet zapsaných znaků a při stisku backspace hodnotu odečítá. Chyba se objevila v commitu b391bdb2f2c5ccf29da66cecdbfb7566656a704d. Nekontroluje se totiž dolní mez proměnné, takže se hodnota snadno dostane do záporných čísel (integer underflow).
Pokud uživatel dále mačká klávesu backspace, přepisují se nulami proměnné umístěné v paměti před tou, která má být ve skutečnosti vynulována. Při správném počtu stisků (28) je přepsána návratová hodnota funkce grub_memset()
. To vede ke spuštění funkce grub_rescue_run()
a řádka je na světě.
Chybná funkce vypadá takto:
static int grub_username_get (char buf[], unsigned buf_size) { unsigned cur_len = 0; int key; while (1) { key = grub_getkey (); if (key == '\n' || key == '\r') break; if (key == '\e') { cur_len = 0; break; } if (key == '\b') # Does not checks underflows !! { cur_len--; # Integer underflow !! grub_printf ("\b"); continue; } if (!grub_isprint (key)) continue; if (cur_len + 2 < buf_size) { buf[cur_len++] = key; # Off-by-two !! grub_printf ("%c", key); } } grub_memset (buf + cur_len, 0, buf_size - cur_len); # Out of bounds overwrite grub_xputs ("\n"); grub_refresh (); return (key != '\e'); }
Útočník může tuto chybu zneužít a i přes ochranu hesla získat přístup k příkazové řádce, která mu umožní:
- Zvýšit oprávnění a plně ovládat zavaděč,
- načíst vlastní jádro a/nebo initramfs (třeba z USB) a pak si přečíst obsah disku nebo zavést rootkit,
- modifikovat nebo smazat data na discích, i když jsou šifrovaná. Je možné takto smazat i Grub samotný a počítač odstavit.
Vývojáři předvedli funkční postup pro vložení backdooru do nainstalovaného systému. Zveřejnili také opravu v podobě velmi krátkého patche. Řada distribucí už vydala opravnou verzi: Debian, Ubuntu, Red Hat a další. Doporučujeme co nejdříve aktualizovat.
(Zdroj: SecurityAffairs.co)