Complania Qualys ka zbuluar një vulnerabilitet të rrezikshëm të tretë këtë vit (CVE-2022-3328) në utilitarin snap-confine, i cili ofrohet me flamur SUID root dhe thirret nga procesi snapd për të krijuar një ambient ekzekutiv për aplikacionet që shpërndahen në paketa të pavarura në formatin snap. Ky vulnerabilitet lejon një përdorues lokal, i paprivilegjuar, të arrijë ekzekutimin e kodit me të drejta root në konfigurimin standard të Ubuntu. Problemi është zgjidhur në versionin snapd 2.57.6. Përditësimet e paketave janë lëshuar për të gjitha degët e mbështetura të Ubuntu.
E interessant është se vulnerabiliteti në fjalë u përfshi gjatë procesit të rregullimit të një vulnerabiliteti të ngjashëm në snap-confine të zbuluar në shkurt. Hulumtuesit arritën të përgatisin një eksploatues funksional, i cili ofron akses root në Ubuntu Server 22.04, në të cilin, përveç vulnerabilitetit në snap-confine, janë angazhuar gjithashtu dy vulnerabilitete në procesin multipathd (CVE-2022-41974, CVE-2022-41973), të lidhura me kalimin e kontrollit të autorizimit gjatë dërgimit të komandave me privilegje dhe funksionimin e pasigurt me lidhje simbolike.
Vulnerabiliteti në snap-confine shkaktohet nga një gjendje garash në funksionin must_mkdir_and_open_with_perms(), i shtuar për të mbrojtur nga manipulimi i dosjes /tmp/snap.$SNAP_NAME në një lidhje simbolike në momentin pas kontrollit të pronësisë, por para thirrjes së sistemit të thirrjes mount për montimin bind të dosjeve për paketën në formatin snap. Mbrojtja e shtuar përfshinte rinonimin e dosjes /tmp/snap.$SNAP_NAME në një dosje tjetër në /tmp me një emër të rastësishëm, nëse ekziston dhe nuk i takon përdoruesit root.
Gjatë eksploatimit të operacionit të rinonimit të dosjes /tmp/snap.$SNAP_NAME, hulumtuesit shfrytëzuan se snap-confine gjithashtu krijon dosjen /tmp/snap.rootfs_XXXXXX për rrënjën e përmbajtjes së paketës snap. Pjesa "XXXXXX" në emër zgjidhet në mënyrë të rastësishme me mkdtemp(), por paketa me emrin "rootfs_XXXXXX" mund të kalojë verifikimin në funksionin sc_instance_name_validate (dmth, ideja është që emri $SNAP_NAME të marrë vlerën "rootfs_XXXXXX" dhe atëherë operacioni i rinonimit do të çojë në mbivendosjen e dosjes /tmp/snap.rootfs_XXXXXX me rrënjën snap).
Për të arritur përdorimin e njëkohshëm të /tmp/snap.rootfs_XXXXXX dhe riemërimin e /tmp/snap.$SNAP_NAME, u nisën dy ekzemplarë të snap-confine. Pasi ekzemplari i parë krijonte /tmp/snap.rootfs_XXXXXX, procesi u bllokua dhe u nis ekzemplari i dytë me emrin e paketës rootfs_XXXXXX, çka bëri që katalogu përkohësisht /tmp/snap.$SNAP_NAME i ekzemplarëve të dytë të bëhej katalogu rrënjësor /tmp/snap.rootfs_XXXXXX i të parit. Menjëherë pas përfundimit të riemërimit, ekzemplari i dytë përfundoi në mënyrë të papritur, dhe /tmp/snap.rootfs_XXXXXX u zëvendësua me manipulimin e gjendjes dhe garës, siç ndodhi me shfrytëzimin e cenueshmërisë së shkurtit. Pas zëvendësimit, nga ekzemplari i parë u hoq bllokimi i ekzekutimit dhe sulmuesit morën kontroll të plotë mbi katalogun rrënjë të snap.
Në fazën e fundit u krijua një lidhje simbolike /tmp/snap.rootfs_XXXXXX/tmp, e cila u përdor nga funksioni sc_bootstrap_mount_namespace() për të bërë montimin bind të katalogut real të shkruajtshëm /tmp në çdo katalog FS, pasi thirrja mount() merr parasysh lidhjet simbolike para montimit. Montimi i tillë bllokohet nga kufizimet e AppArmor, por për të anashkaluar këtë bllokadë, në shfrytëzim u angazhuan dy cenueshmëri mbështetëse në multipathd.
Burimi: opennet.ru
