Nf_tables představují evoluci předchozích systémů, jako jsou iptables, poskytujíce flexibilnější a výkonnější řešení pro filtraci a přesměrování síťového provozu. Tento systém umožňuje administrátorům efektivněji definovat pravidla pro monitorování, analýzu a reakci na síťový provoz, čímž zvyšuje obranyschopnost infrastruktury proti potenciálním hrozbám. V dnešní době, kdy se kybernetické útoky stávají stále sofistikovanějšími, je pochopení a správné využívání nf_tables nezbytné pro každého, kdo se zabývá zabezpečením sítí. V následujících sekcích se podíváme na to, jak nf_tables fungují, proč jsou důležité a jak mohou být využity k ochraně vašich systémů.
Základní rozdíly mezi nf_tables a předchozími řešeními jako iptables
Nf_tables představuje nástroj v Linuxu pro správu firewallu a síťových pravidel, který nahradil iptables a nabízí lepší výkon a flexibilitu. Rozdíly mezi nf_tables a iptables zahrnují vylepšenou syntaxi pravidel, lepší integraci s jádrem Linuxu, což vede k efektivnějšímu zpracování pravidel, a podporu pro práci s více protokoly v jediném pravidle. Díky těmto vylepšením je práce s nf_tables pohodlnější a umožňuje pokročilejší správu síťového provozu.
Další rozdíly mezi nf_tables a iptables zahrnují například větší modularitu a rozšiřitelnost nf_tables, což umožňuje uživatelům vytvářet vlastní rozšíření nebo používat již existující, a také lepší podporu pro vícejádrové zpracování, což zvyšuje celkový výkon při zpracování velkého množství síťového provozu. Tyto vlastnosti činí nf_tables vhodnější pro moderní síťové infrastruktury vyžadující vysoce flexibilní a výkonné řešení pro správu pravidel síťového provozu.
Pár ukázek
Blokování IP adresy
Pro blokování veškerého provozu z určité IP adresy můžete použít pravidlo ve stylu:
nft add rule ip filter input ip saddr {nežádoucí IP adresa} drop
Toto pravidlo přidáte do řetězce input
ve vaší tabulce filter
, která pracuje s IP protokolem. Provoz od specifikované IP adresy bude zahozen (drop
).
Přesměrování portu: Přesměrování provozu z jednoho portu na jiný, například z portu 80 na port 8080, by mohlo vypadat takto:
nft add rule ip nat prerouting tcp dport 80 redirect to 8080
Toto pravidlo využívá tabulku nat
a řetězec prerouting
pro změnu cílového portu příchozích TCP spojení určených pro port 80 na port 8080.
Povolení provozu na konkrétním portu: Pro povolení veškerého příchozího TCP provozu na portu 22 (SSH) můžete nastavit pravidlo jako:
nft add rule ip filter input tcp dport 22 accept
Tímto přidáte pravidlo do input
řetězce vaší filter
tabulky, které akceptuje všechny TCP pakety mířící na port 22.
Tyto příklady slouží jako základní ukázka možností, které nf_tables nabízí. Pro hlubší porozumění a pokročilejší scénáře doporučuji prozkoumat dokumentaci a komunitní příručky, které poskytují důkladnější pokyny a příklady.
Přehled zranitelnosti
V oblasti kybernetické bezpečnosti mohou zranitelnosti v jádře Linuxu mít rozsáhlé důsledky kvůli jeho širokému využití v různých systémech. Nedávné odhalení složité chyby dvojitého uvolnění paměti v podsystemu Netfilter upoutalo pozornost bezpečnostních výzkumníků a vývojářů jádra.
Začátek průzkumu
Cesta začala iniciativou začlenit možnosti obejití firewallu do ORB rootkitu nazvaného Netkit. Cílem bylo využít API jádra, což by zajistilo širokou kompatibilitu napříč různými architekturami a verzemi jádra, podobně jako standardní moduly jádra. Tento přístup vedl k hlubokému průzkumu Netfilteru, komponenty, která byla pro výzkumníka dosud neznámou oblastí.
Prozkoumání Netfilteru
Netfilter, klíčový pro filtrování paketů, NAT a manipulaci s pakety v jádře Linuxu, byl pro výzkumníka neznámým terénem. Ponor do Netfilteru vyžadoval rozsáhlé samostudium, usnadněné bohatou dokumentací od vývojářů jádra a komunity informační bezpečnosti. Bylo provedeno důkladné zkoumání pravidel a výrazů nf_tables, části zdrojového kódu Netfilteru.
Identifikace zranitelnosti
Při prozkoumávání nf_tables zaujala pozornost zvláště funkce nf_hook_slow()
. Tato funkce iteruje přes všechna pravidla v řetězci a ukončí svou činnost při setkání s NF_DROP, což vede k uvolnění paketu. Výzkumník manipuloval s funkcí tak, aby v případě scénáře NF_DROP vrátila NF_ACCEPT, čímž odhalil kritickou chybu dvojitého uvolnění paměti.
Analýza primární příčiny a toku dat
Primární příčina byla identifikována jako chyba v sanitizaci vstupu, kde jádro přijímalo kladné chyby při uvolnění v objektech verdiktu pro háčky Netfilteru. Útočník by mohl toto využít tím, že donutí nf_hook_slow()
uvolnit objekt skb, když pravidlo vrátí NF_DROP, a poté podvodně signalizovat NF_ACCEPT, jako by každé pravidlo v řetězci vrátilo NF_ACCEPT. Toto vede k nesprávné interpretaci situace volajícím nf_hook_slow()
a následnému dvojitému uvolnění paketu.
Dopad a zneužití chyby
Jak bylo zmíněno v předchozí části, tato chyba poskytuje velmi silný primitiv dvojitého uvolnění paměti, když jsou zasaženy správné kódy cest. Dvojité uvolnění paměti ovlivňuje jak objekty struct sk_buff
ve skladišti skbuff_head_cache, tak i dynamicky velký objekt sk_buff->head sahající od kmalloc-256 až po stránky pořadí 4 přímo z alokátoru buddy (65536 bajtů) s pakety ipv4 (možná i více s ipv6 jumbo pakety).
Řešení chyby
Když byla chyba nahlášena vývojářům jádra, navrhl autor, který chybu našel, vlastní řešení chyby, které bohužel muselo zavést konkrétní změnu v netfilter stacku.
Naštěstí jeden z vývojářů podsystemu přišel se svým elegantním řešením. Jejich oprava sanitizuje verdikty z uživatelského vstupu přímo v API Netfilteru, ještě předtím, než je zlomyslný verdikt vůbec přidán. Konkrétní oprava nedovoluje jádru přijímat chyby uvolnění z uživatelského vstupu. Vývojář však zmínil, že pokud bude toto chování v budoucnu potřeba, měly by být povoleny pouze chyby uvolnění s n <= 0, aby se předešlo chybám jako je tato. Protože kladné chyby uvolnění, jako je 1, se překrývají jako NF_ACCEPT.
Kromě toho byla zranitelnosti přidělena CVE-2024-1086.
Doporučujeme aktualizaci na verzi po commitu f342de4e2f33e0e39165d8639387aa6c19dff660, aby bylo možné této zranitelnosti předejít.