05/12/2024 6 Minutes read Tech 

Du forum PHP à un cas pratique: vérification des uploads coté serveur

Il y a encore 10 mois, avant mon arrivée en tant qu’ingénieur PHP junior chez ekino, je ne pensais pas écrire d’articles et je regardais les conférences du forum PHP via leurs vidéos. ekino m’a permis d’aller soutenir nos speakers, Nerea Enrique et Julien Joye. Grâce à cette expérience, j’ai pu assister à mes premières conférences en tant que spectateur, et écrire cet article pour partager mon expérience et les découvertes qui en découlent.

photo de la conférence

Ma première conférence

La première conférence à laquelle j’ai assisté s’intitulait “Créer sa Malware Sandbox en PHP” présentée par Alexandre DAUBOIS.

Dans cette conférence, il explique une expérience professionnelle à laquelle il a été confronté après un pentest pour son client. Ce pentest révèle une faille au niveau de l’upload de fichier et après nous avoir expliqué 3 approches différentes possibles, il a détaillé celle qui a été retenue.

La solution a été choisie pour un rapport sécurité/simplicité à la mise en place. Il peut être intéressant de noter qu’elle n’est peut-être pas la solution ayant une sécurité maximale. En nous expliquant bien que dans le cas d’usage de son client, seuls des fichiers uploadés par des utilisateurs authentifiés sont concernés. Cela permet de se dire que le risque de tentative volontaire d’acte malveillant est plus limité et l’utilisateur qui a envoyé le fichier peut être identifié.

Il nous a donc décrit les étapes qu’il a suivies :

  • Vérification du nom de fichier, des caractères illégaux, absence d’extension php
  • Donner les permissions les plus restrictives sur les fichiers
  • Bloquer les archives avec des recursions infinies en contrôlant la profondeur
  • Supprimer les permissions d’exécution sur tous les fichiers dont celles contenus dans des archives (les fichiers tar créés avec l’option -p gardent les permissions originales des fichiers)
  • Vérification du type de permission grâce aux décalages de bytes
  • Vérification du type de fichier, partie sur laquelle Alexandre a passé du temps, en rappelant que le check d’une extension ou bien du mime type n’est pas suffisant, pour ne pas dire inutile car trop facilement contournable.
illustration pour imager les magic bytes

Magic bytes

La solution qu’Alexandre a choisie pour vérifier le type de fichier repose sur la détection des magic bytes. C’était pour moi la première fois que j’en entendais parler, pourtant ce n’est pas récent, introduit dans Unix 7 et depuis utilisé partout. Les magic bytes, également appelés signatures de fichiers ou nombres magiques, ont été introduits pour résoudre le problème de l’identification des fichiers.

Pour vulgariser, je dirais que les magic bytes sont des séquences spécifiques de bits au début d’un fichier (dans le header) qui indiquent son format. Ces séquences permettent aux systèmes d’exploitation et aux logiciels de reconnaître le type de fichier sans se fier à son extension.

Par exemple, les fichiers JPEG commencent généralement par les bytes, sous forme hexadécimale, FF D8 FF, tandis que les fichiers PNG commencent eux par 89 50 4E 47 0D 0A 1A 0A.

Liste des correspondances de signatures de fichiers disponible.

Voici mon implémentation sommaire pour vérifier un JPEG :

https://medium.com/media/b402abd4fe01099a849ebd77e083fece/href

Conclusion de la conférence

Alexandre a conclu en rappelant que la sandbox qu’ils ont mise en place était très bien adaptée à leur stratégie et à leur cas d’utilisation. Elle a permis de résoudre la faille qu’ils ont trouvée lors du test de pénétration, mais pour un cas plus sécurisé de l’upload de fichier, il était plus intéressant de se tourner vers des solutions spécialisées comme ClamAV.

Je pense donc que ce qu’il nous a montré est très utile et simple à mettre en place. Je considère que cette Sandbox est à utiliser par défaut pour de l’upload de document.

illustration pour imager le titre ci-dessous

Fin du forum dans le monde de Mickey

… et retour à la réalité. J’entre donc dans la partie de l’article post-forum. J’ai repris mes notes, et ma curiosité m’a amené à installer ClamAV et à mettre en pratique le scan des fichiers que j’uploadais.

ClamAV, ou Clam AntiVirus, est un antivirus que j’avais croisé plusieurs fois mais je n’avais jusqu’à présent jamais porté mon attention dessus. Après mes premières recherches, il semble pourtant puissant et possède la capacité de détecter des millions de virus, vers, chevaux de Troie et autres logiciels malveillants. Exactement comme les antivirus que j’installais sur ma machine Windows plus jeune, que ce soit Avast ou Panda.

Ici, je pense qu’il est important de le préciser : c’est la seule solution open source (sous licence GPL) que j’ai trouvée dans cette liste d’antivirus. C’est toujours intéressant à savoir, il est compatible Mac, Windows et Linux.

La documentation de ClamAV est disponible ici.

Des intégrations comme des modules pour Drupal, des validateurs pour Laravel ou des clients pour Symfony existent (je ne les ai pas testé).

À mon tour de tester

Illustration de mon objectif

Avant de s’attaquer à notre application, il faut commencer par installer ClamAV sur notre OS. Dans la documentation, j’ai lu qu’une image Docker existait. Parfait pour tester rapidement, donc je fonce et je me fais un petit projet docker avec cette image.

Pour rappel, mon objectif premier est de m’en servir pour vérifier les fichiers qui sont uploadés (cf schéma ci dessus). Pour ma part, je vais partir sur un upload dans la forme la plus simple de PHP pour tester le client appwrite/php-clamav, qui semble correspondre à mon besoin.

https://medium.com/media/0067b91439f0fd8d6351d253b9dbf955/href

Attention pour la partie PHP, il est nécessaire d’ajouter l’extension socket et zip.

https://medium.com/media/1b353fc60019dc5b560cea634cfa0c82/href

La configuration de Clamav est remplie de paramètres configurables et intéressants que je vous laisserai consulter chaque paramètre étant bien expliqué en commentaire. Elle est située dans
/etc/clamav/clamd.conf

https://medium.com/media/36891790f90e9c0d1a551a8ad68dbaa1/href

J’ai fait mes tests, joué avec la configuration, lu des articles, mais au final, je comprends que ClamAV ne remplace pas du tout la sandbox qu’Alexandre nous a montrée, mais la complète et permet d’écarter rapidement les fichiers suspects. ClamAV est capable de faire de la détection par signature et bien plus, comme détecter des menaces nouvelles ou inconnues en analysant les fichiers grâce à des comportements ou des structures typiques des malwares. Il n’est en rien une substitution aux contrôles effectués dans la sandbox d’Alexandre.

La sandbox

  • (+) Contrôle les permissions des fichiers
  • (+) Empêche l’exécution d’un fichier
  • (+) Empêche la copie du fichier s’il n’est pas conforme
  • (+) Vérifie la conformité du type de fichier attendu par rapport à son extension
  • (-) N’analyse pas le fichier

L’antivirus

  • (-) Analyse les fichiers une fois l’upload terminé
  • (+) Analyse de manière approfondie le fichier (comportement, structure)
  • (+) Agit en conséquence des règles défini sur le serveur

La combinaison des 2

  • (+) Évite le stockage dans la destination définitive d’un fichier pouvant être un malware
  • (+) Permet d’avoir un retour au niveau de l’utilisateur et donc l’informer de la non-prise en compte de son fichier

ClamAV est donc complémentaire et vient juste s’assurer du côté “goodware” de vos fichiers.

J’ai discuté avec mes collègues et me suis informé sur la présence de ce genre d’antivirus sur nos projets professionnels. La présence des antivirus sur nos serveurs existe bel et bien. Heureusement, parce que si je suis sorti de cette conférence naïf en pensant que le check des magic bytes est la solution ultime pour vérifier l’intégrité d’un fichier, j’ai rapidement remis les pieds sur terre en m’informant et en découvrant que ce n’est pas incassable, bien au contraire. Je vous renvoie donc vers ces 2 articles, qui ne forment qu’une goutte dans l’océan d’informations à ce sujet :

Antivirus et Sandbox, même combats

Conclusion de mon expérience

La sandbox qu’Alexandre a mise en place me semble être une bonne pratique qui devrait être adoptée dans toutes les possibilités d’upload que l’on met à disposition de nos utilisateurs. Là où je pensais que ClamAV pouvait remplacer cette sandbox, j’en ai conclu qu’il permet uniquement de l’améliorer en offrant plus de garanties et de vérifications sur mes fichiers et le système dans sa globalité.

Comme toujours dans ce merveilleux domaine qu’est l’informatique, j’ai découvert beaucoup de choses qui méritent d’être approfondies et je remercie Alexandre qui m’a permis de découvrir des choses qui semblent basiques au premier abord et pourtant peuvent cacher des implémentations plus complexes comme le check de permission.

Mes conseils

Un conseil que je peux adresser aux développeurs juniors comme moi; ne restez pas spectateurs. Quand vous regardez une conférence qui parle d’un outil ou d’un sujet, il est toujours intéressant d’aller plus loin dans l’approche et, à minima, de lire d’autres sources sur les solutions évoquées. Installez la solution et pratiquez quelques minutes (qui deviendront sûrement heures) pour vous forger votre propre avis.

Pour finir, et c’est un peu le but de cet article, je vous invite à découvrir les vidéos des conférences du Forum PHP 2024 qui sortent tous les matins, du lundi au dimanche, du 1er décembre au 24 décembre. Elles sont disponibles sur la chaîne YouTube de l’AFUP.


Du forum PHP à un cas pratique: La vérification des uploads coté serveur was originally published in ekino-france on Medium, where people are continuing the conversation by highlighting and responding to this story.