Kwesbaarheid in die Linux-kern wat met leesalleen-lêers kan peuter

'n Kwesbaarheid is in die Linux-kern (CVE-2022-0847) geïdentifiseer wat toelaat dat die inhoud van die bladsykas oorskryf word vir enige lêers, insluitend dié in leesalleen-modus, oopgemaak met die O_RDONLY-vlag, of geleë op lêerstelsels in leesalleenmodus gemonteer. In praktiese terme kan die kwesbaarheid gebruik word om kode in arbitrêre prosesse in te spuit of om data in oop lêers te korrupteer. Byvoorbeeld, jy kan die inhoud van die authorized_keys-lêer vir die sshd-proses verander. 'n Prototipe van die ontginning is beskikbaar vir toetsing.

Die probleem het die kodenaam Dirty Pipe gekry, soortgelyk aan die kritieke kwesbaarheid Dirty COW wat in 2016 geïdentifiseer is. Daar word kennis geneem dat wat die gevaarvlak betref, Dirty Pipe op dieselfde vlak as Dirty COW is, maar baie makliker is om te bedryf. Die kwesbaarheid is geïdentifiseer tydens die ontleding van klagtes oor periodieke korrupsie van lêers wat oor die netwerk afgelaai is in 'n stelsel wat saamgeperste argiewe vanaf 'n logbediener aflaai (37 korrupsies in 3 maande op 'n gelaaide stelsel), waarvan die voorbereiding die splice()-operasie gebruik het en naamlose pype.

Die kwesbaarheid verskyn vanaf die Linux-kern 5.8, wat in Augustus 2020 vrygestel is, d.w.s. teenwoordig in Debian 11, maar beïnvloed nie die basiskern in Ubuntu 20.04 LTS nie. Die RHEL 8.x- en openSUSE/SUSE 15-pitte is aanvanklik op ou takke gebaseer, maar dit is moontlik dat die verandering wat die probleem veroorsaak in hulle teruggeplaas is (daar is nog geen presiese data nie). U kan die publikasie van pakketopdaterings in verspreidings op hierdie bladsye naspoor: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. 'n Regstelling vir die kwesbaarheid is verskaf in vrystellings 5.16.11, 5.15.25 en 5.10.102. Die oplossing is ook ingesluit in die kern wat op die Android-platform gebruik word.

Die kwesbaarheid word veroorsaak deur die gebrek aan inisialisering van die “buf->flags”-waarde in die kode van die funksies copy_page_to_iter_pipe() en push_pipe(), ten spyte van die feit dat die geheue nie skoongemaak word wanneer 'n struktuur toegewys word nie en tydens sekere manipulasies met naamlose pype, 'n waarde van 'n ander operasie. Deur hierdie kenmerk te gebruik, kan 'n onbevoorregte plaaslike gebruiker die voorkoms van die PIPE_BUF_FLAG_CAN_MERGE-waarde in die vlag bereik, wat jou toelaat om data-oorskrywing in die bladsykas te organiseer deur eenvoudig nuwe data na 'n spesiaal voorbereide naamlose pyp te skryf.

Vir 'n aanval moet die teikenlêer leesbaar wees, en aangesien toegangsregte nie nagegaan word wanneer na pyp geskryf word nie, kan vervanging in die bladsykas ook gemaak word vir lêers wat geleë is in partisies wat leesalleen gemonteer is (byvoorbeeld vir lêers c CD- ROM). Nadat die inligting in die bladsykas vervang is, wanneer data van 'n lêer gelees word, sal die proses nie die werklike data ontvang nie, maar die vervangde data.

Operasie kom daarop neer om 'n naamlose kanaal te skep en dit te vul met arbitrêre data om te verseker dat die PIPE_BUF_FLAG_CAN_MERGE vlag in alle ringstrukture wat daarmee geassosieer word, gestel is. Vervolgens word die data vanaf die kanaal gelees, maar die vlag bly gestel in alle gevalle van die pipe_buffer-struktuur in die pipe_inode_info-ringstrukture. 'n Oproep na splice() word dan gemaak om data van die teikenlêer in 'n naamlose pyp te lees, begin by die verlangde offset. Wanneer data na hierdie naamlose pyp geskryf word, as gevolg van die PIPE_BUF_FLAG_CAN_MERGE-vlag wat gestel word, sal die data in die bladsykas oorgeskryf word in plaas daarvan om 'n nuwe instansie van die pipe_buffer-struktuur te skep.

Bron: opennet.ru

Voeg 'n opmerking