Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Bezpečnost

Falešné jméno uživatele v SSH podstrčí nástroji fail2ban cizí IP adresu

Fail2ban čte záznamy OpenSSH a adresu, která v nich opakovaně selhává, zapíše do firewallu. Jeho filtr pro sshd ale připouštěl za adresou přívěsek on a slovo za ním, a protože sshd zapisuje nabídnuté jméno uživatele tak, jak přišlo, stačilo se o přihlášení pokusit pod jménem x 198.51.100.77 on. Nástroj pak za zdroj útoku považoval adresu 198.51.100.77.

· 112 zhlédnutí

Nástroj fail2ban dělá na serverech jednu věc. Čte záznamy služeb, počítá neúspěšné pokusy o přihlášení a adresu, která jich nasbírá dost, zapíše do pravidel firewallu. Co je neúspěšný pokus a kde v řádku stojí adresa, určují filtry – textové soubory s regulárními výrazy, jeden na každou službu.

Filtr pro OpenSSH dostal 13. října 2026 vlastní číslo zranitelnosti, CVE-2026-109786. Záznam ho popisuje stručně: útočník dokáže připsat svoje neúspěšné pokusy cizí adrese a nechat zablokovat ji.

Technik u otevřeného rozvaděče se síťovými prvky
Technik u rozvaděče se síťovými prvky. Foto: Bill Branson, Wikimedia Commons (volné dílo)

Mezera ve jménu uživatele projde do záznamu

Když se někdo pokusí přihlásit pod jménem, které na serveru není, uloží si sshd to jméno do popisku spojení a postaví ho před adresu klienta. Ve zdrojovém kódu OpenSSH jsou to dvě místa: auth2.c složí popisek jako invalid user <jméno> a packet.c za něj doplní adresu a port. Jméno se přitom do záznamu dostane skoro bez úprav: log.c před zápisem ošetří netisknutelné znaky, konce řádků a tabulátory, mezeru ale ne – ve výčtu příznaků, se kterými volá strnvis, chybí ten pro mezeru.

Řádek v záznamu pak vypadá takhle. Skutečný útočník je 203.0.113.9, adresa 198.51.100.77 je kus jména, pod kterým se přihlašoval:

Connection closed by invalid user x 198.51.100.77 on 203.0.113.9 port 4444 [preauth]

Filtr si z řádku vybral špatnou adresu

Ve filtru sshd.conf stály dvě pomocné proměnné, které popisují, co smí za adresou následovat. Obě vedle port 4444 a [preauth] připouštěly i slovo on a libovolný text za ním. Výraz si proto mohl vzít jako adresu 198.51.100.77 a zbytek řádku odbýt jako příponu.

Oprava, commit ddd879d z 8. října, obě proměnné zúžila:

__on_port_opt = (?: port \d+)?
__suff = %(__on_port_opt)s(?: \[preauth\])?\s*

Je to přesně to znění, které ve filtru dodávaném s verzí 1.1.1 stojí o kousek výš zakomentované jako starší varianta. Ke commitu přibyl do testovací sady obdobný řádek, ve kterém je podvržená adresa 192.0.2.1 a skutečná adresa klienta 192.0.2.77; test po filtru žádá, aby za adresu označil tu druhou a zbytek si přečetl jako jméno x 192.0.2.1 on. Autor opravy v popisu commitu mluví o dalším pokusu podstrčit údaj přes jméno uživatele, anglicky further attempt to inject on username.

Co to dělá za škodu

Nic to neotevře. Stupnice CVSS 3.1 dává 5,3 bodu a ve vektoru je jediný nenulový dopad dostupnost, a to na nízkém stupni: zranitelnost nikomu nedává přístup, jen ho může vzít někomu jinému. Záznam CVE uvádí jako dotčené verze fail2ban od 0.10.5 po 1.1.1 včetně a dodává, že se to týká výchozího režimu filtru. Databáze oznámení GitHubu vede věc pod GHSA-xw36-3g63-5wfw a řadí ji do třídy CWE-117, tedy neošetřený cizí vstup v záznamech.

Jestli po podvrženém řádku opravdu přijde blokace, rozhoduje nastavení vězení. Dodávaný jail.conf verze 1.1.1 má ve výchozím nastavení pět pokusů za deset minut a blokaci na deset minut; řádek ignoreip, kterým se adresy z blokování vyjímají, je v něm zakomentovaný. Nálezce popisuje u sebe tvrdší poměr, tři pokusy za deset minut a blokaci na čtrnáct dní, ale to je jeho konfigurace, ne výchozí stav.

Oprava v repozitáři je, ve vydání ne

Poslední vydání fail2ban je 1.1.1 z 15. srpna 2026, tedy skoro dva měsíce před opravou. V souboru změn pro rozpracovanou 1.1.2 zásah do filtru sshd uvedený není; oddíl jmenuje opravy filtrů pro nginx a Apache, zacházení se sokety od systemd a výchozí akce v souborech paths-*.conf. Databáze Debianu měla 13. října záznam o zranitelnosti založený, ale bez posouzení, kterých balíků se týká.

Nálezce si poradil sám. Jeho repozitář mail-hardening, ze kterého hlášení vzešlo, obsahuje soubor sshd.local přepisující obě proměnné na užší tvar, tedy na totéž, co o pár dní později udělal i sám projekt. Poznámka v tom souboru tvrdí, že OpenSSH v hlášeních o přihlašování slovo on s adresou nikdy nepíše, takže zúžení nic nestojí. V dnešních zdrojích OpenSSH to tak vychází: tvar on <adresa> port <číslo> nese zpráva o navázaném spojení ze souboru sshd-session.c, kterou sshd zapíše až při úrovni LogLevel VERBOSE, kdežto hlášení o přihlašování z auth.c a packet.c ten tvar nemají. Vlastní komentář ve filtru ale u těch přívěsků dodnes uvádí, že je do záznamu píšou některé verze ssh, a commit s opravou se k tomu nevyjadřuje.

U fail2ban to není poprvé

Podstrčený údaj přes jméno uživatele má v tomhle projektu historii. Soubor změn vede u verze 0.10.0 z 9. srpna 2017 opravu v obecném filtru pro PAM, označenou jako vážnou, a u filtru pro Roundcube zmiňuje složitější varianty téhož triku, tehdy s tečkou za podvrženou adresou. Týž filtr pro PAM dostal další opravu stejné povahy znovu 8. října 2026, několik hodin po filtru pro sshd.

Společný jmenovatel je pokaždé stejný. Filtr čte řádek, jehož část napsal útočník, a musí z něj poznat, kde končí cizí text a kde začíná údaj serveru. Dokud se jméno uživatele dostává do záznamu tak, jak přišlo, musí výraz, který za ním hledá adresu, rozlišit obsah jména od údajů, které připsal server. Ve všech čtyřech popsaných případech to fail2ban řešil u sebe, zúžením výrazu.

Zdroje

Bezpečnost

CVE SSH OpenSSH fail2ban

← zpět na výpis