În serverul de e-mail Exim critică (), care poate duce la execuția de cod de la distanță pe server cu drepturi de root în urma procesării unei cereri special formate. Posibilitatea exploatării problemei a fost observată în versiunile de la 4.87 la 4.91 inclusiv sau la compilarea cu opțiunea EXPERIMENTAL_EVENT.
În configurația implicită, atacul poate fi efectuat fără complicații suplimentare de un utilizator local, deoarece se aplică ACL „verify = recipient”, care efectuează verificări suplimentare pentru adresele externe. Efectuarea unui atac de la distanță este posibilă prin modificarea setărilor, de exemplu, când funcționează ca MX secundar pentru un alt domeniu, eliminarea ACL „verify = recipient” sau anumite modificări în local_part_suffix). Un atac de la distanță este, de asemenea, posibil dacă atacatorul reușește să mențină conexiunea cu serverul deschis timp de 7 zile (de exemplu, trimițând câte un byte pe minut pentru a evita întreruperea prin timeout). Totodată, nu se exclude că pentru exploatarea de la distanță a problemei există și vectori de atac mai simplu.
Vulnerabilitatea este cauzată de verificarea incorectă a adresei destinatarului în funcția deliver_message(), definită în fișierul /src/deliver.c. Prin manipularea formatării adresei, atacatorul poate obține substituirea datelor sale în argumentele comenzii apelată prin funcția execv() cu drepturi de root. Pentru exploatare nu sunt necesare tehnici complexe, folosite în cazul depășirilor de buffer sau coruperii memoriei, fiind suficientă doar substituirea simbolurilor.
Problema este legată de utilizarea pentru conversia adreselor a construcției:
deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
Funcția expand_string() este un combinator suprasolicitat, recunoscând de asemenea comanda „${run{comanda argumente}”, care duce la executarea unui proces extern. Astfel, pentru atac în cadrul unei sesiuni SMTP, utilizatorului local îi este suficient să transmită o comandă de tipul ‘RCPT TO "username+${run{…}}@localhost"’, unde localhost este unul dintre hosturile din lista local_domains, iar username este numele unui utilizator local existent.
Dacă serverul funcționează ca un relai de email, este suficient să trimiteți comanda ‘RCPT TO «${run{…}}@relaydomain.com»‘, unde relaydomain.com este unul dintre gazdele enumerate în secțiunea de setări relay_to_domains. Deoarece, în mod implicit, Exim nu aplică modul de eliminare a privilegiilor (deliver_drop_privilege = false), comenzile transmise prin «${run{…}}» vor fi executate cu drepturile root.
Este demn de menționat că vulnerabilitatea a fost în versiunea 4.92 lansată în februarie, fără a sublinia faptul că remedierea ar putea duce la probleme de securitate. Nu există motive suficiente pentru a considera că dezvoltatorii Exim au ascuns conștient vulnerabilitatea, având în vedere că problema a fost rezolvată în timpul erorii ce apare la transmiterea de adrese incorecte, iar vulnerabilitatea a fost descoperită de compania Qualys în timpul unui audit al modificărilor din Exim.
Remedierea pentru versiunile anterioare, care continuă să fie utilizate în distribuții, este disponibilă momentan doar sub formă de . Relațiile corective pentru ramurile anterioare cu soluționarea problemei sunt programate pentru 11 iunie. Actualizările pachetelor au fost pregătite pentru , , . și distribuie versiunea 4.92, în care problema nu apare. RHEL și CentOS nu sunt , deoarece Exim nu face parte din depozitul lor standard de pachete.
Sursa: opennet.ro
