Kwetsberens yn 'e Linux-kernel dy't kin manipulearje mei allinich-lêsbestannen

In kwetsberens is identifisearre yn 'e Linux-kernel (CVE-2022-0847) wêrtroch't de ynhâld fan 'e side-cache kin wurde oerskreaun foar alle bestannen, ynklusyf dy yn allinich-lêsmodus, iepene mei de O_RDONLY-flagge, of leit op bestânsystemen ynstalleare yn allinich-lêsmodus. Yn praktyske termen kin de kwetsberens brûkt wurde om koade yn te foegjen yn willekeurige prosessen of korrupte gegevens yn iepene bestannen. Jo kinne bygelyks de ynhâld fan it autorisearre_keys-bestân feroarje foar it sshd-proses. In eksploitaasjeprototype is beskikber foar testen.

It probleem is koadenamme Dirty Pipe, fergelykber mei de krityske kwetsberens Dirty COW identifisearre yn 2016. It wurdt opmurken dat yn termen fan gefaar nivo, Dirty Pipe is op itselde nivo as Dirty COW, mar is folle makliker te operearjen. De kwetsberens waard identifisearre tidens de analyze fan klachten oer periodike korrupsje fan triemmen ynladen oer it netwurk yn in systeem downloading komprimearre argiven fan in log tsjinner (37 korrupsjes yn 3 moannen op in laden systeem), de tarieding fan dat brûkte de splice () operaasje en net neamde pipes.

De kwetsberens ferskynt begjinnend mei de Linux kernel 5.8, útbrocht yn augustus 2020, d.w.s. oanwêzich yn Debian 11, mar hat gjin ynfloed op de basiskernel yn Ubuntu 20.04 LTS. De RHEL 8.x- en openSUSE/SUSE 15-kernels binne yn earste ynstânsje basearre op âlde tûken, mar it is mooglik dat de feroaring dy't it probleem feroarsake waard yn har backported (der binne noch gjin krekte gegevens). Jo kinne de publikaasje fan pakketfernijings folgje yn distribúsjes op dizze siden: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. In fix foar de kwetsberens waard levere yn releases 5.16.11, 5.15.25 en 5.10.102. De fix is ​​ek opnommen yn 'e kernel brûkt yn it Android-platfoarm.

De kwetsberens wurdt feroarsake troch it ûntbrekken fan inisjalisaasje fan de wearde "buf->flaggen" yn 'e koade fan' e funksjes copy_page_to_iter_pipe() en push_pipe(), nettsjinsteande it feit dat it ûnthâld net wiske wurdt by it tawizen fan in struktuer en by bepaalde manipulaasjes mei net neamd pipes, in wearde fan in oare operaasje. Mei help fan dizze funksje kin in unprivileged lokale brûker it uterlik fan 'e PIPE_BUF_FLAG_CAN_MERGE-wearde yn' e flagge berikke, wêrtroch jo it oerskriuwen fan gegevens yn 'e side-cache kinne organisearje troch gewoan nije gegevens te skriuwen nei in spesjaal taret net neamde pipe.

Foar in oanfal moat it doeltriem lêsber wêze, en om't tagongsrjochten net kontrolearre wurde by it skriuwen nei pipe, kin ferfanging yn 'e side-cache ek makke wurde foar bestannen dy't lizze yn partysjes dy't allinich-lezen monteare binne (bygelyks foar bestannen c CD- ROM). Nei it ferfangen fan de ynformaasje yn 'e side-cache, by it lêzen fan gegevens út in bestân, sil it proses net de eigentlike gegevens ûntfange, mar de ferfongen gegevens.

Operaasje komt del op it meitsjen fan in net neamd kanaal en it ynfoljen fan willekeurich gegevens om te soargjen dat de flagge PIPE_BUF_FLAG_CAN_MERGE wurdt ynsteld yn alle ring struktueren ferbûn mei it. Folgjende, de gegevens wurdt lêzen út it kanaal, mar de flagge bliuwt ynsteld yn alle gefallen fan de pipe_buffer struktuer yn de pipe_inode_info ring struktueren. In oprop oan splice () wurdt dan makke foar in lêzen gegevens út de doeltriem yn in net neamd pipe, begjinnend by de winske offset. By it skriuwen fan gegevens nei dizze net neamde pipe, trochdat de flagge PIPE_BUF_FLAG_CAN_MERGE wurdt ynsteld, wurde de gegevens yn 'e side-cache oerskreaun ynstee fan in nije eksimplaar fan' e pipe_buffer-struktuer te meitsjen.

Boarne: opennet.ru

Add a comment