Az Exim levelezőszerver critical (), amely távoli kódvégrehajtáshoz vezethet a rendszergazda jogkörével a kifejezetten formázott kérés feldolgozása során. A probléma kihasználásának lehetősége a 4.87-től 4.91-ig terjedő verziókban, illetve az EXPERIMENTAL_EVENT opcióval rendelkező összeállításokban figyelhető meg.
Az alapértelmezett konfigurációban a támadás helyi felhasználó részéről komplikációk nélkül végrehajtható, mivel a „verify = recipient” ACL alkalmazása további ellenőrzéseket végez a külső címek esetén. Távoli támadás végrehajtására lehetőség van a beállítások módosításával, például másik domain másodlagos MX szerepében való működéskor, a „verify = recipient” ACL eltávolításával, vagy bizonyos módosításokkal a local_part_suffix esetében. A távoli támadás szintén lehetséges, ha a támadó képes nyitva tartani a kapcsolatot a szerverrel 7 napig (például egy bájtot küldeni percenként a timeout megszakításának megkerülésére). Ez mellett nem zárható ki, hogy a probléma távoli kihasználásához egyszerűbb támadási vektorok is léteznek.
A sebezhetőség a recipient címének hibás ellenőrzéséből adódik a deliver_message() függvényben, amely a \/src\/deliver.c fájlban található. A cím formázásának manipulálásával a támadó elérheti, hogy a saját adatai beillesztődjenek a parancsok argumentumaiba, amelyeket az execv() függvény hívásával indítanak a rendszergazda jogkörével. Az kihasználáshoz nincsenek szükség olyan összetett technikákra, mint a puffertúlcsordulás vagy a memória sérülése, elegendő csupán karakterek beillesztése.
A probléma az címek átalakításához használt konstrukcióval függ össze:
deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
Az expand_string() függvény egy túlbonyolított kombináló, amely többek között felismeri a "${run{parancs argumentumok}" parancsot, amely külső feldolgozót indít. Így a támadáshoz egy SMTP munkamenet keretein belül a helyi felhasználónak elegendő átadni a következő jellegű parancsot: ‘RCPT TO "username+${run{…}}@localhost"‘, ahol a localhost az egyik a local_domains listájában lévő hosztok közül, míg a username egy létező helyi felhasználó neve.
Ha a szerver levelezési átjáróként működik, elegendő távolról elküldeni a ‘RCPT TO «${run{…}}@relaydomain.com»‘ parancsot, ahol a relaydomain.com a relay_to_domains beállítások szekciójában felsorolt hosztok egyike. Mivel az exim alapértelmezetten nem alkalmaz privilégia csökkentési módot (deliver_drop_privilege = false), a ‘${run{…}}’ által átadott parancsokat root jogosultsággal hajtják végre.
Figyelemre méltó, hogy a sebezhetőség a februárban megjelent 4.92-es kiadásban található, anélkül, hogy hangsúlyozták volna, hogy a javítás biztonsági problémákhoz vezethet. Nincs alapunk azt feltételezni, hogy a Exim fejlesztői tudatosan eltitkolták a sebezhetőséget, mivel a probléma a hibát követően merült fel, amely a hibás címek átadásakor jelentkezett, és a sebezhetőséget a Qualys fedezte fel az Exim változásainak auditálása során.
A régebbi verziók javítása, amelyek továbbra is elérhetők a disztribúciókban, jelenleg csak formájában elérhető. A probléma megoldására vonatkozó javítókiadások a múltbeli ágakhoz június 11-én vannak tervezve. A csomagfrissítések előkészítve vannak a , , . és szolgáltatók a 4.92-es verziót biztosítják, amelyben a probléma nem jelentkezik. A RHEL és a CentOS vonatkozásában , mivel az Exim nem része az alapértelmezett csomag-repozitóriumuknak.
Forrás: opennet.ru
