Sårbarhet i ld.so OpenBSD

Dynamisk laster ld.så, inkludert i OpenBSD, kan under visse betingelser, SUID/SGID- applikasjoner forlater miljøvariabelen LD_LIBRARY_PATH og lar dermed tredjepartskode lastes i sammenheng med en prosess som kjører med forhøyede rettigheter. Patcher som fikser sårbarheten er tilgjengelige for utgivelser 6.5 и 6.6. Binære patcher (syspatch) for amd64, i386 og arm64-plattformene er allerede i produksjon og bør være tilgjengelige for nedlasting når denne nyheten publiseres.

Essensen av problemet: under drift trekker ld.so først ut verdien av LD_LIBRARY_PATH-variabelen fra miljøet, og ved å bruke funksjonen _dl_split_path() gjør den om til en rekke strenger - stier til kataloger. Hvis det senere viser seg at den gjeldende prosessen startes av en SUID/SGID-applikasjon, slettes den opprettede matrisen og faktisk LD_LIBRARY_PATH-variabelen. På samme tid, hvis _dl_split_path() går tom for minne (noe som er vanskelig på grunn av den eksplisitte 256 kB-grensen på størrelsen på miljøvariabler, men teoretisk mulig), vil _dl_libpath-variabelen motta verdien NULL, og påfølgende kontroller av verdien av denne variabelen vil tvinge til å hoppe over kallet til _dl_unsetenv("LD_LIBRARY_PATH").

Sårbarhet funnet av eksperter Qualy sin, i tillegg til flere tidligere avslørt problemer. Sikkerhetsforskerne som identifiserte sårbarheten la merke til hvor raskt problemet ble løst: en oppdatering ble utarbeidet og oppdateringer ble utgitt innen tre timer etter at OpenBSD-prosjektet mottok varsling.

Tillegg: Problemet har blitt tildelt et nummer CVE-2019-19726. Laget på oss-security-postlisten offisiell kunngjøring, inkludert en prototypeutnyttelse som kjører på OpenBSD 6.6, 6.5, 6.2 og 6.1 arkitekturer
amd64 og i386 (utnyttelsen kan tilpasses for andre arkitekturer).
Problemet kan utnyttes i standardinstallasjonen og lar en uprivilegert lokal bruker kjøre kode som root via bibliotekerstatning når verktøyene chpass eller passwd suid kjøres. For å opprette forholdene med lavt minne som er nødvendige for drift, sett RLIMIT_DATA-grensen via setrlimit.

Kilde: opennet.ru

Legg til en kommentar