Dans le serveur de messagerie Exim critique (), ce qui peut conduire à une exécution de code à distance sur le serveur avec des droits root lors du traitement d'une requête spécialement formattée. La possibilité d'exploitation du problème est notée dans les versions de 4.87 à 4.91 inclusivement ou lors de la compilation avec l'option EXPERIMENTAL_EVENT.
Dans la configuration par défaut, l'attaque peut être effectuée sans complications supplémentaires par un utilisateur local, car un ACL « verify = recipient » est appliqué, effectuant des vérifications supplémentaires pour les adresses externes. Une attaque à distance est possible si les paramètres sont modifiés, par exemple, lors du fonctionnement en tant que MX secondaire pour un autre domaine, en supprimant l'ACL « verify = recipient » ou en effectuant certaines modifications dans local_part_suffix). Une attaque à distance est également possible si un attaquant peut maintenir la connexion avec le serveur ouverte pendant 7 jours (par exemple, en envoyant un octet par minute pour éviter de perdre la connexion par timeout). Il n'est pas exclu qu'il existe des vecteurs d'attaque encore plus simples pour une exploitation à distance du problème.
La vulnérabilité est causée par une vérification incorrecte de l'adresse du destinataire dans la fonction deliver_message(), définie dans le fichier /src/deliver.c. Par la manipulation du formatage de l'adresse, un attaquant peut obtenir l'insertion de ses propres données dans les arguments de la commande appelée via la fonction execv() avec des droits root. Aucune technique complexe, souvent utilisée lors des débordements de tampon ou de la corruption de la mémoire, n'est requise pour l'exploitation, une simple substitution de caractères suffit.
Le problème est lié à l'utilisation pour la conversion d'adresses de la construction :
deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
La fonction expand_string() est un combiné surchargé, reconnu entre autres pour la commande "${run{commande arguments}", entraînant l'exécution d'un traitement externe. Ainsi, pour attaquer dans le cadre d'une session SMTP, il suffit à un utilisateur local de transmettre une commande de type ‘RCPT TO "username+${run{…}}@localhost"‘, où localhost est l'un des hôtes de la liste des local_domains, et username est le nom d'un utilisateur local existant.
Si le serveur fonctionne en tant que relais de messagerie, il suffit d'envoyer la commande 'RCPT TO «${run{…}}@relaydomain.com»', où relaydomain.com est l'un des hôtes énumérés dans la section des paramètres relay_to_domains. Comme par défaut dans Exim, le mode de suppression des privilèges (deliver_drop_privilege = false) n'est pas appliqué, les commandes passées via «${run{…}}» seront exécutées avec les droits root.
Il est à noter que la vulnérabilité a été dans la version 4.92 publiée en février, sans insister sur le fait que le correctif pouvait entraîner des problèmes de sécurité. Il n'y a aucune raison de croire qu'il y a eu une dissimulation délibérée de la vulnérabilité par les développeurs d'Exim, car le problème a été résolu pendant une panne causée par la transmission d'adresses incorrectes, et la vulnérabilité a été découverte par l'entreprise Qualys lors d'un audit des changements dans Exim.
Le correctif pour les anciennes versions, qui continuent à être utilisées dans les distributions, est disponible uniquement sous forme de . Des versions corrigées pour les anciennes branches avec résolution du problème sont prévues pour le 11 juin. Des mises à jour de paquets ont été préparées pour , , . et fournissant la version 4.92, dans laquelle le problème ne se manifeste pas. RHEL et CentOS examinent , car Exim ne fait pas partie de leur référentiel de paquets standard.
Source : opennet.ru
