Root-уразлівасць у інструментары кіравання пакетамі Snap

Кампанія Qualys выявіла трэцюю ў гэтым годзе небяспечную ўразлівасць (CVE-2022-3328) ва ўтыліце snap-confine, якая пастаўляецца са сцягам SUID root і выкліканай працэсам snapd для фармавання выкананага асяроддзя для прыкладанняў, якія распаўсюджваюцца ў самадастатковых пакетах у фармаце sna. Уразлівасць дазваляе лакальнаму непрывілеяванаму карыстачу дамагчыся выкананні кода з правамі root у канфігурацыі Ubuntu па змаўчанні. Праблема ўхіленая ў выпуску snapd 2.57.6. Абнаўленні пакетаў выпушчаныя для ўсіх падтрымліваемых галінак Ubuntu.

Цікава, што разгляданая ўразлівасць была занесеная падчас выпраўлення падобнай лютаўскай уразлівасці ў snap-confine. Даследнікам атрымалася падрыхтаваць працоўны эксплоит, які прадстаўляе root-доступ у Ubuntu Server 22.04, у якім акрамя ўразлівасці ў snap-confine таксама задзейнічаныя дзве ўразлівасці падчас multipathd (CVE-2022-41974, CVE-2022-41973). перадачы прывілеяваных каманд і небяспечнай працай з сімвалічнымі спасылкамі.

Уразлівасць у snap-confine выкліканая станам гонкі ў функцыі must_mkdir_and_open_with_perms(), дададзенай для абароны ад падмены каталога /tmp/snap.$SNAP_NAME на сімвалічную спасылку ў момант пасля праверкі ўладальніка, але перад зваротам да сістэмнага выкліку mount для bind- для пакета ў фармаце snap. Дададзеная абарона зводзілася да перайменавання каталога /tmp/snap.$SNAP_NAME у іншы каталог у /tmp са выпадковым імем, калі ён існуе і не прыналежыць карыстачу root.

Пры эксплуатацыі аперацыі перайменавання каталога /tmp/snap.$SNAP_NAME даследнікі скарысталіся тым, што snap-confine таксама стварае каталог /tmp/snap.rootfs_XXXXXX для кораня змесціва пакета snap. Частка "XXXXXX" у імі выбіраецца выпадкова пры дапамозе mkdtemp(), але пакет з імем "rootfs_XXXXXX" можа прайсці праверку ў функцыі sc_instance_name_validate (г.зн. ідэя ў тым, каб імя $SNAP_NAME прыняло значэнне "rootfs_XXXXXX" і тады аперацыя перайменавання прывядзе да перазапісу каталога /tmp/snap.rootfs_XXXXXX з коранем snap).

Для таго каб дамагчыся адначасовага выкарыстання /tmp/snap.rootfs_XXXXXX і перайменавання /tmp/snap.$SNAP_NAME было запушчана два асобніка snap-confine. Як толькі першы асобнік ствараў /tmp/snap.rootfs_XXXXXX працэс блакаваўся і запускаўся другі асобнік з імем пакета rootfs_XXXXXX, што прыводзіла да таго, што часовы каталог /tmp/snap.$SNAP_NAME другога асобніка станавіўся каранёвым каталогам /tmp/snaXXX. Адразу пасля выканання перайменавання другі асобнік аварыйна завяршаўся, а /tmp/snap.rootfs_XXXXXX падмяняўся з маніпуляцыяй станам гонкі, як пры эксплуатацыі лютаўскай уразлівасці. Пасля падмены з першага асобніка здымалася блакіроўка выканання і атакавалыя атрымлівалі поўны кантроль над каранёвым каталогам snap.

На апошнім этапе стваралася сімвалічная спасылка /tmp/snap.rootfs_XXXXXX/tmp, якая выкарыстоўвалася функцыяй sc_bootstrap_mount_namespace() для bind-мантавання даступнага на запіс рэальнага каталога /tmp у любы каталог ФС, бо выклік mount() варта сімвалічным спасылкам перад мантой. Падобнае мантаванне блакуецца абмежаваннямі AppArmor, але для абыходу гэтага блакавання ў эксплоіце былі задзейнічаны дзве дапаможныя ўразлівасці ў multipathd.

Крыніца: opennet.ru

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