El editor de Substack falla al escribir el archivo "/etc/hosts"
(scalewithlee.substack.com)- En el editor de Substack se produce un error de red al ingresar ciertas rutas del sistema
- La WAF (firewall de aplicaciones web) bloquea estas rutas para prevenir ataques de path traversal y ataques de inyección de comandos
- Se destaca la importancia de equilibrar seguridad y usabilidad
- Hace falta una mejor solución para escritores técnicos
- Se puede resolver el problema usando una ruta alternativa
Cuando /etc/h*sts interfiere con el editor de Substack: la aventura del filtrado de contenido web
Un misterioso error de red
- Durante la redacción de una publicación técnica sobre resolución DNS, apareció un error inesperado
- Al escribir la ruta
/etc/h*sts, se produce un error de red y falla el guardado automático - La página de estado de Substack muestra que el servicio funciona con normalidad
Comienza la investigación
- El error aparece al escribir una ruta de archivo específica; si se modifica la ruta, funciona normalmente
- Rutas como
/etc/h*stsprovocan errores, mientras que variantes alteradas no causan problemas
¿Qué está pasando internamente?
- En las herramientas de desarrollo del navegador se confirma una respuesta 403 Forbidden
- Cloudflare está involucrado
Entendiendo los filtros de seguridad de aplicaciones web
Explicación breve de una WAF
- Un WAF (firewall de aplicaciones web) actúa como guardia de seguridad de un sitio web
- Bloquea solicitudes sospechosas
Ataques de path traversal: por qué preocupan
- Un ataque de path traversal intenta acceder a archivos sensibles del sistema
- Rutas como
/etc/h*stspueden convertirse en objetivo de ataque
Inyección de comandos: otro problema de seguridad
- Un ataque de inyección de comandos busca inducir la ejecución de comandos del sistema
- Al mencionar rutas del sistema, el filtro puede bloquear el contenido
El misterio se profundiza: ejemplos históricos
- Se encontraron casos similares de uso de rutas en otras publicaciones de Substack
- Es posible que el comportamiento del filtrado haya cambiado en algún momento específico
Seguridad vs. usabilidad: un equilibrio delicado
- Aunque el filtro de Substack busca proteger, se convierte en un obstáculo para los escritores técnicos
- Hay margen de mejora: mensajes de error claros, reconocimiento del contenido técnico y soluciones documentadas
Revisando la respuesta HTTP
- Se confirma el código de estado 403 Forbidden a nivel de API
Mejores soluciones para plataformas de contenido técnico
- Filtrado contextual: reconocer rutas del sistema dentro de bloques de código o discusiones técnicas
- Mensajes de error claros: explicar que el bloqueo proviene de un filtro de seguridad en vez de mostrar “error de red”
- Soluciones documentadas: ofrecer una forma de discutir rutas sensibles
Conclusión: la intersección entre seguridad y escritura técnica
-
El problema del editor de Substack revela los desafíos complejos entre la seguridad y la redacción técnica
-
Lo que para un filtro de seguridad puede parecer un patrón de ataque en realidad puede ser contenido legítimo
-
Es posible resolver el problema usando una ruta alternativa
-
Se invita a compartir en los comentarios experiencias similares con problemas de filtrado en otras plataformas
1 comentarios
Comentarios de Hacker News
La gente que configura reglas de WAF en el CDN muchas veces no entiende bien los sitios y servicios que tratan contenido técnico. No es solo problema de Cloudflare; Akamai también es parecido
Si activas reglas básicas de prevención de inyección SQL en un sitio donde se habla de bases de datos, el sitio se rompe, y los conjuntos de reglas de inclusión de archivos bloquean cadenas como
/etc/hosts,/etc/passwdTambién está el tema del equilibrio entre seguridad y usabilidad. Como no puedes saber qué servicio fue implementado de forma vulnerable, poner todas las reglas del WAF encima sí puede dar una sensación de mayor seguridad. Pero cuando un servicio bien implementado necesita hablar de conceptos técnicos, ese mismo conjunto de reglas se vuelve muy molesto
Ajustar las reglas con precisión toma muchísimo tiempo. Arreglas que la página no cargue porque el parámetro de consulta contiene
/etc/hosts, y luego resulta que ahora los recursos XHR no cargan porque/etc/hostsviene en el referrer, y después se vuelve a romper porque una librería de JS de analítica mete la URL visitada en una cookie, así que dan ganas de simplemente apagar la reglaSi la aseguradora dice “si no hacen que los empleados cambien su contraseña cada 90 días, les subimos la prima 20%”, entonces da igual que NIST haya dejado de recomendar los cambios periódicos de contraseña hace más de 10 años y que eso sea una mala práctica: la prima igual sube
Entonces uno suspira, implementa la política de expiración de contraseñas y escucha a los empleados quejarse de que eso es incompetencia. Como
log4shellse volvió tan famoso, ya no sorprendería que las aseguradoras ahora exijan que el servidor rechace cadenas comunes de “hackeo” como/etc/hosts,/etc/passwd,jndi:Si le preguntas al CIO qué amenaza real detiene eso, lo único que recibes es una mirada en blanco
Desde el punto de vista de ingeniería, no hay incentivo para entender a dónde va cada formulario de entrada y sanitizarlo de forma significativa. El trabajo que paga es marcar casillas y seguir, y hasta los recién llegados lo aprenden rápido. Ese tipo de organizaciones no se enfoca en mejorar la seguridad, sino en evitar la culpa después de un incidente
Puede tener sentido aplicar filtros a “otras cosas” que entran o salen del servidor, o que se transmiten entre servidores, pero no parece haber ningún beneficio de seguridad en filtrar el texto real del cuerpo que se va a mostrar como contenido de blog. Se parece bastante a un bug muy claro
https://en.wikipedia.org/wiki/Scunthorpe_problem
El backend debería poder manejar contenido arbitrario de bytes en los campos de entrada, y no debería ser vulnerable a inyección SQL solo porque no hubo filtrado previo en la capa del CDN
"/etc/hosts"aparece tal cual en cualquier parte del contenido del recurso solicitado, entonces parece bastante claramente rotoEsto me recordó una anécdota de una plataforma de comercio electrónico. Alguien hizo una tienda web con fuga de memoria y, como parche, configuró que la app se reiniciara cuando en el log apareciera la cadena
"OutOfMemoryException"Luego otro desarrollador quiso registrar en el log los términos de búsqueda de los clientes, y cuando alguien escribió
"OutOfMemoryException"en el buscador…"system(...)"y el WAF la interpretó como inyección PHP, así que bloqueó la IPMe pregunto si también bloquea
/etc//hostso/etc/./hosts. Este tipo de juego de golpear topos está condenado al fracasoQuienes construyen estas cosas deberían entender que el atacante es más inteligente y más persistente que ellos, y que solo deberían confiar en métodos de seguridad probados, por ejemplo no ejecutar entradas no confiables
Una vez incluso me dijeron que hacía falta un WAF para detener ataques de inyección SQL en una aplicación que no usa una base de datos SQL
Si respondes, siempre te dan la charla de “defensa en profundidad”, y si dices que sería más efectivo golpear el escritorio una vez cada jueves por la mañana y dar tres vueltas en tu lugar, te miran como si estuvieras loco. Como lo hice todas las semanas y nunca me hackearon, entonces también es defensa en profundidad. No hace daño, ¿no?
Interpretar comodines es más complicado, pero si tienes una lista de archivos prohibidos, sigue siendo perfectamente posible
https://nodejs.org/api/path.html#pathresolvepaths
Edit:
realpathde C funciona un poco distinto, así que cambié el enlace¿Cómo podría Substack mejorar esta situación para los escritores técnicos?
Fácil: no poniéndole un firewall de aplicaciones web tan tonto como una piedra a un endpoint de edición que tiene que poder manejar cualquier tema, incluso cadenas que activen un WAF tonto
Es como si un foro de desarrollo web pusiera un filtro XSS para que sus miembros no pudieran hablar sobre XSS. Deberían aprender a escapar correctamente el contenido
Son tontos y básicamente solo usan ese montón ilegible de basura de OWASP llamado
corerulesetMe cuesta estar de acuerdo con la idea de que este caso muestra una tensión interesante entre protección y usabilidad en seguridad web. Esto solo es un bug, y además un bug tonto. Lo único que demuestra es que gente que debería saber más no sabe
La tensión entre seguridad y usabilidad sí existe, pero esto no es eso. Normalmente se trata de compromisos donde implementas buena seguridad y haces más incómoda la vida del usuario. Autenticación en dos pasos, bloqueo tras 3 intentos fallidos, limitación de velocidad para prevenir DoS: al subir la seguridad, empeora la experiencia de usuario; al mejorar la experiencia, baja la seguridad
Esto no es ninguna de las dos. Es mala seguridad y mala experiencia de usuario. No veo dónde estaría la tensión
Claro, quienes escribían sitios en PHP pronto se dieron cuenta, aparecieron varias técnicas para saltárselo y, en conjunto, probablemente produjo peores resultados que no tener ese tipo de “saneamiento”
Después de haber sufrido esto una vez, en cuanto vi “network error” ya se me vino a la cabeza la causa
Cuando enseñaba a un equipo de programación competitiva, la mitad de la clase recibía una página en blanco al enviar sus soluciones, y tras una hora depurando lo reduje a unos cuantos tipos y palabras clave de C++ que provocaban un 403 si aparecían en el código; todas también tenían significado en JavaScript
Cuando trabajaba en un banco, también había una API a la que tenías que subir archivos Python, pero la mayoría devolvía 403 y los archivos cortos sí pasaban. Tras varias horas de depuración, lo reduje a una sola palabra clave que a veces aparecía en el código
Unos meses después volvió a pasar en un entorno nuevo en la nube y otra vez perdí varias horas. Después de la segunda vez, un compañero hizo que el script de despliegue mostrara
"HAHAHA YOU'VE BEEN WAFFED"cuando recibía un 403, y hasta hoy se lo agradezco porque vi ese error muchísimo más seguido de lo esperadoEn nuestra aplicación también vivimos algo parecido. El red team interno estaba publicando datos que incluían intentos de XSS y otros ataques de inyección
El ataque en sí no tuvo éxito, pero el simple hecho de que esas entradas existieran hizo que el firewall de la empresa bloqueara las solicitudes de red que incluían ese payload, así que la página interna de administración no cargaba. Al final, un ataque XSS fallido terminó convirtiéndose en un ataque DoS efectivo
Lo viejo vuelve a ser nuevo. Antes a esto se le llamaba el problema de Scunthorpe
https://en.m.wikipedia.org/wiki/Scunthorpe_problem
cockpitsiempre se convertía enc***pit. Era bastante gracioso¿Estás escribiendo sobre biología, finanzas o geología? Pues mala suerte
Incluso cuando lo hace alguien inteligente y con buenas intenciones, el filtrado tonto sigue siendo bastante malo
Anoche me topé con un problema parecido también en OpenRouter. OpenRouter es un excelente servicio tipo “switchboard” que te deja usar varios LLM desde un solo endpoint, y anoche empecé a probar qué modelos eran buenos para procesar HTML crudo de distintas maneras
Pero la API de OpenRouter está protegida por Cloudflare, así que si en el cuerpo del POST metes ciertos fragmentos de HTML y JavaScript en crudo, no se bloquean todas las solicitudes, pero sí muchas. Si mandas el mismo prompt directamente a OpenAI o Anthropic, no hay problema
Entendería poner protecciones fuertes contra abuso en modelos gratuitos, pero esto molesta más porque son solicitudes cobradas sobre modelos comerciales
Ya había pasado por esto antes y fue desesperante. Por culpa de
"Network error"no pude actualizar durante meses un artículo que había escrito, porque creía que el problema era que las ediciones lo estaban haciendo demasiado largo y no lograba encontrar la causaIncluso contactar al soporte fue difícil por el chatbot de IA, y cuando por fin logré llegar a una persona, su “soporte técnico” no parecía tener intención de revisarlo en un plazo razonable
Solo encontré el problema cuando alguien en Twitter sugirió la posibilidad de una cadena mágica que estuviera activando una lógica de seguridad tonta, y por fin pude editar el artículo