Уразлівасць у падсістэме ядра Linux Netfilter

У Netfilter, падсістэме ядра Linux, выкарыстоўванай для фільтрацыі і мадыфікацыі сеткавых пакетаў, выяўленая ўразлівасць (CVE-2021-22555), якая дазваляе лакальнаму карыстачу атрымаць прывілеі root у сістэме, у тым ліку знаходзячыся ў ізаляваным кантэйнеры. Для тэставання падрыхтаваны працоўны прататып эксплоіта, які абыходзіць механізмы абароны KASLR, SMAP і SMEP. Даследнік, які выявіў уразлівасць, атрымаў ад Google узнагароду, памерам 20 тысяч даляраў, за выяўленне метаду абыходу ізаляцыі кантэйнераў Kubernetes у кластары kCTF.

Праблема выяўляецца пачынальна з ядра 2.6.19, выпушчанага 15 гадоў назад, і выкліканая памылкай у апрацоўшчыках IPT_SO_SET_REPLACE і IP6T_SO_SET_REPLACE, якая прыводзіць да перапаўнення буфера пры адпраўцы адмыслова аформленых параметраў праз выклік setsockopt у рэжыме compat. У звычайных умовах выклік compat_setsockopt() можа выканаць толькі карыстач root, але неабходныя для здзяйснення нападу паўнамоцтвы таксама могуць быць атрыманы непрывілеяваным карыстачом у сістэмах з уключанай падтрымкай прастор імёнаў ідэнтыфікатараў карыстачоў (user namespaces).

Карыстальнік можа стварыць кантэйнер з асобным карыстачом root і з яго эксплуатаваць уразлівасць. Напрыклад, "user namespaces" па змаўчанні ўключаны ў Ubuntu і Fedora, але не актываваны ў Debian і RHEL. Патч з выпраўленнем уразлівасці прыняты ў склад ядра Linux 13 красавіка. Абнаўленні пакетаў ужо сфарміраваны праектамі Debian, Arch Linux і Fedora. У Ubuntu, RHEL і SUSE абнаўлення на стадыі падрыхтоўкі.

Праблема ўзнікае ў функцыі xt_compat_target_from_user() з-за некарэктнага разліку памеру памяці пры захаванні структур ядра пасля пераўтварэння з 32- у 64-разраднае ўяўленне. Памылка дазваляе запісаць чатыры нулявыя байты ў любую пазіцыю за мяжой вылучанага буфера, абмежаваную зрушэннем 0x4C. Указанай магчымасці аказалася дастаткова для стварэння эксплоіту, які дазваляе дамагчыся атрымання правоў root - праз ачыстку паказальніка m_list->next у структуры msg_msg ствараліся ўмовы для звароту да дадзеных пасля вызвалення памяці (use-after-free), што затым выкарыстоўвалася для атрымання звестак аб адрасах і змены іншых структур праз маніпуляцыю з сістэмным выклікам msgsnd().

Крыніца: opennet.ru

Дадаць каментар