Зөвхөн уншигдах боломжтой файлуудыг гэмтээх боломжийг олгодог Линуксийн цөм дэх эмзэг байдал

Линукс цөмд (CVE-2022-0847) сул тал тогтоогдсон бөгөөд энэ нь зөвхөн унших горимд байгаа, O_RDONLY тугаар нээгдсэн эсвэл файлын систем дээр байрлах аливаа файлд хуудасны кэшийн агуулгыг дарж бичих боломжийг олгодог. зөвхөн унших горимд суурилуулсан. Практикийн хувьд энэ эмзэг байдлыг дурын процесст код оруулах эсвэл нээсэн файл дахь өгөгдлийг эвдэхэд ашиглаж болно. Жишээлбэл, та sshd процесст зориулсан authorized_keys файлын агуулгыг өөрчилж болно. Ашиглалтын прототипийг турших боломжтой.

Асуудлыг 2016 онд тодорхойлсон Dirty COW ноцтой эмзэг байдлын адил Dirty Pipe гэж нэрлэсэн. Аюулын түвшний хувьд Dirty Pipe нь Dirty COW-тай ижил түвшинд байгаа боловч ашиглахад илүү хялбар гэдгийг тэмдэглэжээ. Энэ эмзэг байдлыг бүртгэлийн серверээс шахсан архивыг татаж авах системд сүлжээгээр татаж авсан файлууд үе үе гэмтсэн тухай гомдлын дүн шинжилгээ хийх явцад тодорхойлогдсон (ачаалсан систем дээр 37 сарын дотор 3 удаа гэмтсэн), бэлтгэх явцад splice() үйлдлийг ашигласан. болон нэргүй хоолойнууд.

Энэ эмзэг байдал нь 5.8 оны 2020-р сард гарсан Линукс цөм 11-аас эхлэн гарч ирнэ. Debian 20.04-д байдаг боловч Ubuntu 8 LTS-ийн үндсэн цөмд нөлөөлөхгүй. RHEL 15.x болон openSUSE/SUSE 5.16.11 цөмүүд нь эхэндээ хуучин салбарууд дээр суурилдаг боловч асуудал үүсгэсэн өөрчлөлтийг тэдгээрт шилжүүлсэн байж болзошгүй (яг тодорхой мэдээлэл одоогоор алга байна). Та Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux гэсэн эдгээр хуудсууд дээрх түгээлтийн багцын шинэчлэлтүүдийг дагаж мөрдөх боломжтой. 5.15.25, 5.10.102, XNUMX хувилбаруудад эмзэг байдлыг засахыг санал болгосон. Засварыг Android платформд ашигладаг цөмд мөн оруулсан болно.

Бүтцийг хуваарилах, зарим заль мэхийг хийх үед санах ой арилдаггүй ч copy_page_to_iter_pipe() болон push_pipe() функцүүдийн код дахь "buf->flags" утгыг эхлүүлээгүйгээс эмзэг байдал үүсдэг. нэргүй хоолойнууд, өөр үйл ажиллагааны утга. Энэ функцийг ашигласнаар орон нутгийн давуу эрхгүй хэрэглэгч туг дээрх PIPE_BUF_FLAG_CAN_MERGE утгын харагдах байдалд хүрч болох бөгөөд энэ нь танд тусгайлан бэлтгэсэн нэргүй хоолой руу шинэ өгөгдөл бичих замаар хуудасны кэш дэх өгөгдлийг дарж бичих ажлыг зохион байгуулах боломжийг олгодог.

Довтолгооны хувьд зорилтот файл нь уншигдахуйц байх ёстой бөгөөд хоолой руу бичихдээ хандалтын эрхийг шалгадаггүй тул хуудасны кэшийг зөвхөн унших зориулалттай хуваалтад байрлах файлуудад (жишээлбэл, c CD- файлуудад) сольж болно. ROM). Хуудасны кэш дэх мэдээллийг сольсны дараа файлаас өгөгдлийг унших үед процесс нь бодит өгөгдлийг биш харин сольсон өгөгдлийг хүлээн авах болно.

PIPE_BUF_FLAG_CAN_MERGE тугийг түүнтэй холбоотой бүх цагираган бүтцэд суулгасан эсэхийг баталгаажуулахын тулд нэргүй суваг үүсгэж, дурын өгөгдлөөр дүүргэх үйл ажиллагаа явагдана. Дараа нь, өгөгдлийг сувгаас унших боловч pipe_inode_info цагираган бүтэц дэх pipe_buffer бүтцийн бүх тохиолдлуудад туг тохируулагдсан хэвээр байна. Дараа нь хүссэн офсетээс эхлэн зорилтот файлаас нэргүй хоолой руу өгөгдлийг уншихын тулд splice() руу залгана. Энэ нэргүй хоолой руу өгөгдөл бичих үед PIPE_BUF_FLAG_CAN_MERGE тугийг тохируулж байгаа тул pipe_buffer бүтцийн шинэ жишээ үүсгэхийн оронд хуудасны кэш дэх өгөгдлийг дарж бичих болно.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх