„Qualys“ saugumo tyrėjai
Problemą sukelia sveikojo skaičiaus perpildymas funkcijoje stralloc_readyplus(), kuris gali atsirasti apdorojant labai didelį pranešimą. Operacijai reikėjo 64 bitų sistemos su daugiau nei 4 GB virtualios atminties. Kai 2005 m. iš pradžių buvo analizuojamas pažeidžiamumas, Danielis J. Bernsteinas teigė, kad prielaida kode, kad paskirstytos masyvo dydis visada neviršija 32 bitų reikšmės, yra pagrįsta tuo, kad niekas neteikia gigabaitų atminties kiekvienam procesui. Per pastaruosius 15 metų 64 bitų sistemos serveriuose pakeitė 32 bitų sistemas, o tiekiamos atminties kiekis ir tinklo pralaidumas smarkiai išaugo.
qmail paketo prižiūrėtojai atsižvelgė į Bernstein pastabą ir apribojo laisvą atmintį, kai pradeda qmail-smtpd procesą (pavyzdžiui, Debian 10 versijoje limitas nustatytas į 7 MB). Tačiau Qualys inžinieriai nustatė, kad to nepakanka ir, be qmail-smtpd, galima atlikti nuotolinę ataką prieš qmail-local procesą, kuris liko neapribotas visuose išbandytuose paketuose. Kaip įrodymas buvo paruoštas išnaudojimo prototipas, kuris buvo tinkamas atakuoti Debian paketą naudojant qmail pagal numatytąją konfigūraciją.
Norint organizuoti nuotolinį kodo vykdymą atakos metu, serveriui reikia 4 GB laisvos vietos diske ir 8 GB RAM.
Išnaudojimas leidžia paleisti bet kokias apvalkalo komandas su bet kurio sistemos vartotojo teisėmis, išskyrus root ir sistemos vartotojus, kurie neturi savo pakatalogio „/home“ kataloge (paleidžiamas qmail-local procesas su teisėmis vietinio vartotojo, kuriam pristatoma).
Ataka vykdoma
siunčiant labai didelį pašto pranešimą, įskaitant keletą antraštės eilučių, kurių dydis yra maždaug 4 GB ir 576 MB. Apdorojant tokią eilutę programoje qmail-local, bandant pristatyti pranešimą vietiniam vartotojui atsiranda sveikojo skaičiaus perpildymas. Sveikojo skaičiaus perpildymas sukelia buferio perpildymą kopijuojant duomenis ir galimybę perrašyti atminties puslapius libc kodu. Manipuliuojant perduodamų duomenų išdėstymu, taip pat galima perrašyti funkcijos „open()“ adresą, pakeičiant jį funkcijos „sistema()“ adresu.
Toliau, iškviečiant qmesearch() qmail-local, failas „.qmail-extension“ atidaromas naudojant funkciją open(), kuri veda prie faktinio funkcijos vykdymo.
system(.qmail-extension"). Tačiau kadangi failo dalis „plėtimas“ sugeneruojama pagal gavėjo adresą (pvz., „localuser-extension@localdomain“), užpuolikai gali pasirūpinti, kad komanda būtų išsiųsta, nurodydami vartotoją „localuser-;command“. ;@localdomain“ kaip pranešimo gavėjas.
Atliekant kodo analizę, papildomame „qmail-verify“ pataisyme, kuris yra „Debian“ paketo dalis, taip pat buvo nustatyti du pažeidžiamumai. Pirmasis pažeidžiamumas (
Norėdami išspręsti problemą, Bernstein rekomendavo paleisti qmail procesus su bendru laisvos atminties apribojimu ("softlimit -m12345678"), tokiu atveju problema blokuojama. Kaip alternatyvus apsaugos būdas taip pat minimas maksimalaus apdorojamo pranešimo dydžio ribojimas per failą „control/databaites“ (pagal numatytuosius nustatymus jis nesukuriamas su numatytaisiais nustatymais, qmail išlieka pažeidžiamas). Be to, "kontrolė/duomenų baitai" neapsaugo nuo vietinių sistemos vartotojų atakų, nes į limitą atsižvelgia tik qmail-smtpd.
Problema turi įtakos paketui
Šaltinis: opennet.ru