Un bogue dans l’une des fonctions de PHP a permis de contourner les mesures de sécurité destinées à protéger les applications Web contre les entrées d’utilisateurs malveillants, a découvert un chercheur en sécurité.

filter_var() est une fonction populaire qui permet aux développeurs de nettoyer et de valider des chaînes pour différents formats de données tels que les adresses e-mail, les domaines Web et les URL.

Cependant, selon la découvertes du chercheur en sécurité Jordy Zomerla fonction présentait un défaut de bouclage d’entier qui, lorsqu’il était déclenché, obligeait le programme à contourner la logique de filtrage.

Entiers signés et non signés

filter_var() prend une chaîne d’entrée et un argument numérique qui détermine la longueur de la chaîne. La signature de la fonction a défini l’argument de longueur comme un « entier signé », qui divise la plage de variables entre des valeurs négatives et positives.

Cependant, une autre variable de longueur déclarée dans le corps de la fonction a été définie comme un entier non signé, qui n’accepte que des valeurs positives. La non-concordance entre les déclarations signées et non signées pouvait entraîner un comportement erratique lorsque la fonction était fournie avec de très grandes chaînes et faisait sauter le déroulement du programme par-dessus la branche d’instructions qui appliquait des filtres pour les drapeaux de nom d’hôte et de domaine (FILTER_VALIDATE_DOMAIN et FILTER_FLAG_HOSTNAME).

« En raison du fait que le filtre n’est plus valide, tout code qui en dépend comme contrôle de sécurité peut être contourné, ce qui entraîne l’introduction de bogues dans votre code », a déclaré Zomer. La gorgée quotidienne.

« Au cours des recherches filter_var en conjonction avec ces drapeaux, j’ai découvert qu’il est utilisé assez fréquemment en combinaison avec ces drapeaux.

Le bogue pourrait également être utilisé pour organiser des attaques par déni de service (DoS) contre des serveurs Web PHP avec des données légèrement supérieures à 2 Go.

« Mon meilleur conseil est qu’il est vraiment crucial que vous utilisiez toujours les mécanismes d’échappement appropriés lorsque vous placez quelque chose dans un contexte différent de ce qu’il était auparavant », a déclaré Zomer.

« Un autre point à souligner est que le filtrage de vos entrées n’est jamais un moyen efficace de prévenir les vulnérabilités, car différentes situations appellent différentes stratégies d’évasion. »

Impact limité

La faille de contournement du filtre n’est déclenchée que sur une entrée utilisateur très importante, ce qui impose de sévères restrictions à son exploitabilité.

« Il est peu probable que ce bogue ait un impact important, car [of] le fait fondamental qu’il n’influence qu’une sous-fonction spécifique dans une fonction spécifique (à savoir, le filtrage des noms de domaine), et qu’il nécessite plus de 4 Go de taille variable à fournir pour le déclencher », a déclaré Stanislav Malyshev, développeur chez PHP internals. La gorgée quotidienne.

« Toute application PHP correctement configurée devrait avoir des limites de mémoire et des contrôles d’entrée qui n’autorisent pas les données d’entrée de 4 Go pour les noms de domaine – pour la simple raison qu’il n’y a pas de données légitimes qui pourraient avoir des noms de domaine de 4 Go. »

Les défis du maintien des projets bénévoles

Selon Malyshev, le correctif a déjà été archivé dans la source PHP le 28 mars et fera partie de la prochaine version officielle prévue de PHP.

Zomer, qui n’était pas satisfait de la rapidité de l’équipe de sécurité PHP, est allé de l’avant et a publié son propre correctif pour le bogue sur son site Web.

« Ce que fait mon patch est de modifier l’argument de longueur du _php_filter_validate_domain fonction de taille_t à la place de entier, » il a dit. « Cela le convertit en un entier non signé du type approprié et évite qu’il ne se termine par un nombre négatif ou zéro. »

Malyshev a confirmé que Zomer avait signalé le bogue le 2 mars, mais il a fallu quelques jours pour clarifier les détails, et on leur a donné environ deux semaines avant que Zomer ne publie l’article sur son site Web.

« Personnellement, je considère qu’une avance de deux semaines n’est pas suffisante pour un projet de bénévolat, où les gens peuvent être occupés, avoir des vacances, avoir une vie personnelle, etc. et ne sont pas payés pour être de garde pour chaque problème », a-t-il déclaré.

« En fait, de nombreuses grandes entreprises avec des centaines de personnes payées pour le faire mettent plus de temps à publier des correctifs. »

Malyshev a également remis en question certaines des affirmations faites dans la rédaction de Zomer, y compris une preuve de concept qui suggère que le bogue peut être utilisé pour l’exécution de code arbitraire sur le serveur PHP.

« Je préférerais que l’auteur ait un peu plus de patience et ne se précipite pas avec la divulgation », a-t-il déclaré.

Zomer a déclaré: «Il est important de noter que les deux parties ont commis des erreurs en toute équité. Ils auraient dû réagir plus rapidement, et j’aurais dû être plus patient et explicite sur mes attentes dès le début.

« Rétrospectivement, j’aurais dû gérer la situation différemment. Cependant, je développe actuellement une politique de divulgation coordonnée afin d’éviter que de telles erreurs ne se reproduisent de ma part à l’avenir.

N’OUBLIEZ PAS DE LIRE Derniers outils de piratage Web – Q2 2022