V utilitě wall, dodávané v balíčku util-linux, která slouží k odesílání zpráv na terminály, byla nalezena zranitelnost (CVE-2024-28085), která umožňuje provést útok na terminály jiných uživatelů prostřednictvím manipulace s escape sekvencemi. Problém vzniká, protože utilita wall blokuje používání escape sekvencí ve vstupním proudu, ale neprovádí tento krok pro argumenty v příkazovém řádku, což útočníkovi umožňuje provést escape sekvence v terminálu jiných uživatelů.
Například provedením ‘wall $(printf "\033[33mHI")’ lze zobrazit nápis „HI“ žlutou barvou. Pomocí escape sekvencí, které umožňují přesouvat kurzor, čistit a nahrazovat obsah na obrazovce, lze simulovat zobrazení výzvy k zadání hesla od utility sudo v terminálu jiného uživatele. Pokud si uživatel nevšimne podvodu a zadá své heslo, heslo se objeví v historii zadávání jako neexistující příkaz (v podstatě uživatel místo příkazu zadá své heslo do příkazového řádku). "\033[3A" // přesuneme kurzor nahoru o 3 řádky "\033[K" // odstraníme předchozí výstup "[sudo] heslo pro a_user:" // vypíšeme fiktivní dotaz sudo "\033[?25l" // nastavíme pozadí pro skrytí vstupu "\033[38;2;48;10;36m"
Při zobrazování varování, že zadaný příkaz nebyl nalezen, se ve mnoha distribucích spouští zpracovatel /usr/lib/command-not-found, který se pokouší určit balík, ve kterém chybějící příkaz existuje, a poskytnout nápovědu o možnosti jeho instalace. Problém je v tom, že při spuštění zpracovatele command-not-found je neexistující příkaz předáván jako parametrem příkazového řádku, který je viditelný při prohlížení procesů v systému (například při pokusu o spuštění neinstalované utility „xsnow“ bude v seznamu procesů vidět „/usr/lib/command-not-found -- xsnow“). Útočník tedy může organizovat monitorování spuštěných procesů (například analýzou výskytu „/proc/$pid/cmdline“ pro předpokládané číslo PID) a zjistit heslo, které oběť zadala do příkazového řádku.
Aby uživatel zadal heslo jako odpověď na falešný výzvu sudo, byl navržen trik spočívající v monitorování skutečného spuštění utility sudo v seznamu procesů, čekání na její dokončení a provedení útoku pomocí „wall“ ihned poté. Pomocí manipulace s escape sekvencemi může útočník nahradit zprávu po skutečném provedení sudo falešným výzvou k opětovnému zadání hesla. Oběť si může myslet, že se při zadávání dopustila chyby a heslo zadá podruhé, čímž odhalí heslo v argumentech zpracovatele „command-not-found“.
K úspěšnému útoku je třeba nastavit režim „mesg“ na hodnotu „y“, což je ve výchozím nastavení v Ubuntu, Debianu a CentOS/RHEL. Možnost provést útok byla demonstrována v Ubuntu 22.04 ve výchozí konfiguraci při použití gnome-terminal. V Debianu je útok ztížen, protože ve výchozím nastavení není zahrnut zpracovatel „command-not-found“, a v CentOS/RHEL útok nebude fungovat, protože utilita wall je nainstalována bez příznaku setgid a nemá přístup k cizím terminálům. Při použití windows-terminal může být útok modifikován pro změnu obsahu schránky.
Zranitelnost se projevuje v balíčku util-linux od roku 2013, poté co do verze 2.24 přidali možnost specifikovat zprávu v příkazovém řádku wall, ale zapomněli použít čištění escape sekvencí. Oprava zranitelnosti byla zahrnuta ve včerejší verzi util-linux 2.40. Zajímavé je, že při pokusu o opravu zranitelnosti ve verzi util-linux 2.39 byla odhalena další podobná zranitelnost, která umožňuje substituci řídicích znaků manipulací s lokalizacemi.
Zdroj: opennet.ru
