Ang Project Zero ay nakabuo ng isang paraan upang pagsamantalahan ang mga kahinaan sa Linux

Linux

Pagsasamantala ng mga null reference sa Linux kernel

Kamakailan ay inanunsyo na ang mga mananaliksik mula sa pangkat ng Google Project Zero ay nakabuo ng isang pamamaraan upang pagsamantalahan ang mga kahinaan sa Linux kernel na dulot ng pag-alis ng reference sa NULL pointer.

Hanggang ngayon, ang mga problema sa kernel na may kaugnayan sa NULL pointer dereferencing ay hindi pa nabibigyan ng sapat na atensyon , dahil itinuturing na hindi makatotohanang gawing mga pag-atake ang mga ganitong problema na humahantong sa pagtaas ng pribilehiyo o pagpapatupad ng sariling code (ipinagbabawal ang pagmapa ng mga prosesong walang pribilehiyo sa mas mababang rehiyon ng address space).

Bilang pangkalahatang tuntunin, ang mga ganitong error ay humahantong sa pagbuo ng mga babala ng oops ng kernel, pagkatapos nito ay nakumpleto ang mga problemang gawain at naibalik ang estado nang hindi kinakailangang ihinto ang sistema.

Ang bagong paraan ng pag-atake ay batay sa paghawak ng mga estadong "oops" , na maaaring magresulta sa pagtaas ng halaga ng reference counter (refcount), na siya namang maaaring maging sanhi ng pag-apaw ng counter at paglabas ng memorya na nauugnay sa refcount.

Sa kasong ito, ang pagsasamantala ay nabawasan sa mga manipulasyon na tipikal ng paggamit-pagkatapos-libreng pag-atake (isang sitwasyon ay lumitaw kung saan ang bilang ng sanggunian ng bagay ay nagiging zero, ang memorya ay napalaya, ngunit sa katunayan may mga gumaganang link na tumuturo sa napalaya na memorya).

Sa kasalukuyan, kapag ang Linux kernel ay nagti-trigger ng null dereference mula sa loob ng konteksto ng isang proseso, ito ay bumubuo ng isang oops , na naiiba sa kernel panic. Nangyayari ang panic kapag natukoy ng kernel na walang ligtas na paraan upang ipagpatuloy ang pagpapatupad at samakatuwid ay dapat ihinto ang lahat ng pagpapatupad. Gayunpaman, hindi itinitigil ng kernel ang lahat ng pagpapatupad sa panahon ng isang oops; sa halip, sinusubukan ng kernel na makabawi sa abot ng makakaya nito at ipinagpapatuloy ang pagpapatupad.

Ang dereferencing sa isang NULL pointer ay ginagamit dito bilang isang paraan upang mabuo ang "oops" na estado sa isang kontroladong paraan. Ang problema ay nangangailangan ng humigit-kumulang 232 "oops" na mga tawag sa katayuan upang maabot ang isang 32-bit na pag-apaw ng refcount.

Mula sa praktikal na pananaw, inaabot ng humigit-kumulang walong araw ng patuloy na pagbuo ng mga out-of-place (OOP) state upang maisagawa ang isang pag-atake gamit ang iminungkahing exploit. Kung magtagumpay, papayagan ka ng exploit na isagawa ang iyong code sa antas ng kernel.

Ang NULL pointer dereference na ginamit sa pagsasamantala ay naayos noong Oktubre, ngunit dahil ang mga katulad na isyu ay hindi karaniwan at dati ay itinuturing bilang mga bug, hindi mga kahinaan, ang mga developer ay magdaragdag ng pangkalahatang proteksyon sa Linux kernel upang maiwasan ang mga pag-atake na manipulahin ang henerasyon ng "oops ."

 Sa kaso ng isang gawain, nangangahulugan iyon na itapon ang umiiral na kernel stack at direktang pumunta sa make_task_dead na tumatawag sa do_exit. Magpo-post din ang kernel sa dmesg ng "crash" log at isang kernel trace na nagpapakita kung anong estado ang kernel noong nangyari ang error. Ito ay maaaring mukhang isang kakaibang pagpipilian kapag ang memory corruption ay malinaw na nangyari; gayunpaman, ang layunin ay gawing mas madaling makita ang mga kernel bug at mag-log sa ilalim ng pilosopiya na ang tumatakbong sistema ay mas madaling i-debug kaysa sa isang down.

Sa partikular , ang Kernel 6.2 ay may kasamang mga pagbabago upang limitahan ang maximum na bilang ng mga "oops" . Matapos maabot ang limitasyon, na nakatakda sa 10 oops bilang default (maaari mo itong baguhin gamit ang parameter na oops_limit kung ninanais), sisimulan ng kernel ang isang paglipat sa isang estado na "panic", na susundan ng isang pag-reboot, na hindi papayagan ang bilang ng mga pag-ulit na kinakailangan upang i-reset ang refcount sa zero.

Pinlano din na ang paghihigpit ay ililipat sa naunang inilabas, ngunit sinusuportahan pa rin ang mga sanga ng kernel, pati na rin ang mga pakete ng kernel ng mga sikat na pamamahagi.

Panghuli, kung interesado kang matuto nang higit pa tungkol dito , makikita mo ang mga detalye sa sumusunod na link.


Idagdag bilang ginustong mapagkukunan sa Google