Një dobësi (CVE-2022-0847) është zbuluar në kernelin e Linux-it që lejon që përmbajtja e memorjes së përkohshme të faqes të mbishkruhet për çdo skedar, duke përfshirë ato në modalitetin vetëm për lexim, të hapura me flamurin O_RDONLY ose të vendosura në sistemet e skedarëve të montuara në modalitetin vetëm për lexim. Në terma praktikë, kjo dobësi mund të shfrytëzohet për të injektuar kod në procese arbitrare ose për të korruptuar të dhëna në skedarët e hapur. Për shembull, përmbajtja e skedarit authorized_keys për procesin sshd mund të modifikohet. Një shfrytëzim prototipi është i disponueshëm për testim.
Problemi është koduar Dirty Pipe, një referencë për dobësinë kritike Dirty COW, të zbuluar në vitin 2016. Dirty Pipe vihet re se është në të njëjtin nivel me Dirty COW për sa i përket ashpërsisë, por është dukshëm më i lehtë për t'u shfrytëzuar. Dobësia u zbulua gjatë hetimit të ankesave për korruptim të ndërprerë të skedarëve të shkarkuar në rrjet në një sistem që shkarkonte arkiva të kompresuara nga një server log (37 korruptime gjatë tre muajve në një sistem të ngarkuar), të cilat u përgatitën duke përdorur operacionin splice() dhe tuba pa emër.
Dobësia shfaqet duke filluar me kernelin Linux 5.8, të lëshuar në gusht 2020. Është e pranishme në Debian 11, por nuk ndikon në kernelin bazë në Ubuntu 20.04 LTS. Bërthamat RHEL 8.x dhe openSUSE/SUSE 15 fillimisht bazohen në degë më të vjetra, por është e mundur që ndryshimi që shkaktoi problemin të jetë transferuar atje (ende nuk ka të dhëna të sakta). Mund të ndiqni lëshimin e përditësimeve të paketave për këto shpërndarje në faqet e mëposhtme: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Një rregullim për dobësinë është propozuar në lëshimet 5.16.11, 5.15.25 dhe 5.10.102. Rregullimi është përfshirë gjithashtu në kernelin e përdorur në platformën Android.
Dobësia shkaktohet nga mungesa e inicializimit të vlerës "buf->flags" në funksionet copy_page_to_iter_pipe() dhe push_pipe(). Memoria nuk pastrohet kur caktohet një strukturë, dhe manipulime të caktuara me tuba pa emër mund të shkaktojnë që "buf->flags" të përmbajnë një vlerë nga një operacion tjetër. Duke shfrytëzuar këtë të metë, një përdorues lokal pa privilegje mund të shkaktojë që flamuri të vendoset në vlerën PIPE_BUF_FLAG_CAN_MERGE, e cila lejon mbishkrimin e të dhënave në memorien e faqes thjesht duke shkruar të dhëna të reja në një tub pa emër të përgatitur posaçërisht.
Për të kryer një sulm, skedari i synuar duhet të jetë i lexueshëm. Meqenëse të drejtat e aksesit nuk kontrollohen gjatë shkrimit në një tub, zëvendësimet e memorjes së faqes në cache mund të kryhen edhe në skedarë të vendosur në ndarje vetëm për lexim (p.sh., skedarë nga një CD-ROM). Pas zëvendësimit të informacionit në memorjen e faqes në cache, kur lexohen të dhënat nga skedari, procesi do të marrë të dhënat e zëvendësuara, jo ato aktuale.
Shfrytëzimi konsiston në krijimin e një tubi pa emër dhe mbushjen e tij me të dhëna arbitrare për të vendosur flamurin PIPE_BUF_FLAG_CAN_MERGE në të gjitha strukturat e unazave të shoqëruara. Të dhënat lexohen më pas nga tubi, por flamuri mbetet i vendosur në të gjitha instancat e strukturës pipe_buffer në strukturat e unazave pipe_inode_info. Pastaj, bëhet një thirrje splice() për të lexuar të dhënat nga skedari i synuar në tubin pa emër, duke filluar nga zhvendosja e dëshiruar. Kur shkruani të dhëna në këtë tub pa emër, flamuri PIPE_BUF_FLAG_CAN_MERGE vendos të dhënat e memorjes së përkohshme të faqes për t'i mbishkruar ato, në vend që të krijojë një instancë të re të strukturës pipe_buffer.
Burimi: opennet.ru
