Një dobësi në kernelin Linux është identifikuar (CVE-2022-0847), e cila lejon rishkrimin e përmbajtjes së caches së faqeve për çdo skedare, përfshirë ato të hapura me flag O_RDONLY ose ato që janë vendosur në sisteme skedarësh të montuara në modalitetin vetëm për lexim. Nga ana praktike, kjo dobësi mund të përdoret për të injektuar kod në procese të rastit ose për të ndyshuar të dhëna në skedarët e hapur. Për shembull, është e mundur të modifikohet përmbajtja e skedarit authorized_keys për procesin sshd. Një prototip i eksploit të testimit është në dispozicion.
Problemit i është dhënë emri kodik Dirty Pipe, për shkak të analogjisë me dobësinë kritike Dirty COW që u zbulua në vitin 2016. Vërehet se niveli i rrezikshmërisë së Dirty Pipe është i ngjashëm me atë të Dirty COW, por është shumë më i lehtë për tu shfrytëzuar. Dobësia u identifikua gjatë shqyrtimit të ankesave për dëmtimin e rastit të skedarëve të shkarkuar në mënyrë të rrjeteve në një sistem që shkarkon arkiva të kompresuara nga log-server (37 dëmtime në një periudhë 3-mujore në një sistem me ngarkesë të lartë), ku operacioni splice() dhe kanale të paemëruara ishin përdorur.
Dobësia shfaqet që nga kernelin Linux 5.8, i lëshuar në gusht 2020, dmth e pranishme në Debian 11, por nuk prek kernelin e bazës në Ubuntu 20.04 LTS. Kernels RHEL 8.x dhe openSUSE/SUSE 15 fillimisht bazohet në degë më të vjetra, por nuk përjashtohet që ndryshimi që shkaktoi problemin të jetë bashkuar në to (nuk ka të dhëna të sakta për këtë). Të dhënat për publikimin e përditësimeve të paketave në shpërndarje mund të gjenden në këto faqe: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Rregullimi i dobësisë është propozuar në versionet 5.16.11, 5.15.25 dhe 5.10.102. Rregullimi është gjithashtu përfshirë në kernelin e përdorur në platformën Android.
Vulnerabiliteti shkaktohet nga mungesa e inicializimit të vlerës „buf->flags“ në kodin e funksioneve copy_page_to_iter_pipe() dhe push_pipe(), ndërsa memoria gjatë alokimit të strukturës nuk pastron dhe përmes manipulimeve të caktuara me kanalet e paemërtuara, në „buf->flags“ mund të jetë një vlerë nga një operacion tjetër. Duke përdorur këtë veçori, një përdorues lokal pa privilegje mund të arrijë të shpallë një vlerë në flagun PIPE_BUF_FLAG_CAN_MERGE, i cili lejon organizimin e shkrimit të të dhënave në cache-in e faqeve përmes një shkrimi të thjeshtë të të dhënave të reja në një kanal të paemërtuar të përgatitur posaçërisht.
Për sulmin, skedari i targetit duhet të jetë në dispozitCuando, dhe duke qenë se kur shkruhet në pipe nuk kontrollet e drejta e aksesit, zëvendësimi në cache-in e faqeve mund të kryhet gjithashtu për skedarë që ndodhen në seksione të montuara vetëm për lexim (p.sh., për skedarë në CD-ROM). Pas zëvendësimit të informacionit në cache-in e faqeve, procesi gjatë leximit të të dhënave nga skedari do të marrë të dhëna të manipuluara në vend të atyre reale.
Eksploatimi përbëhet nga krijimi i një kanali të paemërtuar dhe mbushja e tij me të dhëna të rastësishme për të arritur vendosjen e flagut PIPE_BUF_FLAG_CAN_MERGE në të gjitha strukturat e lidhura ring. Pastaj, të dhënat lexohen nga kanali, por flagu mbetet i vendosur në të gjitha shembujt e strukturës pipe_buffer në strukturat rrethore pipe_inode_info. Më pas, kryhet thirrja splice() për të lexuar të dhënat nga skedari i targetit në kanal të paemërtuar, duke filluar nga offset-i i kërkuar. Kur shkruhen të dhëna në këtë kanal të paemërtuar, për shkak të flagut PIPE_BUF_FLAG_CAN_MERGE, të dhënat në cache-in e faqeve do të rishkruhen, në vend që të krijohet një shembull i ri i strukturës pipe_buffer.
Burimi: opennet.ru
