- Dans l’éditeur de Substack, la saisie de certains chemins système provoque une erreur réseau
- Un pare-feu applicatif web (WAF) bloque ces chemins afin d’empêcher les attaques de traversée de répertoires et les attaques par injection de commandes
- La question de l’équilibre entre sécurité et ergonomie devient centrale
- Une meilleure solution est nécessaire pour les rédacteurs techniques
- Il est possible de contourner le problème en utilisant un chemin alternatif
Quand /etc/h*sts perturbe l’éditeur Substack : l’aventure du filtrage de contenu web
Une mystérieuse erreur réseau
- Une erreur inattendue survient pendant la rédaction d’un article technique sur la résolution DNS
- La saisie du chemin
/etc/h*stsdéclenche une erreur réseau et l’enregistrement automatique échoue - La page d’état de Substack indique pourtant que le service fonctionne normalement
Début de l’enquête
- L’erreur se produit lors de la saisie d’un chemin de fichier précis, alors que des variantes du chemin fonctionnent normalement
- Des chemins comme
/etc/h*stsprovoquent l’erreur, tandis que des versions modifiées ne posent aucun problème
Que se passe-t-il en coulisses ?
- Les outils de développement du navigateur montrent une réponse 403 Forbidden
- Cloudflare est impliqué
Comprendre les filtres de sécurité des applications web
Brève explication d’un WAF
- Un pare-feu applicatif web (WAF) joue le rôle de gardien de sécurité d’un site web
- Il bloque les requêtes jugées suspectes
Attaques de traversée de répertoires : pourquoi c’est surveillé
- Une attaque de traversée de répertoires cherche à accéder à des fichiers système sensibles
- Des chemins comme
/etc/h*stspeuvent être considérés comme des cibles d’attaque
Injection de commandes : un autre problème de sécurité
- Une attaque par injection de commandes vise à faire exécuter des commandes système
- Lorsqu’un chemin système est mentionné, le filtre peut le bloquer
Le mystère s’épaissit : un précédent historique
- Des cas similaires d’utilisation de tels chemins ont été trouvés dans d’autres publications Substack
- Il est possible que le comportement de filtrage ait changé à un moment donné
Sécurité contre ergonomie : un équilibre délicat
- Les filtres de Substack visent à protéger la plateforme, mais deviennent un obstacle pour les rédacteurs techniques
- Il existe une marge d’amélioration : messages d’erreur plus clairs, reconnaissance du contenu technique, solutions de contournement documentées
Examiner la réponse HTTP
- Le code d’état 403 Forbidden est confirmé au niveau de l’API
De meilleures solutions pour les plateformes de contenu technique
- Filtrage contextuel : reconnaître les chemins système dans les blocs de code ou les discussions techniques
- Messages d’erreur clairs : expliquer qu’il s’agit d’un blocage par filtre de sécurité au lieu d’une simple « erreur réseau »
- Solutions documentées : indiquer comment discuter de chemins sensibles
Conclusion : au croisement de la sécurité et de l’écriture technique
-
Le problème de l’éditeur Substack met en lumière les défis complexes entre sécurité et rédaction technique
-
Ce qui peut ressembler à un motif d’attaque pour un filtre de sécurité peut en réalité être un contenu légitime
-
Il est possible de résoudre le problème en utilisant un chemin alternatif
-
Invitation à partager en commentaire des expériences similaires de filtrage sur d’autres plateformes
1 commentaires
Avis de Hacker News
Les personnes qui configurent les règles WAF sur les CDN comprennent souvent mal les sites et services qui traitent de contenus techniques. Ce n’est pas propre à Cloudflare : Akamai est similaire
Si l’on active les règles de base contre l’injection SQL sur un site qui discute de bases de données, le site casse, et les jeux de règles contre l’inclusion de fichiers bloquent des chaînes comme
/etc/hostsou/etc/passwdIl y a aussi une question d’équilibre entre sécurité et utilisabilité. Comme on ne peut pas savoir quel service a été implémenté de manière vulnérable, empiler toutes les règles WAF peut effectivement rendre les choses plus sûres. Mais quand un service correctement sécurisé doit discuter de concepts techniques, ces mêmes jeux de règles deviennent très agaçants
Ajuster finement les règles prend énormément de temps. On corrige le fait que la page ne s’affiche pas parce que le paramètre de requête contient
/etc/hosts, puis c’est une ressource XHR qui ne se charge plus parce que le référent contient/etc/hosts, puis une bibliothèque JS d’analyse met l’URL visitée dans un cookie et tout casse à nouveau ; au final, on a juste envie de désactiver la règleSi un assureur dit : « si vous n’obligez pas les employés à changer leur mot de passe tous les 90 jours, nous augmenterons la prime de 20 % », on aura beau expliquer, à juste titre, que le NIST a cessé de recommander les changements périodiques de mot de passe il y a plus de dix ans et que c’est une mauvaise pratique, la prime augmentera quand même
On soupire donc en implémentant une politique d’expiration des mots de passe, puis on écoute les employés se plaindre de l’incompétence ambiante. Comme log4shell est devenu très connu, il ne serait pas surprenant que les assureurs exigent désormais que les serveurs rejettent des « chaînes de piratage » courantes comme
/etc/hosts,/etc/passwdoujndi:Si l’on demande au CIO quelle menace réelle cela bloque, on n’obtient qu’un regard vide
Du point de vue d’un ingénieur, il n’y a aucune incitation à comprendre où va chaque formulaire de saisie et à l’assainir de manière pertinente. Ce qui est rémunéré, c’est de cocher des cases et de passer à autre chose, et même les nouveaux l’apprennent vite. Ce type d’organisation ne cherche pas à améliorer la sécurité, mais à éviter d’être tenue responsable après une compromission
Appliquer des filtres aux « autres choses » qui vont vers le serveur, en sortent ou circulent entre serveurs peut avoir du sens, mais filtrer le corps de texte réel destiné à être affiché comme contenu de blog ne semble apporter aucun bénéfice de sécurité. Cela ressemble plutôt à un bug assez évident
https://en.wikipedia.org/wiki/Scunthorpe_problem
Le backend doit être capable de traiter un contenu arbitraire en octets dans les champs de saisie, et ne doit pas être vulnérable à l’injection SQL simplement parce qu’il n’y a pas de préfiltrage au niveau du CDN
"/etc/hosts"apparaît telle quelle n’importe où dans le contenu de la ressource demandée, il semble assez clairement casséCela me rappelle une anecdote sur une plateforme d’e-commerce. Quelqu’un avait créé une boutique web avec une fuite mémoire, et, comme contournement, l’application était redémarrée dès que la chaîne
"OutOfMemoryException"apparaissait dans les logsPuis un autre développeur a voulu journaliser les recherches des clients, et si quelqu’un saisissait
"OutOfMemoryException"dans la barre de recherche…"system(...)", et le WAF l’a interprétée comme une injection PHP, puis a bloqué l’IPJe me demande s’ils bloquent aussi
/etc//hostsou/etc/./hosts. Ce genre de chasse à la taupe est voué à l’échecLes gens qui conçoivent cela devraient comprendre que les attaquants sont plus intelligents et plus obstinés qu’eux, et ne s’appuyer que sur des méthodes de sécurité éprouvées, par exemple ne pas exécuter des entrées non fiables
On m’a même déjà dit qu’une application qui n’utilisait pas de base SQL avait besoin d’un WAF pour bloquer les attaques par injection SQL
Si l’on conteste, on a toujours droit au cours sur la « défense en profondeur », et si l’on dit qu’il serait plus efficace de taper une fois sur son bureau tous les jeudis matin puis de tourner trois fois sur soi-même, on vous regarde vraiment comme un fou. Je l’ai fait chaque semaine et je ne me suis jamais fait pirater, donc c’est bien de la défense en profondeur, non ? Ça ne peut pas faire de mal
La résolution des jokers est plus délicate, mais si l’on dispose d’une liste de fichiers interdits, c’est tout à fait faisable
https://nodejs.org/api/path.html#pathresolvepaths
Modification : en C,
realpathse comporte un peu différemment et modifie les liensComment Substack pourrait améliorer cette situation pour les rédacteurs techniques ?
Il suffirait de ne pas coller un pare-feu applicatif web aussi bête qu’un caillou devant un endpoint d’édition d’articles qui doit pouvoir traiter n’importe quel sujet, y compris des chaînes susceptibles de déclencher un WAF idiot.
C’est comme si un forum de développement web mettait en place un filtre XSS empêchant ses membres de parler de XSS. Il faut apprendre à échapper correctement le contenu.
Ils sont stupides et ne font qu’utiliser l’amas de déchets illisible de l’OWASP appelé
coreruleset.J’ai du mal à être d’accord avec l’idée que ce cas illustre une tension intéressante, dans la sécurité web, entre protection et utilisabilité. C’est simplement un bug, et un bug stupide. Il montre seulement que des gens qui devraient savoir mieux ne le savent pas.
La tension entre sécurité et utilisabilité existe réellement, mais ce n’est pas ça. En général, il s’agit d’un compromis où l’on implémente une bonne sécurité au prix d’une gêne pour l’utilisateur. L’authentification à deux facteurs, le verrouillage après 3 échecs, ou la limitation de débit pour prévenir les DoS : renforcer la sécurité dégrade l’expérience utilisateur, et améliorer l’expérience utilisateur réduit la sécurité.
Ici, ce n’est ni l’un ni l’autre. C’est une mauvaise sécurité et une mauvaise expérience utilisateur. Je ne vois pas où serait la tension.
Bien sûr, les auteurs de sites PHP l’ont vite compris, diverses techniques de contournement ont été utilisées, et au final ce « nettoyage » a probablement produit des résultats pires que s’il n’avait pas existé.
Comme ça m’était déjà arrivé une fois, dès que j’ai vu « erreur réseau », la cause m’est tout de suite venue à l’esprit.
Quand j’encadrais une équipe de programmation compétitive, la moitié des élèves de la classe recevaient une page blanche en soumettant leur solution. Après une heure de debug, on avait réduit le problème à quelques types et mots-clés C++ qui, s’ils apparaissaient dans le code, provoquaient un 403, et qui avaient tous aussi un sens en JavaScript.
Quand je travaillais dans une banque, il y avait aussi une API à laquelle il fallait soumettre des fichiers Python : la plupart des fichiers Python provoquaient un 403, tandis que les fichiers courts passaient. Après plusieurs heures de debug, on a isolé un mot-clé qui apparaissait parfois dans le code.
Quelques mois plus tard, la même chose s’est produite dans un nouvel environnement cloud, et on y a encore perdu des heures. Après la deuxième fois, un collègue a fait en sorte que le script de déploiement affiche
"HAHAHA YOU'VE BEEN WAFFED"lorsqu’il recevait un 403 ; je lui en suis encore reconnaissant, car j’ai vu cette erreur bien plus souvent que prévu.Nous avons vécu quelque chose de similaire dans notre application. Notre red team interne publiait des données contenant des tentatives de XSS et d’autres attaques par injection.
Les attaques elles-mêmes n’avaient pas réussi, mais comme ces éléments existaient, le pare-feu de l’entreprise bloquait les requêtes réseau contenant ces payloads, ce qui empêchait la page d’administration interne de se charger. Au final, une attaque XSS ratée était devenue une attaque DoS efficace.
Ce qui est ancien redevient nouveau. Autrefois, on appelait cela le problème de Scunthorpe.
https://en.m.wikipedia.org/wiki/Scunthorpe_problem
cockpitétait toujours remplacé parc***pit. C’était assez drôle.Vous écrivez sur la biologie, la finance ou la géologie ? Pas de chance.
Même lorsqu’elle est écrite par des personnes intelligentes et bien intentionnées, le filtrage stupide est déjà suffisamment mauvais.
J’ai rencontré un problème similaire hier soir avec OpenRouter. OpenRouter est excellent : c’est un service de type « commutateur » qui permet d’utiliser plusieurs LLM via un seul endpoint, et hier soir j’ai commencé à tester quels modèles étaient bons pour traiter du HTML brut de différentes façons.
Mais comme l’API OpenRouter est protégée par Cloudflare, lorsque le corps d’une requête POST contient certains fragments de HTML brut et de JavaScript, beaucoup de requêtes — pas toutes — sont bloquées. En envoyant le même prompt directement à OpenAI ou Anthropic, il n’y a aucun problème.
Pour des modèles gratuits, je comprendrais qu’ils imposent une prévention forte des abus, mais ici il s’agit de requêtes facturées vers des modèles commerciaux, ce qui rend la chose d’autant plus agaçante.
J’ai déjà eu ce problème et c’était extrêmement frustrant. À cause de
"Network error", je n’ai pas pu mettre à jour un article que j’avais écrit depuis des mois ; comme l’article s’allongeait avec les modifications, je pensais que c’était la cause et je n’arrivais pas à trouver le problème.Contacter le support était aussi difficile à cause du chatbot IA, et même quand j’ai enfin réussi à joindre un humain, leur « support technique » ne semblait pas avoir l’intention de s’en occuper dans un délai raisonnable.
Ce n’est qu’après qu’une personne sur Twitter a suggéré la possibilité d’une chaîne magique déclenchant une logique de sécurité stupide que j’ai trouvé le problème, et que j’ai enfin pu modifier l’article.