Gwraidd yn agored i niwed yn y cnewyllyn Linux a gwrthod gwasanaeth yn systemd

Mae ymchwilwyr diogelwch o Qualys wedi datgelu manylion dau wendid sy'n effeithio ar y cnewyllyn Linux a'r rheolwr system systemd. Mae bregusrwydd yn y cnewyllyn (CVE-2021-33909) yn caniatáu i ddefnyddiwr lleol gyflawni gweithrediad cod gyda hawliau gwraidd trwy drin cyfeiriaduron nythu iawn.

Mae perygl y bregusrwydd yn cael ei waethygu gan y ffaith bod yr ymchwilwyr wedi gallu paratoi gorchestion gwaith sy'n gweithio ar Ubuntu 20.04 / 20.10 / 21.04, Debian 11 a Fedora 34 yn y cyfluniad rhagosodedig. Nodir nad yw dosbarthiadau eraill wedi'u profi, ond yn ddamcaniaethol maent hefyd yn agored i'r broblem a gellir ymosod arnynt. Addewir cyhoeddi cod llawn y campau ar ôl i'r broblem gael ei dileu ym mhobman, ond am y tro dim ond prototeip o ymarferoldeb cyfyngedig sydd ar gael, gan achosi i'r system chwalu. Mae'r broblem wedi bod yn bresennol ers mis Gorffennaf 2014 ac mae'n effeithio ar ollyngiadau cnewyllyn gan ddechrau o 3.16. Cydlynwyd yr atgyweiriad bregusrwydd gyda'r gymuned a'i dderbyn i'r cnewyllyn ar Orffennaf 19eg. Mae'r prif ddosbarthiadau eisoes wedi cynhyrchu diweddariadau i'w pecynnau cnewyllyn (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Mae'r bregusrwydd yn cael ei achosi gan fethiant i wirio canlyniad trosiad size_t i int cyn perfformio gweithrediadau yn y cod seq_file, sy'n creu ffeiliau o ddilyniant o gofnodion. Gall methu â gwirio arwain at ysgrifennu all-derfynnol i'r byffer wrth greu, mowntio a dileu strwythur cyfeiriadur nythu iawn (maint llwybr sy'n fwy na 1 GB). O ganlyniad, gall ymosodwr gyflawni llinyn 10-beit "//dileu" wedi'i ysgrifennu ar wrthbwyso o "-2 GB - 10 bytes" gan bwyntio at yr ardal yn union cyn y byffer a neilltuwyd.

Mae angen 5 GB o gof ac 1 miliwn o inodes am ddim ar gyfer y camfanteisio parod i weithredu. Mae'r camfanteisio yn gweithio trwy ffonio mkdir() i greu hierarchaeth o tua miliwn o is-gyfeiriaduron i gyflawni maint llwybr ffeil sy'n fwy na 1 GB. Mae'r cyfeiriadur hwn wedi'i osod trwy bind-mount mewn gofod enw defnyddiwr ar wahân, ac ar ôl hynny mae'r swyddogaeth rmdir() yn cael ei redeg i'w dynnu. Ar yr un pryd, crëir edefyn sy'n llwytho rhaglen eBPF fach, sy'n cael ei rhwystro ar y cam ar ôl gwirio ffuggod eBPF, ond cyn ei gasgliad JIT.

Yn y gofod enw defnyddiwr di-freintiedig, mae'r ffeil / proc/self/mountinfo yn cael ei agor a darllenir enw llwybr hir y cyfeiriadur wedi'i osod mewn rhwymiad, gan arwain at ysgrifennu'r llinyn "//dileu" i'r ardal cyn dechrau'r byffer. Dewisir y sefyllfa ar gyfer ysgrifennu'r llinell fel ei bod yn trosysgrifo'r cyfarwyddyd yn y rhaglen eBPF sydd eisoes wedi'i phrofi ond nad yw wedi'i llunio eto.

Nesaf, ar lefel rhaglen eBPF, mae ysgrifennu heb ei reoli y tu allan i'r byffer yn cael ei drawsnewid yn allu rheoledig i ddarllen ac ysgrifennu at strwythurau cnewyllyn eraill trwy drin strwythurau btf a map_push_elem. O ganlyniad, mae'r camfanteisio yn pennu lleoliad y byffer modprobe_path[] yn y cof cnewyllyn ac yn trosysgrifo'r llwybr “/ sbin/modprobe” ynddo, sy'n eich galluogi i gychwyn lansiad unrhyw ffeil gweithredadwy gyda hawliau gwraidd os bydd request_module() galwad, sy'n cael ei weithredu, er enghraifft, wrth greu soced netlink.

Mae ymchwilwyr yn darparu nifer o atebion sy'n effeithiol ar gyfer camfanteisio penodol yn unig, ond nid ydynt yn dileu'r broblem ei hun. Argymhellir gosod "/proc/sys/kernel/unprivileged_userns_clone" i 0 i analluogi mowntio cyfeiriaduron mewn gofod enw ID defnyddiwr ar wahân, a "/proc/sys/kernel/unprivileged_bpf_disabled" i 1 i analluogi llwytho rhaglenni eBPF i'r cnewyllyn.

Mae'n werth nodi, wrth ddadansoddi ymosodiad amgen yn cynnwys defnyddio'r mecanwaith FUSE yn lle rhwymo i osod cyfeiriadur mawr, daeth yr ymchwilwyr ar draws bregusrwydd arall (CVE-2021-33910) sy'n effeithio ar y rheolwr system systemd. Wrth geisio gosod cyfeiriadur gyda maint llwybr sy'n fwy na 8 MB trwy FUSE, mae'r broses cychwyn rheolaeth (PID1) yn rhedeg allan o gof pentwr a damweiniau, sy'n rhoi'r system mewn cyflwr “panig”.

Y broblem yw bod systemd yn tracio ac yn dosrannu cynnwys /proc/self/mountinfo, ac yn prosesu pob pwynt gosod yn y swyddogaeth unit_name_path_escape(), sy'n cyflawni gweithrediad strdupa() sy'n gosod y data ar y pentwr yn hytrach nag mewn cof a neilltuwyd yn ddeinamig . Gan fod uchafswm maint y pentwr yn gyfyngedig trwy RLIMIT_STACK, mae prosesu llwybr rhy fawr i'r pwynt gosod yn achosi i'r broses PID1 chwalu ac atal y system. Ar gyfer ymosodiad, gallwch ddefnyddio'r modiwl FUSE symlaf ar y cyd â defnyddio cyfeiriadur nythu iawn fel pwynt gosod, y mae maint y llwybr yn fwy na 8 MB.

Mae'r broblem wedi bod yn ymddangos ers systemd 220 (Ebrill 2015), eisoes wedi'i gosod yn y brif ystorfa systemd ac wedi'i gosod mewn dosbarthiadau (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Yn nodedig, mewn datganiad systemd 248 nid yw'r camfanteisio yn gweithio oherwydd nam yn y cod systemd sy'n achosi i brosesu /proc/self/mountinfo fethu. Mae'n ddiddorol hefyd bod sefyllfa debyg wedi codi yn 2018 ac wrth geisio ysgrifennu camfanteisio ar gyfer bregusrwydd CVE-2018-14634 yn y cnewyllyn Linux, daeth ymchwilwyr Qualys ar draws tri gwendid critigol yn systemd.

Ffynhonnell: opennet.ru

Ychwanegu sylw