Ang pagkahuyang sa gamut sa Linux kernel ug pagdumili sa serbisyo sa systemd

Ang mga tigdukiduki sa seguridad gikan sa Qualys nagpadayag sa mga detalye sa duha ka mga kahuyangan nga nakaapekto sa Linux kernel ug sa systemd system manager. Ang pagkahuyang sa kernel (CVE-2021-33909) nagtugot sa usa ka lokal nga tiggamit nga makab-ot ang pagpatuman sa code nga adunay mga katungod sa gamut pinaagi sa pagmaniobra sa mga direktoryo nga adunay daghang salag.

Ang kapeligrohan sa pagkahuyang gipasamot sa kamatuoran nga ang mga tigdukiduki nakahimo sa pag-andam sa pagtrabaho nga mga pagpahimulos nga nagtrabaho sa Ubuntu 20.04/20.10/21.04, Debian 11 ug Fedora 34 sa default configuration. Namatikdan nga ang ubang mga pag-apod-apod wala pa masulayan, apan sa teoriya dali usab nga madala sa problema ug mahimong atakehon. Ang bug-os nga kodigo sa mga pagpahimulos gisaad nga ipatik human ang problema mawagtang bisan asa, apan sa pagkakaron usa lamang ka prototype sa limitadong pagpaandar ang anaa, hinungdan sa pagkahagsa sa sistema. Ang problema naa na sukad Hulyo 2014 ug nakaapekto sa mga pagpagawas sa kernel sugod sa 3.16. Ang pag-ayo sa pagkahuyang gi-coordinate sa komunidad ug gidawat sa kernel kaniadtong Hulyo 19. Ang mga nag-unang distribusyon nakamugna na og mga update sa ilang kernel packages (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ang pagkahuyang tungod sa kapakyasan sa pagsusi sa resulta sa usa ka size_t ngadto sa int nga pagkakabig sa dili pa ipahigayon ang mga operasyon sa seq_file code, nga nagmugna og mga file gikan sa sunod-sunod nga mga rekord. Ang pagkapakyas sa pagsusi mahimong moresulta sa mga out-of-bound nga pagsulat sa buffer kung maghimo, mag-mount, ug magtangtang sa usa ka salag nga istruktura sa direktoryo (gidak-on sa agianan nga labaw sa 1 GB). Ingon usa ka sangputanan, ang usa ka tig-atake mahimong makab-ot ang usa ka 10-byte string "//deleted" nga gisulat sa usa ka offset nga "-2 GB - 10 bytes" nga nagtudlo sa lugar nga nag-una dayon sa gigahin nga buffer.

Ang giandam nga pagpahimulos nanginahanglan 5 GB nga panumduman ug 1 milyon nga libre nga inode aron magamit. Ang pagpahimulos naglihok pinaagi sa pagtawag sa mkdir() aron maghimo usa ka hierarchy nga hapit usa ka milyon nga mga subdirektoryo aron makab-ot ang gidak-on sa agianan sa file nga sobra sa 1 GB. Kini nga direktoryo gi-mount pinaagi sa bind-mount sa usa ka separado nga namespace sa user, pagkahuman ang rmdir () function gipadagan aron makuha kini. Sa susama, gihimo ang usa ka hilo nga nag-load sa usa ka gamay nga programa sa eBPF, nga gibabagan sa entablado pagkahuman gisusi ang pseudocode sa eBPF, apan sa wala pa ang JIT compilation niini.

Sa unprivileged userid namespace, ang file /proc/self/mountinfo giablihan ug ang taas nga pathname sa bind-mounted directory gibasa, nga miresulta sa string "//deleted" nga gisulat sa lugar sa wala pa magsugod ang buffer. Ang posisyon sa pagsulat sa linya gipili aron ma-overwrite niini ang instruksyon sa nasulayan na apan wala pa gihugpong nga eBPF nga programa.

Sunod, sa lebel sa programa sa eBPF, ang dili makontrol nga out-of-buffer nga pagsulat mausab ngadto sa kontrolado nga abilidad sa pagbasa ug pagsulat sa ubang mga istruktura sa kernel pinaagi sa pagmaniobra sa btf ug map_push_elem nga mga istruktura. Ingon usa ka sangputanan, ang pagpahimulos nagtino sa lokasyon sa modprobe_path [] buffer sa kernel memory ug gi-overwrite ang "/ sbin / modprobe" nga agianan niini, nga nagtugot kanimo sa pagsugod sa paglansad sa bisan unsang executable file nga adunay mga katungod sa gamut kung adunay usa ka request_module() nga tawag, nga gipatuman, pananglitan, sa paghimo sa netlink socket.

Naghatag ang mga tigdukiduki daghang mga solusyon nga epektibo lamang alang sa usa ka piho nga pagpahimulos, apan dili mawagtang ang problema mismo. Girekomenda nga i-set ang "/proc/sys/kernel/unprivileged_userns_clone" sa 0 para ma-disable ang mounting nga mga direktoryo sa bulag nga namespace sa user ID, ug "/proc/sys/kernel/unprivileged_bpf_disabled" ngadto sa 1 aron ma-disable ang pagkarga sa mga programa sa eBPF ngadto sa kernel.

Mamatikdan nga samtang nag-analisa sa usa ka alternatibong pag-atake nga naglambigit sa paggamit sa mekanismo sa FUSE imbes nga bind-mound aron i-mount ang usa ka dako nga direktoryo, ang mga tigdukiduki nakit-an ang lain nga pagkahuyang (CVE-2021-33910) nga nakaapekto sa systemd system manager. Nahibal-an nga kung gisulayan nga i-mount ang usa ka direktoryo nga adunay gidak-on nga agianan nga labaw sa 8 MB pinaagi sa FUSE, ang proseso sa pag-initialization sa kontrol (PID1) nahutdan sa memorya sa stack ug nahagsa, nga nagbutang sa sistema sa usa ka "panic" nga kahimtang.

Ang problema mao nga ang systemd nagsubay ug nag-parse sa mga sulod sa /proc/self/mountinfo, ug nagproseso sa matag mount point sa unit_name_path_escape() function, nga naghimo ug strdupa() nga operasyon nga nagbutang sa datos sa stack kaysa sa dynamically allocated memory. . Tungod kay ang pinakataas nga gidak-on sa stack limitado pinaagi sa RLIMIT_STACK, ang pagproseso sa dako kaayo nga agianan paingon sa mount point maoy hinungdan sa proseso sa PID1 nga ma-crash ug mapahunong ang sistema. Alang sa usa ka pag-atake, mahimo nimong gamiton ang pinakasimple nga module sa FUSE inubanan sa paggamit sa usa ka taas nga nested nga direktoryo ingon usa ka mount point, ang gidak-on sa agianan nga molapas sa 8 MB.

Ang problema nagpakita sukad sa systemd 220 (Abril 2015), naayo na sa main systemd repository ug naayo sa mga distribusyon (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Ilabi na, sa systemd release 248 ang pagpahimulos wala molihok tungod sa usa ka bug sa systemd code nga hinungdan sa pagproseso sa /proc/self/mountinfo nga mapakyas. Makapainteres usab nga sa 2018, usa ka susama nga sitwasyon ang mitungha ug sa dihang misulay sa pagsulat sa usa ka pagpahimulos alang sa pagkahuyang sa CVE-2018-14634 sa Linux kernel, ang mga tigdukiduki sa Qualys nakit-an sa tulo ka kritikal nga mga kahuyangan sa systemd.

Source: opennet.ru

Idugang sa usa ka comment