Squidbleed: Un bug de 29 ans trouvé dans le proxy Squid. Exactement à partir du modèle d'IA qui a été banni peu de temps après

Hier, j'avais parlé de Bannière de fable et de mythe rapporté par le gouvernement américain et à peine l'encre était-elle sèche, apparaît une histoire qui complète le tout avec une certaine ironie.

En effet, le modèle même que Washington venait de retirer du réseau était occupé peu de temps auparavant à détecter une faille de sécurité vieille de près de 30 ans dans l'un des logiciels proxy les plus utilisés au monde.

Publié avec des clins d'oeil sur calif.io – Meet Squidbleed.

Qu'est-ce que Squid?

Squid est un proxy Web largement utilisé qui se trouve principalement dans les réseaux d'entreprise, les écoles et partout où le trafic doit être filtré, mis en cache ou surveillé. Quiconque s’est déjà assis au bureau ou dans le Wi-Fi d’un aéroport et s’est rendu compte que certaines pages étaient bloquées – il y a souvent Squid derrière cela. C'est une institution.

Et comme c'est parfois le cas pour les institutions: Sous la surface soignée, il y a parfois du code qui vient d'une autre époque.

Le bug: Un voyage dans le temps en 1997

Le cœur de Squidbleed réside dans l’analyseur FTP de Squid – oui, FTP, le protocole que la plupart des navigateurs modernes ont supprimé de leur répertoire il y a des années. Squid prend toujours en charge FTP par défaut.

Le problème: FTP n'a pas de format normalisé lisible par machine pour les listes de fichiers. Chaque serveur fournit cela comme un bloc de texte, et Squid doit analyser cette confusion. Un commit de 18 janvier 1997 (Pour les plus jeunes lecteurs: C'est plus ancien que Google!) a intégré un traitement spécial pour les serveurs FTP NetWare, qui placent quatre espaces entre l'horodatage et le nom du fichier au lieu d'un espace.

Le fix à l'époque: Une boucle qui ignore l'espace blanc jusqu'à ce que le nom du fichier commence.

Le problème est le suivant: strchr() Une fonction de bibliothèque C standard renvoie un résultat même après le terminateur zéro. \0 cherche. C'est-à-dire: Si aucun nom de fichier ne suit après l'horodatage, le pointeur continue tout simplement au-delà de la fin du tampon. Et plus loin. Et plus loin. Jusqu'à ce qu'il rencontre des données qui n'appartiennent plus à la liste FTP.

Ce qui se passe ensuite, c'est le problème qui donne son nom: Le proxy lit les données de tas étrangères et les renvoie à l'attaquant sous forme de noms de fichiers supposés.

Trop complexe? C'est aussi plus facile:

D'accord, imaginez que vous êtes bibliothécaire dans une immense bibliothèque. Votre tâche est d'obtenir des livres pour vos visiteurs. Quelqu'un entre et dit: «S'il te plaît, prends-moi le livre de l'étagère 7!» Vous allez donc y aller, prenez-le, c'est prêt. Voici Squid: Un intermédiaire qui apporte des choses pour les autres.

La boîte à lettres

Dans cette bibliothèque, il y a aussi une vieille boîte aux lettres pour les serveurs FTP. FTP est un ancien système de transfert de fichiers. Imaginez-vous comme un très, très vieux classeur des années 80, que personne n'utilise plus, mais qui est encore dans le coin parce que personne ne l'a nettoyé. Si quelqu’un demande «qu’y a-t-il dans ce classeur?», Squid y va, lit les étiquettes des dossiers et les écrit sur une note.

Le problème avec le papier

Maintenant vient l'erreur. Squid lit l’étiquette d’un classeur, par exemple «Date: 16 janvier, nom du fichier: …», puis recherche le nom du fichier. Il utilise un petit assistant appelé strchr, qui dit: «Va jusqu’à ce que tu trouves quelque chose qui n’est pas un espace.»

Mais que se passe-t-il s'il n'y a pas de nom de fichier après la date? Le bon sens dit: « Alors arrête de chercher. » strchr Ce n'est pas ce que je pense. Il continue à chercher. Au-delà de la note. Au-delà du portefeuille. Au-delà du classeur. Il continue à lire tout ce qui ne va pas.

Qu'y a-t-il à côté?

Dans l'analogie de la bibliothèque: A côté se trouvent les notes d'autres visiteurs. Des lettres sur lesquelles il est écrit: «L’utilisateur Max s’est connecté aujourd’hui avec le mot de passe XY» ou «l’utilisateur Lisa vient d’entrer son numéro de carte de crédit». Squid lit tout cela parce que strchr n’a pas cessé de chercher, puis le renvoie bravement sous la forme d’un «nom de fichier» à celui qui l’a demandé.

Qu'est-ce qu'un agresseur peut en tirer?

Squid recycle en interne les tampons de stockage. Un tampon de 4 Ko qui contenait la requête HTTP d'un autre utilisateur du même proxy peut être réutilisé pour la liaison FTP peu de temps après, sans que l'ancien contenu ne soit supprimé. L'overread lit alors exactement ces restes et les envoie à l'attaquant.

En clair: En-têtes d'autorisation, mots de passe, clés API. Tout ce que les autres utilisateurs du même proxy envoient par la ligne. Upsi.

Les restrictions sont réelles: Seul HTTP non chiffré est affecté (HTTPS fonctionne comme un tunnel CONNECT opaque à travers le proxy), et l'attaquant a besoin d'un serveur FTP que le proxy est effectivement autorisé à atteindre. Le port TCP 21 est inclus dans l'ACL standard de Squid. Aucune configuration n'est nécessaire tant que vous pouvez utiliser un serveur FTP n'importe où.

Qui a trouvé ça?

Voici la partie qui m'intéresse particulièrement en tant que personne qui a écrit sur le bannissement de Fable hier. L'équipe de recherche en sécurité de Calif.io a Claude Mythos en avant-première (c'est-à-dire le modèle qui a été interdit par Washington peu de temps après) déjà envoyé dans le code source de Squid en avril. Avec l'instruction d'examiner de plus près le code FTP-State-Machine.

Le modèle a trouvé le bug presque immédiatement et l'a justifié en se référant à la norme C11: strchr(w _space, '\0') renvoie un pointeur non nul par spécification, car le terminateur nul fait partie de la chaîne. Un détail que personne n'avait visiblement remarqué en près de 30 ans d'examens de code, de réécritures et d'audits.

Le correctif est d'ailleurs très simple, deux contrôles zéro supplémentaires avant le strchr-Appel à propositions:

- while (strchr(w_space, *copyFrom)) + while (*copyFrom && strchr(w_space, *copyFrom))

Une journée de travail pour les mainteneurs. Près de trois décennies dans le noir.

Que faire maintenant

Qui gère Squid: Désactiver le FTP, Si vous n'en avez pas besoin activement. Chrome a supprimé le support FTP il y a des années, Firefox aussi. Si vous n'envoyez pas de trafic FTP légitime via votre proxy (il est prudent de supposer que 2026 sera le plus important), vous pouvez simplement désactiver la fonctionnalité et éliminer toute la surface d'attaque.

Addendum : Pour tous les autres: Squid 7.6 (publié le 8 juin 2026) et Squid 8 Contient déjà le patch (Merci Golem pour l'annonce). L'avis officiel est paru le 24 juin. Ceux qui sont encore assis sur les anciennes versions devraient mettre à jour.

La vraie conclusion

Techniquement, Squidbleed n'est pas un RCE mondial, pas un miracle du zéro clic. C'est un Heap-Overread avec un impact situationnel. Mais c'est symptomatique de quelque chose qui se passe régulièrement dans le monde open source: Code en cours d'exécution depuis des décennies, qui n'est plus vraiment compris par personne et dans lequel les subtiles propriétés C s'écroulent silencieusement.

C'est précisément un modèle d'IA qui a trouvé ce bug, le modèle, Peu de temps après, le gouvernement américain a jugé que c'était trop dangereux. a une certaine qualité. La capacité de trouver des failles de sécurité semble être exactement ce qui a inquiété Washington. Que ce soit un argument pour ou contre l'interdiction, je vous laisse.

La réponse se trouve quelque part entre les lignes d'hier.