Radika vundebleco en la Linukso-kerno kaj neo de servo en systemd

Sekurecaj esploristoj de Qualys malkaŝis detalojn pri du vundeblecoj influantaj la Linuksan kernon kaj la sisteman administranton. Vulnerebleco en la kerno (CVE-2021-33909) permesas al loka uzanto atingi kodan ekzekuton kun radikrajtoj per manipulado de tre nestitaj dosierujoj.

La danĝero de la vundebleco estas pligravigita de la fakto, ke la esploristoj povis prepari laborajn ekspluatojn, kiuj funkcias sur Ubuntu 20.04/20.10/21.04, Debian 11 kaj Fedora 34 en la defaŭlta agordo. Oni rimarkas, ke aliaj distribuoj ne estis testitaj, sed teorie ankaŭ estas sentemaj al la problemo kaj povas esti atakataj. La plena kodo de la ekspluataĵoj estas promesita esti publikigita post kiam la problemo estas eliminita ĉie, sed nuntempe nur prototipo de limigita funkcieco estas havebla, kaŭzante la sistemon kraŝi. La problemo ĉeestas ekde julio 2014 kaj influas kernajn eldonojn ekde 3.16. La vundebleco riparo estis kunordigita kun la komunumo kaj akceptita en la kernon la 19-an de julio. La ĉefaj distribuoj jam generis ĝisdatigojn al siaj kernaj pakoj (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

La vundebleco estas kaŭzita de malsukceso kontroli la rezulton de size_t al int-konverto antaŭ ol plenumi operaciojn en la seq_file-kodo, kiu kreas dosierojn el sekvenco de rekordoj. Malsukceso kontroli povas rezultigi eksterlimajn skribojn al la bufro dum kreado, muntado kaj forigo de tre nestita dosierujo-strukturo (vojgrando pli granda ol 1 GB). Kiel rezulto, atakanto povas atingi 10-bajtan ĉenon "//deleted" skribitan ĉe ofseto de "-2 GB - 10 bajtoj" montrante al la areo tuj antaŭ la asignita bufro.

La preta ekspluato postulas 5 GB da memoro kaj 1 milionon da liberaj inodoj por funkcii. La ekspluato funkcias nomante mkdir() por krei hierarkion de ĉirkaŭ miliono da subdosierujoj por atingi dosiervojan grandecon pli ol 1 GB. Ĉi tiu dosierujo estas muntita per bind-mount en aparta uzantnomspaco, post kiu la funkcio rmdir() estas rulita por forigi ĝin. Paralele, fadeno estas kreita, kiu ŝarĝas malgrandan eBPF-programon, kiu estas blokita en la stadio post kontrolado de la eBPF-pseŭdokodo, sed antaŭ ĝia JIT-kompilo.

En la senprivilegia uzantid-nomspaco, la dosiero /proc/self/mountinfo estas malfermita kaj la longa padnomo de la bind-muntita dosierujo estas legita, rezultigante la ĉenon "//deleted" estanta skribita al la areo antaŭ la komenco de la bufro. La pozicio por skribi la linion estas elektita tiel ke ĝi anstataŭigas la instrukcion en la jam testita sed ankoraŭ ne kompilita eBPF-programo.

Poste, ĉe la eBPF-programnivelo, nekontrolita ekster-bufferskribo estas transformita en kontrolitan kapablon legi kaj skribi al aliaj kernstrukturoj tra manipulado de la btf kaj map_push_elem strukturoj. Kiel rezulto, la ekspluato determinas la lokon de la modprobe_path[] bufro en la kernmemoro kaj anstataŭigas la vojon "/sbin/modprobe" en ĝi, kiu ebligas al vi komenci la lanĉon de iu ajn rulebla dosiero kun radikrajtoj en kazo de request_module() voko, kiu estas ekzekutita, ekzemple, dum kreado de netlink socket.

Esploristoj disponigas plurajn solvojn kiuj estas efikaj nur por specifa ekspluato, sed ne forigas la problemon mem. Oni rekomendas agordi "/proc/sys/kernel/unprivileged_userns_clone" al 0 por malŝalti muntajn dosierujojn en aparta uzanta ID-nomspaco, kaj "/proc/sys/kernel/unprivileged_bpf_disabled" al 1 por malŝalti ŝarĝi eBPF-programojn en la kernon.

Estas rimarkinde, ke analizante alternativan atakon implikantan la uzon de la FUSE-mekanismo anstataŭ bind-mound por munti grandan dosierujon, la esploristoj trovis alian vundeblecon (CVE-2021-33910) influantan la sisteman administranton. Montriĝis, ke kiam oni provas munti dosierujon kun padogrando superanta 8 MB per FUSE, la kontrolo-iniciala procezo (PID1) elĉerpigas stakmemoron kaj kraŝas, kio metas la sistemon en "paniko".

La problemo estas, ke systemd spuras kaj analizas la enhavon de /proc/self/mountinfo, kaj prilaboras ĉiun muntan punkton en la funkcio unit_name_path_escape(), kiu faras strdupa() operacion kiu metas la datumojn sur la stakon prefere ol en dinamike asignita memoro. . Ĉar la maksimuma stakgrandeco estas limigita per RLIMIT_STACK, prilaborado de tro granda vojo al la munta punkto igas la PID1-procezon kraŝi kaj haltigi la sistemon. Por atako, vi povas uzi la plej simplan FUSE-modulon kombine kun uzado de tre anstata dosierujo kiel munta punkto, kies padgrandeco superas 8 MB.

La problemo aperas ekde systemd 220 (aprilo 2015), jam estis riparita en la ĉefa systemd-deponejo kaj riparita en distribuoj (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Precipe, en systemd-eldono 248 la ekspluato ne funkcias pro cimo en la systemd-kodo, kiu igas la prilaboradon de /proc/self/mountinfo malsukcesi. Estas ankaŭ interese, ke en 2018, simila situacio aperis kaj kiam ili provis skribi ekspluaton por la vundebleco CVE-2018-14634 en la Linukso-kerno, Qualys-esploristoj trovis tri kritikajn vundeblecojn en systemd.

fonto: opennet.ru

Aldoni komenton