Në kernelin Linux është zbuluar një vulnerabilitet (CVE-2022-0847) që lejon rishkrimin e përmbajtjes së caches të faqeve për çdo skedar, përfshirë ato që janë në mënyrë vetëm për lexim dhe të hapura me flamurin O_RDONLY ose që ndodhen në sisteme skedari të montuara në mënyrë vetëm për lexim. Nga ana praktike, vulnerabiliteti mund të përdoret për të injektuar kod në procese të rastësishme ose për të deformuar të dhënat në skedarët e hapur. Për shembull, mund të ndryshoni përmbajtjen e skedarit authorized_keys për procesin sshd. Një prototip i eksploitit është në dispozicion për testim.
Problemi është emëruar Dirty Pipe, në analogji me vulnerabilitetin kritik të zbuluar në 2016, Dirty COW. Vlerësohet se për sa i përket rrezikshmërisë, Dirty Pipe është në të njëjtin nivel me Dirty COW, por është shumë më i lehtë për t'u shfrytëzuar. Vulnerabiliteti u zbulua gjatë hetimeve mbi ankesa për dëmtime periodike të skedarëve që shkarkoheshin në rrjet në sistemin që ngarkonte arkiva të kompresuara nga log-serveri (37 dëmtime në 3 muaj në një sistem me ngarkesë të lartë), gjatë përgatitjes së të cilave u përdor operacioni splice() dhe kanalet e paemëruara.
Vulnerabiliteti shfaqet që me kernelin Linux 5.8, i lëshuar në gusht 2020, dmth. është i pranishëm në Debian 11, por nuk e prek kernelin bazë në Ubuntu 20.04 LTS. Kerneli RHEL 8.x dhe openSUSE/SUSE 15 në fillim janë bazuar në degë më të vjetra, por nuk përjashtohet që ndryshimi që shkaktoi problemin të ketë qenë i rikthyer në to (të dhëna të sakta nuk ka ende). Mund të ndiqni publikimin e azhurnimeve të pakove në distribucione në këto faqe: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Zgjidhja për vulnerabilitetin është propozuar në lëshimet 5.16.11, 5.15.25 dhe 5.10.102. Zgjidhja gjithashtu është e përfshirë në kernelin që përdoret në platformën Android.
Dobësia është e shkaktuar 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 pastrohet dhe nën manipulime të caktuara me kanalet e paemëruar në «buf->flags» mund të ndodhet një vlerë nga një operacion tjetër. Duke përdorur këtë veçori, një përdorues lokal i paprivilegjuar mund të arrijë që të shfaqet në flamurin vlera PIPE_BUF_FLAG_CAN_MERGE, e cila lejon organizimin e rikthimeve të të dhënave në cache-n e faqeve përmes një shkrimi të thjeshtë të të dhënave të reja në një kanal të paemëruar të përgatitur posaçërisht.
Për të sulmuar, skedari target duhet të jetë i disponueshëm për lexim, duke pasur parasysh se gjatë shkrimit në pipe nuk kontrollohen të drejtat e aksesit, zëvendësimi në cache të faqeve mund të kryhet edhe për skedarë që ndodhen në ndarje të montuara vetëm për lexim (për shembull, për skedarë c CD-ROM). Pas zëvendësimit të informacionit në cache të faqeve, procesi gjatë leximit të të dhënave nga skedari do të marrë jo të dhënat reale, por të dhëna të manipuluara.
Ekspluatimi përfshin krijimin e një kanali të paemëruar dhe mbushjen e tij me të dhëna të rastësishme për të arritur të vendoset flamuri PIPE_BUF_FLAG_CAN_MERGE në të gjitha strukturat e lidhura me të. Më pas të dhënat lexohen nga kanali, por flamuri mbetet i aktivizuar në të gjitha instancat e strukturës pipe_buffer në strukturat e lidhura pipe_inode_info. Pas kësaj, thirret operacioni splice() për të lexuar të dhëna nga skedari target në kanal të paemëruar, duke filluar nga offseti i kërkuar. Kur të dhënat shkruhen në këtë kanal të paemëruar, për shkak të flamurit PIPE_BUF_FLAG_CAN_MERGE, të dhënat në cache do të rishkruhen, në vend që të krijohet një instancë e re e strukturës pipe_buffer.
Burimi: opennet.ru
