Hlavní navigace

Heslo v Grub2 lze obejít: stačí stisknout 28× backspace

Petr Krčmář 17. 12. 2015

Bezpečnostní analytici Hector Marco a Ismael Ripoll objevili vážnou bezpečnostní chybu v Grub2, který je nejrozšířenějším zavaděčem linuxových distribucí. Může být chráněn heslem, ale tuto ochranu je možné velmi snadno obejít, není k tomu třeba nic speciálního: stačí stisknout 28× po sobě klávesu backspace.

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)

Našli jste v článku chybu?

17. 12. 2015 18:19

F00B4r (neregistrovaný)

Zrovna GRUB jakožto bootloader je relativně low-level záležitost, zde si myslím je jazyk C na místě.

Hmm... koukám, že nejsem jediný, kdo zrovna GRUB napsaný v Javě nebo Pythonu si nedokáže dost dobře představit.

Lze však souhlasit s tím, že na aplikační programování je rozumné používat vyšší programovací jazyky, kde již některé elementární věci pořešené.
Nicméně chybám to nezabrání. Ošetřit vstup od uživatele je skoro nutnost.

Trochu přeneseně se dá říci, že s Céčkem je to asi jak s ostrými …


17. 12. 2015 14:48

trubicoid2 (neregistrovaný)

postavili pivo na backspace :)

Vitalia.cz: Jak koupit Mikuláše a nenaletět

Jak koupit Mikuláše a nenaletět

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: I církev dnes vyrábí potraviny

I církev dnes vyrábí potraviny

DigiZone.cz: Další dva kanály nabídnou HbbTV

Další dva kanály nabídnou HbbTV

Podnikatel.cz: Platební brány a EET? Stále s otazníkem

Platební brány a EET? Stále s otazníkem

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu