Линукс цөм дэх үндсэн эмзэг байдал ба systemd-д үйлчилгээ үзүүлэхээс татгалзах

Qualys-ийн аюулгүй байдлын судлаачид Линуксийн цөм болон системийн менежерт нөлөөлж буй хоёр эмзэг байдлын дэлгэрэнгүй мэдээллийг илчилсэн. Цөм дэх эмзэг байдал (CVE-2021-33909) нь дотоод хэрэглэгчдэд өндөр үүрлэсэн лавлахуудыг удирдах замаар үндсэн эрх бүхий кодыг гүйцэтгэх боломжийг олгодог.

Судлаачид Ubuntu 20.04/20.10/21.04, Debian 11, Fedora 34 дээр ажилладаг ажлын эксплойтуудыг анхдагч тохиргоогоор бэлтгэж чадсан нь эмзэг байдлын аюулыг улам хүндрүүлж байна. Бусад түгээлтүүд туршиж үзээгүй ч онолын хувьд асуудалд өртөмтгий бөгөөд халдлагад өртөж болзошгүйг тэмдэглэв. Асуудлыг хаа сайгүй арилгасны дараа ашиглалтын бүрэн кодыг нийтлэх болно гэж амласан боловч одоогоор зөвхөн хязгаарлагдмал ажиллагаатай прототипийг ашиглах боломжтой байгаа нь системийг сүйрүүлэхэд хүргэж байна. Асуудал 2014 оны 3.16-р сараас хойш гарч ирсэн бөгөөд 19-аас эхлэн цөмийн хувилбаруудад нөлөөлж байна. Эмзэг байдлын засварыг олон нийттэй зохицуулж, XNUMX-р сарын XNUMX-нд цөмд хүлээн зөвшөөрсөн. Үндсэн түгээлтүүд нь цөмийн багцууддаа (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) шинэчлэлтүүдийг аль хэдийн үүсгэсэн байна.

Энэ эмзэг байдал нь дараалсан бичлэгээс файл үүсгэдэг seq_file кодын үйлдэл хийхээс өмнө size_t-г int болгон хувиргах үр дүнг шалгаагүйгээс үүсдэг. Шалгахгүй байх нь маш их үүрлэсэн лавлах бүтцийг (замын хэмжээ 1 ГБ-аас их) үүсгэх, холбох, устгах үед буферт хязгаараас гадуур бичихэд хүргэж болзошгүй. Үүний үр дүнд халдагч "//устгагдсан" гэсэн 10 байт стрингийг "-2 ГБ - 10 байт"-ын офсетээр бичиж, хуваарилагдсан буферийн өмнөх хэсгийг зааж өгч чадна.

Бэлтгэсэн exploit нь ажиллахын тулд 5 ГБ санах ой, 1 сая үнэгүй иноод шаарддаг. Эксплойт нь mkdir()-г дуудаж, файлын замын хэмжээг 1 ГБ-аас хэтрүүлэхийн тулд сая орчим дэд сангуудын шатлалыг үүсгэнэ. Энэ директор нь тусдаа хэрэглэгчийн нэрийн зайд bind-mount-аар суурилагдсан бөгөөд дараа нь устгахын тулд rmdir() функцийг ажиллуулдаг. Үүний зэрэгцээ жижиг eBPF програмыг ачаалдаг утас үүсдэг бөгөөд энэ нь eBPF псевдокодыг шалгасны дараа, гэхдээ JIT эмхэтгэхээс өмнө хаагдсан байна.

Зөвшөөрөлгүй хэрэглэгчийн нэрийн талбарт /proc/self/mountinfo файл нээгдэж, холбосон лавлахын урт замын нэрийг уншсанаар буфер эхлэхээс өмнөх хэсэгт "//устгагдсан" мөр бичигдэнэ. Мөр бичих байрлалыг аль хэдийн туршиж үзсэн боловч хараахан эмхэтгээгүй eBPF програмын зааврыг дарж бичихээр сонгосон.

Дараа нь eBPF программын түвшинд хяналтгүй буферээс гадуур бичих нь btf болон map_push_elem бүтцийг удирдах замаар бусад цөмийн бүтцэд унших, бичих хяналттай чадвар болж хувирдаг. Үүний үр дүнд exploit нь цөмийн санах ой дахь modprobe_path[] буферийн байршлыг тодорхойлж, доторх "/sbin/modprobe" замыг дарж бичдэг бөгөөд энэ нь танд ямар ч root эрхтэй ажиллах боломжтой файлыг эхлүүлэх боломжийг олгодог. request_module() дуудлагыг жишээлбэл, сүлжээний сокет үүсгэх үед гүйцэтгэдэг.

Судлаачид зөвхөн тодорхой мөлжлөгт үр дүнтэй хэд хэдэн тойрон гарах арга замыг санал болгодог боловч асуудлыг өөрөө арилгадаггүй. Тусдаа хэрэглэгчийн ID нэрийн талбарт лавлах холбохыг идэвхгүй болгохын тулд "/proc/sys/kernel/unprivileged_userns_clone"-г 0 болгож, цөмд eBPF програм ачаалахыг идэвхгүй болгохын тулд "/proc/sys/kernel/unprivileged_bpf_disabled"-ийг 1 болгохыг зөвлөж байна.

Судлаачид том лавлахыг холбохын тулд холбохын оронд FUSE механизмыг ашигласан өөр халдлагад дүн шинжилгээ хийх явцад системийн системийн менежерт нөлөөлөх өөр нэг сул тал (CVE-2021-33910) гарсан нь анхаарал татаж байна. FUSE-ээр дамжуулан 8 МБ-аас дээш замын хэмжээтэй лавлахыг холбох гэж оролдох үед хяналтын эхлүүлэх процесс (PID1) нь стек санах ой дуусч, гацсан нь системийг "сандрах" байдалд оруулдаг.

Асуудал нь systemd нь /proc/self/mountinfo-н агуулгыг хянаж, задлан шинжилж, холбох цэг бүрийг unit_name_path_escape() функцэд боловсруулдаг бөгөөд энэ нь өгөгдлийг динамикаар хуваарилагдсан санах ойд бус стек дээр байрлуулах strdupa() үйлдлийг гүйцэтгэдэг. . Стекийн дээд хэмжээ RLIMIT_STACK-ээр хязгаарлагддаг тул холбох цэг рүү хэт том замыг боловсруулах нь PID1 процессыг сүйрүүлж, системийг зогсооход хүргэдэг. Довтолгооны хувьд та хамгийн энгийн FUSE модулийг ашиглах боломжтой бөгөөд замын хэмжээ нь 8 МБ-аас хэтэрсэн өндөр үүрлэсэн лавлахыг холбох цэг болгон ашиглаж болно.

Асуудал нь systemd 220 (2015 оны 248-р сар)-аас хойш гарч ирсэн бөгөөд системийн үндсэн репозиторыг аль хэдийн засаж, түгээлтүүдэд (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) зассан. Системийн 2018-р хувилбар дээр /proc/self/mountinfo-н боловсруулалт амжилтгүй болоход хүргэдэг systemd кодын алдааны улмаас exploit ажиллахгүй байгааг онцлон тэмдэглэх нь зүйтэй. Мөн 2018 онд үүнтэй төстэй нөхцөл байдал үүсч, Linux цөм дэх CVE-14634-XNUMX эмзэг байдлын ашиглалтыг бичих гэж оролдох үед Qualys судлаачид systemd-д гурван чухал сул талыг олж илрүүлсэн нь сонирхолтой юм.

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

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