Společnost Qualys zjistila nebezpečnou zranitelnost (CVE-2023-6246) ve standardní C knihovně Glibc, která umožňuje provádět kód s vyššími oprávněními pomocí manipulací s pokyny pro spouštění SUID aplikací. Výzkumníci dokázali vyvinout funkční exploit, který umožňuje získat práva root prostřednictvím manipulace s argumenty příkazového řádku při spouštění utilitky su.
Zranitelnost je způsobena přetečením bufferu ve funkci __vsyslog_internal(), která se používá při volání funkcí syslog() a vsyslog(). Problém nastává z důvodu chyby při pokusu o výstup příliš dlouhého jména aplikace přes makro SYSLOG_HEADER. Při pokusu o rozšíření bufferu s ohledem na dlouhé jméno dojde k havárii, po níž se data zapisují do starého bufferu původně menší velikosti.
Při útoku prostřednictvím utilitky su může útočník změnit název procesu při spouštění aplikace tím, že upraví hodnotu argv[0], která se používá k získání informací o názvu programu při výstupu do logu, a dosáhnout tak kontrolovaného přepsání dat mimo vyhrazený buffer. Následné přetečení lze využít k přepsání struktury nss_module v knihovně nss pro vytvoření sdílené knihovny, která bude nahrána s právy root.
Problém se projevuje od vydání glibc 2.37, publikovaného v srpnu 2022 a zahrnujícího změnu, která řeší situaci s pokusy o zápis příliš velkých zpráv. Oprava, která vnášela zranitelnost, byla zpětně portována do větve glibc 2.36 a do balíčků distribucí se staršími verzemi glibc, protože uvedená oprava eliminovala zranitelnost CVE-2022-39046, vedoucí k úniku dat z haldy. Tak se stalo, že oprava nebezpečné zranitelnosti vedla k vzniku kritického problému. Je pozoruhodné, že podobná zranitelnost ve funkci vsyslog() obsažené v knihovně libc 5.4.3 byla reportována již v roce 1997.
Potvrzení o zranitelnosti bylo nalezeno v Debianu 12/13, Ubuntu 23.04/23.10 a Fedoře 37-39. Fungování exploitů pro získání práv root neprivilegovaným uživatelem bylo demonstrováno v plně aktualizovaném prostředí Fedory 38 se všemi výchozími ochrannými mechanismy aktivovanými v konfiguraci. Zranitelnost může být exploitována pouze lokálně, neboť vyžaduje přenos více než 1024 bajtů přes parametr argv[0] nebo argument ident ve funkci openlog().
Oprava zranitelnosti byla zahrnuta do kódu Glibc před několika hodinami a bude součástí zítřejší aktualizace Glibc 2.39, spolu s opravou dalších dvou zranitelností (CVE-2023-6779, CVE-2023-6780), které se také týkají kódu __vsyslog_internal() a vedou k přetečení bufferu. Navíc, společnost Qualys varovala před zjištěním přetečení bufferu v implementaci funkce qsort(), která nebyla vývojáři Glibc klasifikována jako zranitelnost, neboť exploitace předpokládá použití atypické funkce porovnávání vracením rozdílu porovnávaných parametrů jako argumentu při volání qsort.
Stav odstranění zranitelností v distribucích lze posoudit na těchto stránkách: Debian, Ubuntu, SUSE, RHEL, Fedora, Arch Linux, Gentoo, Slackware. Zranitelnost systému lze otestovat následujícím příkazem: $ (exec -a "`printf ‘28000x’ 1`" /usr/bin/su < /dev/null)
Zdroj: opennet.ru
