Vundebleco en la Linukso-kerno kiu povas mistrakti nurlegeblajn dosierojn

Vulnerabileco estis identigita en la Linukso-kerno (CVE-2022-0847), kiu permesas la enhavon de la paĝa kaŝmemoro esti anstataŭigita por iuj dosieroj, inkluzive de tiuj en nurlegebla reĝimo, malfermita kun la O_RDONLY-flago, aŭ situanta sur dosiersistemoj. muntita en nurlegebla reĝimo. En praktikaj terminoj, la vundebleco povas esti uzata por enmeti kodon en arbitrajn procezojn aŭ korupti datumojn en malfermitaj dosieroj. Ekzemple, vi povas ŝanĝi la enhavon de la dosiero authorized_keys por la sshd-procezo. Prototipo de la ekspluato estas havebla por testado.

La problemo estis kodita Dirty Pipe, simila al la kritika vundebleco Dirty COW identigita en 2016. Oni rimarkas, ke laŭ danĝernivelo, Dirty Pipe estas sur la sama nivelo kiel Dirty COW, sed estas multe pli facila por funkcii. La vundebleco estis identigita dum la analizo de plendoj pri perioda korupto de dosieroj elŝutitaj tra la reto en sistemo elŝutanta kunpremitajn arkivojn de protokolo-servilo (37 koruptoj en 3 monatoj sur ŝarĝita sistemo), kies preparado uzis la splison() operacion. kaj nenomitaj pipoj.

La vundebleco aperas ekde la Linukso-kerno 5.8, publikigita en aŭgusto 2020, t.e. ĉeestas en Debian 11, sed ne influas la bazan kernon en Ubuntu 20.04 LTS. La kernoj RHEL 8.x kaj openSUSE/SUSE 15 estas komence bazitaj sur malnovaj branĉoj, sed eblas ke la ŝanĝo kaŭzanta la problemon estis retroportita en ilin (ankoraŭ ne ekzistas precizaj datumoj). Vi povas sekvi la publikigon de pakaj ĝisdatigoj en distribuoj sur ĉi tiuj paĝoj: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Riparo por la vundebleco estis proponita en eldonoj 5.16.11, 5.15.25 kaj 5.10.102. La riparo ankaŭ estas inkluzivita en la kerno uzata en la Android-platformo.

La vundebleco estas kaŭzita de la manko de komencado de la valoro "buf->flags" en la kodo de la funkcioj copy_page_to_iter_pipe() kaj push_pipe(), malgraŭ tio, ke la memoro ne estas forigita dum atribuado de strukturo kaj dum certaj manipuladoj kun nenomitaj pipoj, valoro de alia operacio. Uzante ĉi tiun funkcion, senprivilegia loka uzanto povas atingi la aspekton de la PIPE_BUF_FLAG_CAN_MERGE valoro en la flago, kiu ebligas al vi organizi anstataŭigon de datumoj en la paĝa kaŝmemoro simple skribante novajn datumojn al speciale preta sennoma tubo.

Por atako, la celdosiero devas esti legebla, kaj ĉar alirrajtoj ne estas kontrolitaj dum skribado al pipo, anstataŭigo en la paĝa kaŝmemoro ankaŭ povas esti farita por dosieroj situantaj en sekcioj muntitaj nurlegebla (ekzemple, por dosieroj c KD-). ROM). Post anstataŭigi la informojn en la paĝa kaŝmemoro, dum legado de datumoj de dosiero, la procezo ricevos ne la realajn datumojn, sed la anstataŭigitajn datumojn.

Operacio signifas krei nenomitan kanalon kaj plenigi ĝin per arbitraj datumoj por certigi, ke la flago PIPE_BUF_FLAG_CAN_MERGE estas fiksita en ĉiuj ringaj strukturoj asociitaj kun ĝi. Poste, la datumoj estas legitaj de la kanalo, sed la flago restas metita en ĉiuj okazoj de la pipe_buffer-strukturo en la pipe_inode_info-ringaj strukturoj. Voko al splice() tiam estas farita por legi datumojn de la celdosiero en nenomitan tubon, komencante ĉe la dezirata ofseto. Dum skribado de datumoj al ĉi tiu nenomita tubo, pro la flago PIPE_BUF_FLAG_CAN_MERGE agordita, la datumoj en la paĝa kaŝmemoro estos anstataŭitaj anstataŭ krei novan kazon de la strukturo pipe_buffer.

fonto: opennet.ru

Aldoni komenton