Ang kundisyon ng lahi sa Linux kernel garbage collector na maaaring humantong sa pagdami ng pribilehiyo

Si Jann Horn mula sa Google Project Zero team, na minsang nakilala ang mga kahinaan ng Spectre at Meltdown, ay nag-publish ng isang pamamaraan para sa pagsasamantala sa isang kahinaan (CVE-2021-4083) sa Linux kernel garbage collector. Ang kahinaan ay dahil sa isang kundisyon ng lahi kapag nililinis ang mga deskriptor ng file sa mga unix socket at posibleng nagpapahintulot sa isang lokal na walang pribilehiyong user na isagawa ang kanilang code sa antas ng kernel.

Ang problema ay kawili-wili dahil ang palugit ng oras kung saan nangyayari ang kundisyon ng lahi ay tinatayang napakaliit upang lumikha ng mga tunay na pagsasamantala, ngunit ipinakita ng may-akda ng pag-aaral na kahit na ang mga unang pag-aalinlangan na kahinaan ay maaaring maging mapagkukunan ng mga tunay na pag-atake kung ang gumawa ng pagsasamantala ay may mga kinakailangang kasanayan at oras. Ipinakita ni Yann Horn kung paano, sa tulong ng mga manipulasyon ng filigree, maaari mong bawasan ang kundisyon ng lahi na nangyayari kapag sabay-sabay na tinatawag ang close() at fget() function sa isang ganap na mapagsamantalang kahinaan na walang paggamit at makamit ang access sa isang napalaya na data istraktura sa loob ng kernel.

Ang isang kundisyon ng lahi ay nangyayari sa panahon ng proseso ng pagsasara ng isang file descriptor habang tinatawag ang close() at fget() sa parehong oras. Maaaring mangyari ang call to close() bago isagawa ang fget() , na malito sa garbage collector dahil, ayon sa refcount, ang file structure ay hindi magkakaroon ng external references, ngunit mananatiling naka-attach sa file descriptor, i.e. Iisipin ng tagakolekta ng basura na mayroon itong eksklusibong pag-access sa istraktura, ngunit sa katunayan, sa loob ng maikling panahon, ang natitirang entry sa talahanayan ng deskriptor ng file ay ituturo pa rin sa pinapalaya na istraktura.

Upang mapataas ang posibilidad na makapasok sa isang kundisyon ng lahi, ilang mga trick ang ginamit, na naging posible upang mapataas ang posibilidad ng tagumpay ng pagsasamantala sa 30% kapag nagpapakilala ng mga pag-optimize na partikular sa system. Halimbawa, upang madagdagan ang oras ng pag-access sa isang istraktura na may mga deskriptor ng file ng ilang daang nanosegundo, tinanggal ang data mula sa cache ng processor sa pamamagitan ng paglalagay sa cache ng aktibidad sa isa pang core ng CPU, na naging posible na makuha ang istraktura mula sa memorya sa halip na mula sa ang mabilis na cache ng CPU.

Ang pangalawang mahalagang tampok ay ang paggamit ng mga interrupt na nabuo ng isang timer ng hardware upang mapataas ang oras ng kondisyon ng karera. Ang sandali ay pinili upang ang interrupt handler ay magpapaputok kapag may naganap na kundisyon ng karera at maantala ang pagpapatupad ng code nang ilang oras. Upang higit pang maantala ang pagbabalik ng kontrol, humigit-kumulang 50 libong mga entry sa waitqueue ang nabuo gamit ang epoll, na nangangailangan ng paghahanap sa pamamagitan ng interrupt handler.

Ang pamamaraan para sa pagsasamantala sa kahinaan ay isiniwalat pagkatapos ng 90-araw na panahon ng hindi pagsisiwalat. Lumilitaw ang problema mula noong kernel 2.6.32 at naayos noong unang bahagi ng Disyembre. Ang pag-aayos ay kasama sa kernel 5.16 at inilipat din sa mga sanga ng LTS ng kernel at mga kernel na pakete na ibinibigay sa mga distribusyon. Kapansin-pansin na ang kahinaan ay natukoy sa panahon ng pagsusuri ng isang katulad na problema CVE-2021-0920, na nagpapakita mismo sa kolektor ng basura kapag pinoproseso ang watawat ng MSG_PEEK.

Pinagmulan: opennet.ru

Magdagdag ng komento