Blog Zscaler

Recevez les dernières mises à jour du blog de Zscaler dans votre boîte de réception

S'abonner
Recherche sur la sécurité

Avis de sécurité concernant le dépassement basé sur la pile ping de FreeBSD CVE-2022-23093

JITHIN NAIR, DHAVAL PAREKH
décembre 09, 2022 - 5 Min de lecture

Contexte 

Le 1er décembre 2022, une vulnérabilité de dépassement de pile CVE-2022-23093 a été trouvée dans l’utilitaire ping du système d’exploitation FreeBSD (toutes les versions prises en charge). Il s’agit d’une vulnérabilité de dépassement de la mémoire tampon affectant la fonction « pr_pack() » dans ping(8). La faille peut être exploitée pour provoquer un dépassement de pile, ce qui pourrait entraîner un plantage ou déclencher l’exécution de code à distance dans ping. 

Quelle est la solution ?

Les détails suivants de la vulnérabilité ont été publiés dans l’avis de sécurité FreeBSD

Ping lit les paquets IP bruts du réseau pour traiter les réponses dans la fonction pr_pack().  Dans le cadre du traitement, une réponse ping doit reconstruire l’en-tête IP, l’en-tête ICMP et, s’il est présent, un paquet cité entre guillemets, qui représente le paquet qui a généré une erreur ICMP.  Le paquet cité entre guillemets comporte à nouveau un en-tête IP et un en-tête ICMP.

Le pr_pack() copie les en-têtes IP et ICMP reçus dans les tampons de pile pour un traitement ultérieur. Ce faisant, il ne prend pas en compte la présence éventuelle d’en-têtes d’option IP suivant l’en-tête IP dans la réponse ou dans le paquet cité entre guillemets.  Lorsque les options IP sont présentes, pr_pack() fait dépasser le tampon de destination jusqu’à 40 octets.

Quelles sont les versions concernées ?

Cette vulnérabilité affecte toutes les versions actuellement prises en charge de FreeBSD.

Que faire pour vous protéger ?

Si vous êtes un client FreeBSD, nous vous encourageons à suivre les étapes suivantes au plus vite :

  • Vérifiez si votre version actuelle est vulnérable.
  • Effectuez une mise à jour vers la version corrigée la plus récente disponible.
  • Dans les cas où la mise à niveau est irréalisable ou impossible, il peut être possible d’appliquer le correctif vers votre version actuelle par rétroportage. D’autres mesures d’atténuation peuvent également être mises en place, telles que le blocage des paquets ICMP avec les options IP via des pare-feu dynamiques, la restriction de l’utilisation du ping sur les hôtes vulnérables aux comptes protégés, et la mise en œuvre d’une posture de sécurité globale avec une défense en profondeur pour détecter et répondre à toute activité anormale sur les hôtes.

Le cloud de Zscaler n’est pas menacé

Après une enquête approfondie, ThreatLabz a déterminé que les composants du service de la plateforme Zscaler n’ont pas été affectés par cette vulnérabilité. Vous pouvez consulter le message de confiance de ThreatLabz ici.

De plus, la plateforme Zscaler repose sur une architecture globale Zero Trust qui offre une défense en profondeur contre les attaques de la chaîne d’approvisionnement et des utilisateurs compromis, ce qui permet d’atténuer les incidents de ce type comme suit :

  • Élimine les déplacements latéraux : Zscaler connecte les utilisateurs directement aux applications, et non au réseau, pour limiter le rayon d’action d’un incident potentiel.
  • Bloque les utilisateurs compromis et les menaces internes : si un hacker accède à votre système d’identité, nous pouvons empêcher toute tentative d’exploitation d’une application privée grâce à l’inspection inline, et détecter les hackers les plus sophistiqués grâce à la tromperie intégrée.
  • Arrête la perte de données : Zscaler inspecte les données en mouvement et au repos pour empêcher tout vol potentiel de données par un hacker actif.

Détails de la vulnérabilité

  • L’utilitaire ping invoqué avec une cible IPv4 (IPv4-host ou IPv4-mcast-group) utilise le datagramme obligatoire ECHO_REQUEST du protocole ICMP pour obtenir une réponse ICMP ECHO_RESPONSE de la part d’un hôte ou d’une passerelle. Les datagrammes ECHO_REQUEST (« pings ») comportent un en-tête IP et ICMP, suivi d’un élément « struct timeval » puis d’un nombre arbitraire d’octets « pad » utilisés pour remplir le paquet.
  • « L’utilitaire ping lit les paquets IP bruts du réseau pour traiter les réponses dans la fonction pr_pack(). Dans le cadre du traitement, une réponse ping doit reconstruire l’en-tête IP, l’en-tête ICMP et, s’il est présent, un paquet cité entre guillemets qui représente le paquet qui a généré une erreur ICMP. Le paquet cité entre guillemets comporte à nouveau un en-tête IP et un en-tête ICMP », révèle le projet FreeBSD dans un avis de sécurité.
  • « Le pr_pack() copie les en-têtes IP et ICMP reçus dans les tampons de pile pour un traitement ultérieur. Ce faisant, il ne prend pas en compte la présence éventuelle d’en-têtes d’option IP suivant l’en-tête IP dans la réponse ou dans le paquet cité entre guillemets. Lorsque les options IP sont présentes, pr_pack() fait dépasser le tampon de destination jusqu’à 40 octets. »

Analyse technique

L’utilitaire ping s’exécute dans l’espace utilisateur. Lorsqu’un utilisateur exécute la commande ping, il appelle le binaire à /sbin/ping. Le code est disponible dans la source FreeBSD. La fonction vulnérable, pr_pack() imprime les informations de réponse du paquet ICMP sur stdout, similaire à la chaîne familière :

64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=86.4 ms

Sur le réseau, le paquet ICMP (requête et réponse) ressemble à ceci :

14.4 ICMP (Internet Control Message Protocol) | Architecture réseau Linux

Les en-têtes du diagramme ci-dessus sont les en-têtes IP, avec un champ Options facultatif. En cas d’attaque, ces options IP sont activées et remplies d’octets non nuls.

Dans certains cas, par exemple, si le format d’un paquet ICMP est incorrect ou délibérément modifié lors du transfert vers l’hôte de destination et que les options IP sont activées dans la requête ECHO_REQUEST d’origine, le système vulnérable pr_pack() ne parvient pas à allouer suffisamment d’espace sur la pile pour tenir compte de la présence des options IP, ce qui entraîne un dépassement de la pile.

Dans ces cas d’erreur, la réponse de l’hôte de destination peut également inclure un paquet cité entre guillemets dans la section de données (qui détermine quel paquet est spécifiquement à l’origine de l’erreur ICMP), et la fonction pr_pack() fait dépasser la pile de la même manière que dans le cas où le paquet cité a des en-têtes ICMP.

Le dépassement de tampon se produit à la ligne 1156 et à la ligne 1161 dans la fonction pr_pack() (définie dans ping.c) ici :

Image

La valeur de hlen est calculée sans vérifier l’en-tête des options IP, en supposant que la longueur d’en-tête du paquet IP standard est de 20 octets. Le memcpy dans la structure icp entraîne un dépassement de tampon.

Références

  1. https://www.freebsd.org/security/advisories/FreeBSD-SA-22:15.ping.asc
  2. https://vuldb.com/?id.214613
form submtited
Merci d'avoir lu l'article

Cet article a-t-il été utile ?

dots pattern

Recevez les dernières mises à jour du blog de Zscaler dans votre boîte de réception

En envoyant le formulaire, vous acceptez notre politique de confidentialité.