Ранливост во кернелот Линукс што дозволува да се оштетат датотеките само за читање

Идентификувана е ранливост во кернелот на Linux (CVE-2022-0847) што дозволува содржината на кешот на страницата да се препише за сите датотеки, вклучително и оние во режим само за читање, отворени со знаменцето O_RDONLY или лоцирани на датотечни системи монтиран во режим само за читање. Во практична смисла, ранливоста може да се искористи за да се внесе код во произволни процеси или да се корумпираат податоците во отворените датотеки. На пример, можете да ја промените содржината на датотеката authorized_keys за процесот sshd. Прототип на експлоатот е достапен за тестирање.

Проблемот го доби кодното име Dirty Pipe, слично на критичната ранливост Dirty COW идентификувана во 2016 година. Забележано е дека во однос на нивото на опасност, Dirty Pipe е на исто ниво како Dirty COW, но е многу полесен за ракување. Ранливоста беше идентификувана за време на анализата на поплаките за периодично оштетување на датотеките преземени преку мрежата во систем што презема компресирани архиви од сервер за дневници (37 оштетувања за 3 месеци на вчитан систем), чија подготовка ја користеше операцијата splice() и неименувани цевки.

Ранливоста се појавува почнувајќи од кернелот Linux 5.8, објавен во август 2020 година, т.е. присутен во Debian 11, но не влијае на основниот кернел во Ubuntu 20.04 LTS. Кернелите RHEL 8.x и openSUSE/SUSE 15 првично се засновани на стари гранки, но можно е промената што го предизвика проблемот да е вратена во нив (сè уште нема точни податоци). Можете да го следите објавувањето на ажурирањата на пакетите во дистрибуциите на овие страници: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Поправка за ранливоста беше предложена во изданијата 5.16.11, 5.15.25 и 5.10.102. Поправката е вклучена и во кернелот што се користи во платформата Андроид.

Ранливоста е предизвикана од недостатокот на иницијализација на вредноста „buf->flags“ во кодот на функциите copy_page_to_iter_pipe() и push_pipe(), и покрај тоа што меморијата не се брише при доделување структура и при одредени манипулации со неименувани цевки, вредност од друга операција. Користејќи ја оваа функција, непривилегиран локален корисник може да постигне изглед на вредноста PIPE_BUF_FLAG_CAN_MERGE во знамето, што ви овозможува да организирате препишување на податоци во кешот на страницата со едноставно пишување нови податоци на специјално подготвена неименувана цевка.

За напад, целната датотека мора да биде читлива, и бидејќи правата за пристап не се проверуваат при пишување во цевка, замена во кешот на страницата може да се направи и за датотеките лоцирани во партиции монтирани само за читање (на пример, за датотеките c CD- ROM). Откако ќе ги замените информациите во кешот на страницата, при читање податоци од датотека, процесот ќе ги добие не вистинските податоци, туку заменетите податоци.

Операцијата се сведува на создавање неименуван канал и негово пополнување со произволни податоци со цел да се осигура дека знамето PIPE_BUF_FLAG_CAN_MERGE е поставено во сите структури на прстени поврзани со него. Следно, податоците се читаат од каналот, но знамето останува поставено во сите случаи на структурата pipe_buffer во структурите на прстенот pipe_inode_info. Потоа се прави повик до сплајс() за читање податоци од целната датотека во неименувана цевка, почнувајќи од саканото поместување. Кога пишувате податоци на оваа неименувана цевка, поради поставувањето на знаменцето PIPE_BUF_FLAG_CAN_MERGE, податоците во кешот на страниците ќе бидат препишани наместо да се создаде нов примерок од структурата pipe_buffer.

Извор: opennet.ru

Додадете коментар