Resumen

  • Un sitio que cargabacdn.polyfill.iono solo citaba un proyecto de código abierto. Permitía que un servicio remoto en vivo seleccionara JavaScript y lo devolviera para su ejecución en el contexto del navegador del sitio. Por lo tanto, el objeto de confianza incluía el dominio, operador, enrutamiento y ruta de respuesta, no solo el código fuente que podía inspeccionarse en otro lugar. [15][16][17]
  • El control del dominio de Polyfill.io y la presencia del proyecto asociado cambiaron en febrero de 2024. Fastly, Cloudflare y un issue del proyecto FormatJS reaccionaron en ese momento, mostrando que se podía reevaluar antes de que se informara públicamente de la entrega maliciosa en junio. La transferencia en sí no debe describirse como prueba de intención maliciosa. [2][3][4]
  • Sansec informó el 25 de junio que el servicio devolvía selectivamente JavaScript modificado que redirigía a los visitantes que cumplían ciertos requisitos. Cloudflare dijo que los indicadores de Page Shield incluían coincidencias desde el 8 de junio, mientras que Akamai describió un muestreo del lado del servidor seguido de comprobaciones del lado del cliente. Esas observaciones establecen una campaña de redirección, no todas las acciones que el JavaScript suministrado remotamente podría realizar teóricamente. [1][5][9]
  • La estimación de Sansec de más de 100,000 sitios se refería a sitios que incrustaban o usaban el servicio. Cloudflare citó una estimación de uso cercana al cuatro por ciento de los sitios web. Ninguna de las cifras es un recuento verificado de sitios que sirvieron la rama maliciosa, redirigieron visitantes o sufrieron pérdidas. [1][5]
  • La reescritura automática de Cloudflare y la retención del dominio por parte de Namecheap restringieron la ruta de entrega. No eliminaron referencias obsoletas del código descendente, no establecieron lo que recibió cada visitante anterior, ni completaron la investigación de cada propietario del sitio. [5][6][10]
  • Fides, Jellyfish y Wordfence ilustran tres tareas de evidencia diferentes: determinar si una ruta condicional era alcanzable, rastrear un proveedor transitivo, verificar la eliminación y evitar tratar una referencia al endpoint como prueba de explotación. [11][12][13][14][22]
  • La responsabilidad aquí no es una conclusión legal ni una afirmación de culpa equitativa. Significa que cada parte debe rendir cuentas por los controles que realmente podía ejercer. Los propietarios de sitios web conservaron el control sobre la necesidad, el inventario, la elección del proveedor, el autoalojamiento, la supervisión de la propiedad, la observación del lado del navegador, la investigación, la reparación y la comunicación.

Una etiqueta script delegó autoridad, no solo conveniencia

La decisión técnica central parecía ordinaria. Un sitio web colocó un elementoscripten una página y lo apuntó acdn.polyfill.io. Cuando un visitante cargaba esa página, el navegador solicitaba JavaScript al servicio remoto. El servicio podía inspeccionar las características de la solicitud y proporcionar polyfills adecuados al navegador, permitiendo que los navegadores más antiguos utilizaran características web que no implementaban de forma nativa.

Esa disposición resolvía un problema práctico de compatibilidad. En lugar de enviar todas las funciones de compatibilidad a cada visitante, un sitio podía pedir a un servicio especializado que devolviera lo que un navegador en particular parecía necesitar. El resultado podía ser más pequeño y más fácil de mantener que un paquete local universal. Pero la eficiencia provenía de mantener la respuesta dinámica. El sitio web no solo descargaba un paquete fijo durante el desarrollo y desplegaba bytes revisados desde su propia infraestructura. Invitaba a otro operador a decidir, en el momento de cargar la página, qué bytes ejecutaría un visitante.

La distinción determina el marco de responsabilidad. Un repositorio de código abierto es un código y un historial inspeccionables. Un servicio alojado es una relación operativa. El servicio en vivo depende de un dominio, DNS, enrutamiento, alojamiento, certificados, acceso de despliegue y las personas u organizaciones capaces de cambiar la respuesta. Un sitio web puede confiar en el código público mientras no examina si el endpoint que sirve a sus visitantes sigue bajo el mismo control, sigue el mismo proceso o devuelve la misma clase de resultado.

HTTPS no elimina esas preguntas. Puede ayudar a que un navegador autentique que llegó al titular de la autoridad válida para el dominio solicitado y proteger la respuesta en tránsito. No garantiza que el titular del dominio no haya cambiado, que el programa devuelto sea benévolo o que el contenido sea invariable entre solicitudes. Cuando el control del dominio cambia legítimamente, HTTPS puede seguir funcionando exactamente como fue diseñado, autenticando una nueva realidad operativa.

El navegador otorga al JavaScript cargado remotamente una extensa influencia práctica sobre la página que lo incluye. El alcance preciso depende de la página y los controles del navegador, pero la debilidad básica está bien establecida: la funcionalidad de terceros se ejecuta dentro del contexto web de la primera parte. CWE-830 de MITRE describe este tipo de inclusión como una transferencia de confianza a código de otro dominio, y OWASP trata el JavaScript de terceros como un problema de gobernanza porque puede afectar los datos y el comportamiento de la página.

La guía de GitHub CodeQL aplica la misma lógica a la funcionalidad cargada desde un dominio no confiable. [15][16][17]

Por eso el incidente no debería reducirse a "el código abierto se volvió inseguro". El código abierto original, una copia propia revisada y un servicio vivo controlado por dominio eran objetos de confianza distintos. Un sitio web que usaba una copia local fija no hacía la misma delegación en tiempo de ejecución que un sitio web que solicitaba una respuesta cambiante acdn.polyfill.io. Un host alternativo también creaba una relación operativa diferente, incluso si servía código derivado del mismo proyecto.

La primera pregunta de responsabilidad no es, por lo tanto, si los desarrolladores deberían desconfiar de cada biblioteca externa. Es si el sitio web sabía qué parte podía elegir bytes ejecutables para sus visitantes en el momento de uso. Un inventario útil respondería al menos cinco preguntas: qué páginas solicitaban el script, si la inclusión era directa o transitiva, qué usuarios y rutas de navegador podían alcanzarlo, qué función comercial lo requería y quién controlaba actualmente el endpoint.

Esas preguntas pertenecen al propietario del sitio web porque el sitio web hizo efectiva la inclusión. Un visitante no negoció con Polyfill.io ni eligió a su operador. El visitante solicitó una página del sitio web y, razonablemente, experimentó los scripts devueltos como parte de esa página. Incluso cuando un tema, plugin, gestor de etiquetas o proveedor insertó la referencia, la organización descendente seguía siendo la parte que presentaba la experiencia combinada a sus usuarios.

Esto no hace que el propietario del sitio web sea el autor del código malicioso ni borra el control del operador del servicio. Significa que el poder delegado no elimina la responsabilidad de la primera parte. El operador del servicio podía elegir la respuesta. El propietario del sitio web podía elegir si ese operador mantenía un lugar en la página. Son controles diferentes, y el incidente puso a prueba ambos.

La transferencia de febrero fue un evento de gobernanza del software

La cronología pública proporciona un intervalo de advertencia inusualmente importante. En febrero de 2024, el control del dominio de Polyfill.io y la presencia asociada en GitHub pasaron a Funnull, según se describe en las fuentes contemporáneas. Las fuentes establecen un cambio de control y base de confianza. No establecen, por ese solo hecho, el motivo del nuevo operador, un plan criminal, una violación legal o la identidad final de cada persona que luego influyó en la entrega.

Para un sitio web informativo convencional, una transferencia de dominio puede cambiar principalmente la autoridad editorial. Para un dominio que devuelve JavaScript ejecutable a otros sitios web, la transferencia cambia quién puede influir en el software que se ejecuta en esas páginas descendentes. Eso hace que la información de propiedad sea parte del estado de dependencia. Un nuevo propietario del endpoint es operacionalmente comparable a un nuevo mantenedor, autoridad de firma o canal de lanzamiento, incluso cuando el repositorio fuente parece familiar.

El aviso de Fastly del 28 de febrero hace visible la importancia de la gobernanza. Anunció dominios de reemplazo y dio a los usuarios opciones que incluían migrar, autoalojar o eliminar el servicio. Esas opciones no eran meras alternativas de marca. Cada una cambiaba quién controlaría los bytes entregados a los visitantes. La migración seleccionaba una relación de servicio diferente. El autoalojamiento ponía la entrega bajo los propios controles de despliegue del sitio web. La eliminación eliminaba la dependencia de compatibilidad si ya no era necesaria. [3]

Cloudflare siguió el 29 de febrero con una alternativa alojada en cdnjs. Su explicación conectó la transición del proveedor con el riesgo de la cadena de suministro: los sitios web habían confiado en otra parte para mantener y asegurar un servicio que podía ejecutar código en sus páginas. La alternativa de Cloudflare no hacía que el alojamiento de terceros estuviera libre de riesgos, pero mostraba que los proveedores de infraestructura entendían el cambio de propiedad como motivo para una nueva decisión de confianza. [2]

Un issue de FormatJS abierto el 28 de febrero proporciona un registro de proyecto descendente del mismo período. Planteó preocupaciones sobre la propiedad y la relación CNAME y pidió al proyecto que dejara de recomendar el endpoint. Ese registro importa porque muestra a un mantenedor actuando sobre una dependencia de documentación antes de una campaña maliciosa reportada públicamente. Eliminar una recomendación no repara todos los sitios web que la siguieron previamente, pero limita la propagación futura y crea una advertencia trazable. [4]

Juntos, estos registros impiden una narrativa excesivamente conveniente en la que los propietarios descendentes no tuvieron señal hasta el 25 de junio. No todos los propietarios de sitios habrían visto el aviso de Fastly, la publicación de Cloudflare o el issue de FormatJS. Las fuentes no establecen un aviso universal, y sería injusto convertir la disponibilidad pública en prueba de que cada organización realmente lo sabía. Establecen que el cambio de propiedad era observable, que había alternativas disponibles y que algunas partes responsables reevaluaron el endpoint meses antes del informe del incidente.

Esa distinción es esencial para la responsabilidad. Un deber de monitoreo no significa omnisciencia. Significa diseñar un proceso que pueda recibir cambios relevantes para las dependencias de alta autoridad. Un sitio puede rastrear avisos de paquetes mientras ignora la propiedad del dominio, los cambios de DNS o de alojamiento. Para un paquete versionado, los feeds de lanzamiento y vulnerabilidad pueden ser las señales importantes. Para un endpoint de script remoto, el registro, DNS, operador y comportamiento de respuesta también pertenecen al modelo de monitoreo.

El evento de febrero también expone los límites de una revisión única de proveedores. Un equipo puede haber aprobado Polyfill.io años antes basándose en el operador, la infraestructura, la reputación del proyecto y las necesidades del navegador en ese momento. Si el registro de aprobación contenía solo la cadenacdn.polyfill.io, el equipo podría tratar erróneamente la dependencia como sin cambios mientras la URL permaneciera igual. En realidad, la parte detrás del nombre estable había cambiado.

Una aprobación responsable debería registrar la base de la confianza, no solo la dirección. Esa base podría incluir el operador, el propósito del servicio, las características esperadas de la respuesta, la relación contractual o comunitaria, la evidencia de auditoría disponible, el plan de contingencia y los desencadenantes de revisión. La transferencia de propiedad invalidaría o al menos reabriría la aprobación. Sin tal registro, una organización no puede explicar fácilmente por qué la delegación continuada seguía justificada después de que la premisa hubiera cambiado.

La cuestión de la necesidad también debería haberse reabierto. Los polyfills están ligados a la capacidad del navegador. Las poblaciones de navegadores evolucionan, las políticas de soporte de productos cambian y el código de compatibilidad que antes era esencial puede volverse residual. Una dependencia remota con autoridad a nivel de página no debería persistir simplemente porque nadie es dueño de su eliminación. Los avisos de febrero ofrecieron un momento para preguntar si el soporte para navegadores antiguos aún requería el endpoint y si un paquete local más pequeño podía satisfacer la necesidad restante.

Nada de esto demuestra que cada sitio que mantuvo la referencia actuara negligentemente, y no convierte la transferencia de dominio en un ataque. Establece un punto más limitado: la transferencia alteró un control de software material incluso antes de que se observara una salida dañina. La responsabilidad del sitio web comienza con si ese cambio material era detectable y revisable.

La entrega selectiva hizo que la inspección casual no fuera fiable

El 25 de junio, Sansec informó quecdn.polyfill.ioestaba entregando JavaScript modificado a través de sitios web que lo incrustaban. El comportamiento observado redirigía a visitantes seleccionados a través de dominios diseñados para parecerse a Google Analytics hacia destinos de estafa o apuestas. Sansec describió condiciones que incluían segmentación móvil, comprobaciones del lado del servidor y del cliente, comportamiento basado en el tiempo y evasión de algunos contextos de administrador o análisis. [1]

El acto observado necesita un nombre preciso. Fue una campaña de redirección entregada a través de JavaScript modificado. El registro no respalda elevar esa observación a robo de credenciales, robo de datos de página, compromiso del host, ejecución de código fuera del navegador o una pérdida financiera cuantificada. Un endpoint de script controlado remotamente podría, en principio, devolver JavaScript capaz de un rango mucho más amplio de acciones del navegador. CNCF TAG Security, CWE-830 y el modelo general de ejecución del navegador respaldan esa conclusión de capacidad. La capacidad no es evidencia de que ocurriera cada acción posible.

[8][16]

Cloudflare dijo que sus datos de Page Shield corroboraban los indicadores e incluían coincidencias desde el 8 de junio. Esa es la coincidencia más temprana en el conjunto de datos de Cloudflare descrito en el registro fuente. No es prueba de que toda la actividad maliciosa comenzara en esa fecha, de que la misma rama llegara a todos los sitios de forma continua desde entonces, o de que no ocurriera ninguna entrega anterior fuera de la visibilidad de Cloudflare. [5]

Akamai describió por separado un patrón de dos etapas en el que la selección del lado del servidor basada en encabezados de solicitud podía determinar lo que se enviaba, seguido de comprobaciones del lado del cliente antes de la redirección. Esa arquitectura explica por qué la inspección ordinaria podía pasar por alto el problema. Un desarrollador que solicitara el script desde un navegador de escritorio podría recibir un polyfill esperado. Un visitante móvil con diferentes encabezados, ubicación, tiempo o estado de página podría recibir o activar otra rama. [9]

La entrega selectiva cambia la carga de evidencia. Una descarga limpia única no demuestra seguridad histórica. Una comparación de código fuente desde un navegador en un momento dado puede mostrar solo la respuesta seleccionada para esa solicitud. Un rastreador de motores de búsqueda, monitor de tiempo de actividad o escáner de seguridad puede tener características deliberadamente excluidas por la lógica de entrega. Un administrador que prueba mientras está conectado puede ver un comportamiento diferente al de un visitante por primera vez.

Esto no significa que la detección fuera imposible. Significa que el monitoreo debía coincidir con la variabilidad de la dependencia. Una observación útil muestrearía navegadores, dispositivos, ubicaciones y condiciones de solicitud; conservaría cuerpos de respuesta y hashes a lo largo del tiempo; detectaría nuevos dominios y cadenas de redirección; y compararía el comportamiento visto por clientes reales con el propósito declarado del servicio. El monitoreo del lado del cliente tenía un papel importante porque el programa consecuente se ensamblaba y ejecutaba en el navegador.

El incidente también ilustra cómo la optimización puede convertirse en camuflaje. La segmentación dinámica del navegador era parte del modelo de servicio legítimo de Polyfill.io: el servicio seleccionaba código de compatibilidad según las capacidades del navegador. Una rama maliciosa podía explotar la expectativa de que las respuestas difieren naturalmente. La variabilidad en sí misma no era prueba de abuso. Dificultaba la aplicación de un modelo simple de "hash conocido igual a servicio seguro" y daba a la entrega selectiva espacio para esconderse dentro de un patrón operativo aceptado.

Por lo tanto, la responsabilidad depende de definir la variabilidad esperada. Un sitio web debería poder declarar qué atributos de solicitud utiliza legítimamente el proveedor, qué familias de código pueden ser devueltas, qué destinos puede contactar el script y qué acciones de página están fuera del propósito. Sin esa línea base, el monitoreo puede observar el cambio sin saber si el cambio está autorizado.

El muestreo del lado del servidor también complica la investigación retrospectiva. El repositorio estático de un sitio puede contener solo la URL del script, no los bytes maliciosos que recibió un visitante. Los bytes provenían de otro sistema en el momento de la solicitud y pueden no estar disponibles después de la contención. La telemetría del navegador, los registros de CDN, las respuestas guardadas, los informes de seguridad de contenido y los registros de endpoints pueden ser la única evidencia para reconstruir el alcance.

Si esos registros nunca se recopilaron o se retuvieron demasiado brevemente, un sitio puede no ser capaz de responder qué visitantes encontraron la rama.

Esa incertidumbre no debe ocultarse con una afirmación amplia de que todos estaban seguros o todos estaban comprometidos. Una declaración responsable del incidente puede definir lo que se encontró: se referenció el endpoint; una ruta condicional particular era alcanzable o no; la telemetría cubría fechas y poblaciones especificadas; las redirecciones observadas coincidían o no con indicadores conocidos; y quedan lagunas para solicitudes fuera de la evidencia conservada.

La entrega selectiva es, por tanto, central para la prueba de responsabilidad. Explica cómo la salida dañina podía coexistir con la inspección benigna, por qué las referencias a endpoints no son recuentos de víctimas y por qué la remediación verificada requiere más que cargar la página una vez después de que el dominio fue suspendido.

Las estimaciones de escala no eran recuentos de víctimas

Sansec describió más de 100,000 sitios como incrustados o usando el servicio. Cloudflare citó estimaciones de que Polyfill.io aparecía en cerca del cuatro por ciento de los sitios web. Esas cifras transmiten la amplitud potencial de un servicio ampliamente reutilizado. No comparten el mismo denominador, y ninguna establece un conjunto completo de compromisos confirmados. [1][5]

Varias poblaciones deben permanecer separadas. Una es el conjunto de sitios web cuyo código actual o histórico referenciaba un endpoint de Polyfill.io. Otra es el conjunto para el cual la ruta de inclusión relevante era alcanzable en producción. Una tercera es el conjunto que solicitó una respuesta maliciosa durante la campaña. Una cuarta es el conjunto cuyos visitantes cumplían las condiciones del lado del servidor y del cliente. Una quinta son los visitantes que fueron realmente redirigidos. Una sexta es cualquier población que sufrió una pérdida medible posterior.

El registro público disponible no proporciona un recuento verificado para la mayoría de esos grupos. Por lo tanto, sería inexacto llamar víctima a cada referencia, comprometido a cada sitio que incluía el servicio o expuesto a cada visitante. Sería igualmente inexacto descartar las referencias como inofensivas simplemente porque la entrega selectiva impidió la observación universal. Una referencia establece una ruta de confianza. Se necesita evidencia adicional para establecer la alcanzabilidad, la entrega y el impacto.

Este vocabulario importa para las notificaciones descendentes. "Nuestro código contenía una referencia" es diferente de "nuestra telemetría muestra que se solicitó el script". Ambos difieren de "observamos la rama maliciosa" y de "un visitante informó una redirección". Combinarlos puede crear alarma innecesaria o falsa tranquilidad. Separarlos permite a los usuarios entender lo que la organización sabe.

El tratamiento de Wordfence de los patrones de plugins de WordPress afectados refuerza este límite. Su catálogo identificó usos de Polyfill.io pero advirtió contra asumir que cada instancia del plugin entregó contenido malicioso. Los plugins podían introducir el endpoint en muchos sitios, haciendo urgente el trabajo de inventario, mientras que la presencia del código aún no demostraba la ejecución maliciosa en cada instalación. [14]

Los informes gubernamentales repitieron la preocupación por la escala seria, mientras centraban a los operadores en la eliminación y la investigación. CERT-AGID describió la adquisición y la entrega dependiente de encabezados y se refirió a la cifra de más de 100,000. Esa advertencia independiente respalda una atención defensiva amplia, pero no cambia el denominador por visitantes afectados confirmados. [21]

La declaración de escala más fuerte es, por lo tanto, también la más acotada: el endpoint tenía una gran huella descendente, y la campaña selectiva observada creó riesgo en toda esa huella. El impacto exacto debía establecerse sitio por sitio y población de visitantes por población de visitantes.

La contención cambió la ruta; no terminó la remediación

La respuesta involucró a partes con diferentes tipos de control. Cloudflare reescribió automáticamente las referencias a Polyfill.io en las páginas de clientes proxyadas a un espejo alojado por Cloudflare. La compañía explicó que simplemente bloquear el dominio original podría romper sitios que aún dependían del servicio. La reescritura intentaba preservar la compatibilidad esperada mientras eliminaba la dependencia inmediata del endpoint cambiado. [5]

Esa intervención ilustra una compensación operativa real. Los equipos de seguridad a menudo prefieren la eliminación inmediata de un recurso sospechoso. Los equipos de producto saben que eliminar abruptamente una capa de compatibilidad puede hacer que un sitio sea inutilizable para algunos visitantes. La posición de Cloudflare en la cadena de entrega le permitió sustituir una fuente diferente sin esperar a que cada propietario del sitio desplegara un cambio.

La sustitución fue contención, no prueba de reparación completa. Cambió el operador de confianza y la ruta de respuesta para el tráfico cubierto por el mecanismo. No estableció que el reemplazo tuviera un comportamiento idéntico para todos los navegadores, que todas las páginas y rutas de entrega estuvieran cubiertas, o que los repositorios descendentes ya no contuvieran la referencia antigua. Tampoco respondió qué recibieron los visitantes antes de la reescritura.

Namecheap luego puso el dominio Polyfill.io en espera, y los avisos gubernamentales describieron el endpoint como suspendido para el 27 de junio. La acción a nivel de dominio eliminó la ruta de servicio inmediata pero también podría romper sitios que aún esperaban una respuesta. La retención era una palanca de contención importante en manos del registrador. No limpió las plantillas descendentes, configuraciones de plugins, páginas en caché, configuraciones de gestores de etiquetas o productos de proveedores. [6][10]

La diferencia se vuelve más clara cuando el dominio no está disponible. Un sitio puede parecer protegido porque el navegador ya no puede recuperar el script sospechoso. Sin embargo, la referencia obsoleta sigue siendo una dependencia no resuelta. Si el estado de control cambia de nuevo, si persiste un nombre de host alternativo, o si no se examinó una copia interna, el problema de gobernanza subyacente permanece. Incluso un endpoint permanentemente muerto puede imponer costos de rendimiento, manejo de errores y compatibilidad.

CERT-FR y la Unidad de Ciberseguridad de Australia Occidental aconsejaron a los operadores identificar y eliminar referencias, moverse a una alternativa controlada cuando fuera necesario, y considerar controles del navegador como Subresource Integrity y Content Security Policy. Semgrep también se centró en la detección en todo el repositorio en lugar de tratar la suspensión del dominio como suficiente. [6][7][20]

Esa secuencia sugiere cuatro afirmaciones de cierre distintas. "Contenido" significa que la ruta de entrega dañina conocida ha sido interrumpida. "Eliminado" significa que la referencia descendente y las rutas de inserción transitivas han desaparecido. "Investigado" significa que se utilizó la evidencia disponible para evaluar el alcance y el impacto históricos. "Verificado" significa que las pruebas y el monitoreo demuestran que el sitio actual ya no depende de la ruta antigua y que el reemplazo se comporta dentro de su alcance previsto.

Un propietario de sitio web podía confiar en un proveedor de infraestructura para la primera afirmación mientras seguía siendo responsable de las otras tres. Cloudflare podía reescribir el tráfico que veía. Namecheap podía suspender un dominio que había registrado. Ninguno podía conocer cada lugar donde un cliente había incrustado la URL, cada ruta de navegador condicional dentro de un plugin, o cada población de visitantes que el sitio web necesitaba investigar.

Esta separación también protege contra la exageración de la intervención de terceros. Una retención del registrador no es un hallazgo de atribución. La reescritura automática no establece que cada cliente protegido hubiera servido la rama maliciosa. La coincidencia de indicadores de un proveedor de detección no es un informe forense completo para cada sitio. Cada acción debe describirse según el control que ejerció y la evidencia que produjo.

Operativamente, la remediación descendente debería comenzar con una búsqueda completa. El nombre de host literal puede aparecer en archivos fuente, paquetes generados, campos de sistemas de gestión de contenido, código de plugins, gestores de etiquetas, plantillas, configuraciones archivadas o respuestas de proveedores. Las herramientas de búsqueda pueden encontrar cadenas conocidas, pero un inventario de dependencias también debe explicar quién introdujo la referencia y qué ruta de compilación o tiempo de ejecución la hizo activa.

La eliminación necesita entonces una decisión funcional. Si el polyfill ya no es necesario, eliminarlo es la reducción de autoridad más limpia. Si aún se requiere soporte para navegadores heredados, puede ser apropiado un paquete local revisado o un proveedor explícitamente aprobado. El reemplazo no debe elegirse simplemente porque su URL es conveniente. Su operador, proceso de actualización, variabilidad de respuesta y modelo de monitoreo pasan a formar parte de la nueva base de confianza.

Finalmente, la evaluación histórica requiere evidencia proporcional al riesgo del sitio. Las observaciones del lado del navegador, los registros de red, los informes de seguridad, las quejas de los clientes y las respuestas de scripts conservadas pueden ayudar a determinar si aparecieron indicadores de redirección conocidos. La ausencia de evidencia debe estar ligada a la cobertura. Un sitio sin telemetría de cliente conservada puede decir que no encontró informes o indicadores en los registros disponibles; no puede convertir la falta de registros en prueba de que ningún visitante recibió la rama.

Fides mostró por qué una rama condicional sigue siendo importante

CVE-2024-38537 registra un problema descendente en Fides. La ruta relevantefides.jspodía cargar Polyfill.io para navegadores heredados. El registro identifica versiones afectadas y dice que la versión 2.39.1 eliminó la exposición. También conserva un límite importante: no se había identificado explotación a través de Fides. [11][12]

Ese caso es útil porque resiste dos errores opuestos. El primero descartaría el problema porque solo una ruta de navegador antiguo cargaba el endpoint. La alcanzabilidad condicional sigue siendo alcanzabilidad. Si una página de producción podía solicitar JavaScript remoto para una población de visitantes soportada, la dependencia pertenecía al inventario de seguridad del producto incluso si la mayoría de los desarrolladores nunca la activaban.

El segundo error trataría el CVE como prueba de que los usuarios de Fides fueron explotados. Un registro de vulnerabilidad puede establecer una ruta de inclusión insegura y versiones afectadas sin establecer que la rama maliciosa llegó a un despliegue particular. "Podía cargar" y "se observó explotación" responden a preguntas diferentes. El registro de Fides mantuvo explícitamente esa distinción.

La remediación también demuestra por qué la reparación versionada importa. Eliminar la dependencia remota en un lanzamiento nombrado da a los operadores descendentes una acción concreta y un límite trazable. Pueden identificar versiones desplegadas, actualizar, escanear en busca de referencias restantes y probar la ruta heredada. Una advertencia general de "tener cuidado con Polyfill.io" no proporcionaría la misma evidencia de cierre.

La condición heredada debe dar forma a la verificación. Probar solo un navegador de escritorio moderno podría nunca ejecutar la rama afectada. La verificación debe reproducir o inspeccionar la condición que originalmente la seleccionaba. Eso puede requerir revisar el código empaquetado, simular un agente de usuario antiguo, verificar las solicitudes de red y confirmar que la versión reparada ya no construye o solicita el endpoint.

El boletín de SingCERT también discutió el caso descendente de Fides y conservó el límite de no explotación observada. La repetición por un CERT nacional aumenta la visibilidad del problema; no convierte la posibilidad en explotación observada. [22]

La lección de Fides no es, por lo tanto, que cada solicitud condicional de terceros merezca la misma gravedad. Es que un mantenedor debe conocer la condición, las versiones afectadas, la población alcanzable, la versión de remediación y el límite de evidencia. La responsabilidad es más fuerte cuando un registro formal de vulnerabilidad dice tanto lo que podía ocurrir como lo que no se observó.

Jellyfish mostró cómo rastrear una dependencia transitiva

El aviso de Jellyfish documentó una ruta diferente. Su servicio dependía de un proveedor que podía cargar Polyfill.io bajo condiciones especiales. Jellyfish identificó la relación transitiva, contactó al proveedor, verificó la eliminación y acotó la población de navegadores que podría haber alcanzado la ruta. [13]

Esta secuencia es un modelo práctico porque comienza con la arquitectura en lugar de la acusación. Una organización orientada al cliente puede no haber colocado la etiqueta script directamente en su propio repositorio. La referencia puede provenir de un componente de analítica, herramienta de consentimiento, plugin, widget de soporte u otro código de proveedor. La propiedad directa de la línea no es lo mismo que el control sobre la experiencia del usuario.

Las dependencias transitivas crean un problema de evidencia. Una lista de materiales de software orientada a paquetes instalados en el momento de la compilación puede no incluir un dominio que un proveedor solicita dinámicamente en el navegador. Los inventarios de contratos pueden nombrar al proveedor pero no a los propios proveedores de scripts del proveedor. La monitorización de red puede ver el nombre de host sin identificar al propietario del negocio que lo introdujo. Las tres vistas son necesarias para conectar una solicitud con una relación responsable.

La secuencia de respuesta de Jellyfish aborda esas lagunas. Primero, identificar que la dependencia existe y las condiciones bajo las cuales puede ser invocada. Segundo, mapearla a la relación con el proveedor. Tercero, pedir a la parte con control de código que la elimine. Cuarto, verificar el cambio en lugar de tratar la garantía del proveedor como el fin del asunto. Quinto, acotar la población utilizando la mejor evidencia disponible de navegador y producto.

La verificación es especialmente importante cuando la condición es inusual. Un proveedor podría eliminar una referencia visible mientras un fallback, paquete antiguo o activo en caché aún la contiene. El cliente debe probar desde el exterior además de aceptar la confirmación interna. La captura de red en todos los navegadores relevantes, los escaneos de repositorios o paquetes, y el monitoreo del lado del cliente pueden mostrar si la solicitud realmente desapareció.

La población acotada debe conservar su denominador. Si solo ciertas versiones de navegador o flujos de página podían activar la ruta del proveedor, la investigación puede reducir el alcance potencial. No debe implicar que cada miembro de ese grupo de navegadores recibió contenido malicioso. Por el contrario, el hecho de que una ruta fuera rara no excusa no eliminarla. Las rutas raras a menudo reciben menos pruebas rutinarias, lo que puede convertirlas en lugares atractivos para que las dependencias persistan desapercibidas.

Jellyfish también demuestra una responsabilidad compartida pero no fungible. El proveedor controlaba su código y podía eliminar la inclusión. Jellyfish controlaba la escalación del proveedor, la investigación orientada al cliente y la aceptación de la reparación. Los proveedores de infraestructura y seguridad podían contribuir con telemetría. Ninguna de esas partes podía sustituir completamente a otra.

Ese modelo se escala más allá de este incidente. Una organización descendente necesita una ruta de escalación para cualquier proveedor capaz de introducir código ejecutable. El contrato o proceso de incorporación técnica debe identificar quién puede responder a preguntas urgentes de dependencia, con qué rapidez se puede deshabilitar un script de terceros, qué registros están disponibles y cómo puede el cliente verificar un cambio.

Los plugins de WordPress mostraron por qué las referencias y la explotación deben permanecer separadas

Wordfence catalogó el uso de Polyfill.io en varios patrones de plugins de WordPress. Ese tipo de inventario es valioso porque los plugins pueden distribuir una dependencia externa a muchos sitios web operados independientemente. Una pequeña decisión de un mantenedor puede convertirse en una amplia relación de confianza descendente sin que cada propietario del sitio añada conscientemente el endpoint. [14]

El catálogo también llevaba una advertencia crucial: el uso del endpoint no demostraba que cada plugin o sitio hubiera entregado contenido malicioso. La referencia identificaba una ruta de ejecución potencial. Si esa ruta estaba activa dependía de la versión del plugin, la configuración, la representación de la página, el almacenamiento en caché, las condiciones del navegador y la respuesta remota en ese momento.

Para un propietario de sitio WordPress, la respuesta correcta no es debatir si el autor del plugin o el operador del servicio es "la verdadera" parte responsable. Las tareas inmediatas son locales: identificar versiones instaladas y activas, determinar qué páginas representan la referencia, actualizar o eliminar componentes afectados, limpiar activos generados cuando sea necesario y verificar el comportamiento de red del sitio público.

El mantenedor del plugin tiene un conjunto diferente de tareas. Puede eliminar la dependencia, publicar una versión corregida, explicar las condiciones afectadas, actualizar la documentación y notificar a los usuarios. Un repositorio de plugins o servicio de seguridad puede distribuir advertencias. El propietario del sitio web aún tiene que desplegar el cambio. Una versión corregida sentada sin instalar no altera la ruta del navegador.

Esta es otra razón por la que las cifras de escala no deben leerse como un recuento de organizaciones perjudicadas. Un plugin puede crear miles de referencias; un sitio puede contener varios plugins con el mismo nombre de host; un plugin inactivo o deshabilitado puede permanecer en el disco sin representar el script; y una página pública en caché puede seguir sirviendo una referencia antigua después de cambios en el código fuente. Contar cadenas, instalaciones, solicitudes activas y entregas maliciosas produce números diferentes.

Un ecosistema responsable mantiene esas medidas etiquetadas. La inteligencia de seguridad puede publicar una lista de exposición amplia para acelerar la acción. Los mantenedores pueden declarar versiones afectadas. Los propietarios de sitios pueden informar sobre la alcanzabilidad desplegada. Los investigadores de incidentes pueden informar sobre indicadores observados. Ninguno debe tomar prestada certeza de los demás.

SRI y CSP fueron controles, no respuestas mágicas

Subresource Integrity, o SRI, permite que un autor de página proporcione un resumen criptográfico para un recurso externo. Un navegador compatible puede obtener el recurso y negarse a ejecutarlo si los bytes devueltos no coinciden con el resumen esperado. La especificación del W3C y la guía de implementación de MDN presentan SRI como una forma de evitar que un host de terceros comprometido cambie silenciosamente un recurso que el sitio que lo incluye espera que permanezca fijo. [18][19]

Ese es un control fuerte para un script estable. Convierte una delegación abierta en una aprobación de bytes específicos. Si el host devuelve cualquier otra cosa, el navegador bloquea la ejecución. El sitio web puede entonces actualizar el resumen a través de su propio proceso de despliegue después de revisar una nueva versión.

El diseño legítimo de Polyfill.io complica ese modelo porque el servicio generaba intencionadamente diferentes paquetes según las capacidades del navegador y los parámetros de la solicitud. Un resumen estable no puede aprobar muchas secuencias de bytes válidas a menos que el sitio cambie la forma en que consume el servicio. Un equipo podría precalcular y aprobar un conjunto acotado de recursos fijos en algunas arquitecturas, pero adjuntar un hash a un endpoint cuyo propósito es la selección dinámica de respuesta probablemente rompería el comportamiento esperado o dejaría una variación importante sin vincular.

La conclusión correcta no es que SRI sea inútil. Es que la elección del control debe coincidir con el modelo de recurso. Si un sitio desea fijación de integridad, puede necesitar dejar de pedir a un servicio remoto que genere bytes arbitrarios específicos de la solicitud. El autoalojamiento de un paquete revisado, el servicio de variantes versionadas fijas o la restricción de navegadores soportados pueden hacer que la aprobación a nivel de bytes sea práctica.

Content Security Policy, o CSP, aborda una capa diferente. Una política puede restringir qué orígenes pueden proporcionar scripts y puede usar nonces, hashes o directivas relacionadas para limitar la ejecución. Puede bloquear dominios inesperados y reducir la libertad del marcado inyectado para cargar nuevos recursos. Pero sicdn.polyfill.ioestá explícitamente permitido como un origen de script de confianza, una respuesta maliciosa aprobada por origen no se vuelve confiable por aparecer en la lista blanca.

CSP aún puede ayudar a contener el comportamiento secundario. Una política cuidadosamente diseñada puede restringir conexiones, marcos o navegaciones involucrados en una cadena de ataque, y los informes de violación pueden añadir evidencia de detección. El efecto exacto depende de la política y del comportamiento del navegador. La limitación central sigue siendo: la aprobación del origen responde de dónde puede venir el código, no si el operador aprobado devolverá siempre código aceptable.

El espejado mueve de nuevo el límite de confianza. Un sitio web o proveedor de infraestructura obtiene o mantiene una copia y la sirve desde una ubicación controlada. Esto puede evitar que el dominio original cambie bytes en el momento de la solicitud. También crea obligaciones sobre cómo se obtiene, revisa, actualiza y asegura el espejo. La reescritura automática al espejo de Cloudflare fue una contención útil, pero seleccionó a Cloudflare como la nueva autoridad operativa; no eliminó el concepto de confianza.

El autoalojamiento da al propietario del sitio web un control más directo sobre la entrega. Puede revisar una versión, desplegarla con la aplicación y monitorear los cambios a través de su proceso de lanzamiento normal. El autoalojamiento no garantiza un código seguro. Reduce quién puede alterar la respuesta de producción y hace que los bytes desplegados sean más fáciles de vincular a un lanzamiento.

La eliminación es más fuerte cuando la función es innecesaria. Si el soporte actual del navegador ya no requiere un servicio de polyfill, el script remoto de menor riesgo es el que la página no solicita. Por eso la revisión del ciclo de vida pertenece junto a los controles de seguridad. Las decisiones de compatibilidad tomadas años antes no deberían convertirse en concesiones de autoridad permanentes.

El sandboxing puede reducir algo de influencia de terceros cuando la funcionalidad puede ejecutarse en un marco restringido o contexto aislado. No todos los scripts pueden moverse allí sin cambiar el producto. Un polyfill destinado a modificar el entorno JavaScript de la página está especialmente ligado al contexto de ejecución principal, lo que limita la utilidad del aislamiento. Esa limitación debe influir en si la conveniencia sigue valiendo la autoridad.

Las herramientas de escaneo de código ayudan a encontrar referencias conocidas. La guía específica de Polyfill de CodeQL enfatiza la diligencia en la propiedad, la revisión de registros, el autoalojamiento y las limitaciones de los controles de integridad para contenido dinámico. Semgrep propuso búsquedas en repositorios y reglas para identificar el uso de Polyfill.io después del incidente. [15][20]

El escaneo estático solo es incompleto porque la inyección en tiempo de ejecución puede provenir de sistemas de contenido, gestores de etiquetas o proveedores. La observación en tiempo de ejecución solo es incompleta porque las condiciones raras pueden no ocurrir durante la muestra. Una pila de control madura combina el escaneo de fuentes y paquetes, un inventario de scripts de terceros, monitoreo de DNS y propiedad, telemetría del lado del navegador, revisión de cambios y un mecanismo de desactivación de emergencia.

La pila también debe especificar el comportamiento en caso de fallo. Si un polyfill no se carga, ¿la página pierde una mejora menor, se vuelve inutilizable o impide una transacción crítica? Los equipos que entienden el impacto del fallo pueden eliminar o bloquear un recurso sospechoso rápidamente sin improvisar durante un incidente. Si la continuidad depende del recurso, un respaldo local probado es más seguro que descubrir la dependencia cuando un registrador suspende el dominio.

Por lo tanto, los controles no son un menú del que se pueda seleccionar un acrónimo de moda. Son una secuencia de decisiones: eliminar la autoridad innecesaria, hacer que el código necesario sea fijo cuando sea posible, restringir de dónde puede venir, observar lo que hace, conservar evidencia y mantener una ruta probada para desactivarlo o reemplazarlo.

La responsabilidad debe seguir los controles que cada parte poseía

El incidente involucró a un operador de servicio, propietarios de sitios web, proveedores de infraestructura, un registrador, investigadores de seguridad, mantenedores de plugins y productos, y proveedores cuyo código introdujo el endpoint. Sus responsabilidades se superponían, pero no eran intercambiables.

El operador que controlaba el servicio alojado de Polyfill.io tenía la autoridad más directa sobre la respuesta devuelta por ese servicio. Eso es diferente de mantener el código abierto original. La responsabilidad en esta capa se refiere a la custodia del dominio y la ruta de despliegue, el control de cambios, la integridad de la respuesta, la visibilidad en la entrega y la comunicación precisa sobre la operación. El registro disponible no debe estirarse hasta convertirse en un hallazgo sobre cada actor individual, relación corporativa o deber legal.

Fastly y Cloudflare tenían capacidades de infraestructura y sustitución. Sus avisos de febrero podían advertir y ofrecer alternativas. La posición posterior de Cloudflare permitía la reescritura automática y la telemetría del lado del cliente para el tráfico cubierto. Esos controles eran significativos, pero no daban a ninguno de los dos proveedores un conocimiento completo de la fuente, configuración o impacto en los visitantes de cada sitio descendente. [2][3][5]

Namecheap tenía una palanca de contención a nivel de registrador. Poner el dominio en espera interrumpía la resolución o el uso del endpoint. Esa acción reducía la exposición inmediata mientras potencialmente rompía sitios dependientes. El control del registrador podía detener una ruta; no podía parchear aplicaciones ni establecer la entrega histórica para cada sitio web. [10]

Los investigadores de seguridad y los respondedores gubernamentales tenían capacidades de detección, análisis y advertencia. Sansec publicó indicadores y comportamiento observado. Akamai y Cloudflare añadieron perspectivas de telemetría. CERT-FR, Australia Occidental, CERT-AGID y SingCERT tradujeron el incidente en guías operativas para sus audiencias. Estas partes podían aumentar la visibilidad y recomendar controles; no podían desplegar correcciones en todos los sitios. [1][5][6][7][9][21][22]

Los mantenedores de plugins, bibliotecas y proveedores controlaban el código que podía introducir la dependencia de forma transitiva. Sus acciones responsables incluían identificar versiones y condiciones afectadas, eliminar el endpoint, publicar una corrección, comunicar el alcance y preservar la distinción entre exposición potencial y explotación observada. Fides y los registros de plugins de WordPress muestran por qué la versión y la evidencia de alcanzabilidad importan. [11][12][14]

Los propietarios de sitios web controlaban la decisión final de inclusión, incluso cuando ejecutarla requería que un proveedor o mantenedor cambiara el código. Podían definir los navegadores soportados, aprobar proveedores de scripts de terceros, mantener inventarios, monitorear la propiedad, bloquear o reescribir recursos, autoalojar código revisado, conservar evidencia del navegador, investigar quejas y comunicarse con los visitantes.

Esto no implica culpa equitativa. Un pequeño operador de sitio puede tener mucha menos visibilidad y experiencia que una empresa global de infraestructura. Un proveedor puede ser la única parte capaz de cambiar un fallback empaquetado. Un registrador puede ser la única parte capaz de suspender un dominio rápidamente. La responsabilidad sigue el control práctico y la evidencia disponible para ejercerlo, no una suposición de que cada participante tenía la misma capacidad.

Un mapa de deberes útil puede organizarse en torno a seis preguntas.

Primero, ¿quién podía prevenir la exposición innecesaria? Los propietarios de sitios y productos podían reexaminar el soporte del navegador y eliminar la dependencia. Los mantenedores podían dejar de recomendarla o empaquetarla. Los proveedores podían ofrecer rutas de migración más seguras.

Segundo, ¿quién podía detectar un cambio de confianza? Los monitores de dominio e infraestructura podían observar cambios de propiedad, DNS y enrutamiento. Los mantenedores de proyectos podían rastrear el control de cuentas y la documentación. Los propietarios de sitios web podían suscribirse a avisos relevantes y revisar las dependencias de alta autoridad cuando su operador cambiaba.

Tercero, ¿quién podía observar la entrega dañina? El operador del servicio y los proveedores de infraestructura podían ver las respuestas del lado del servidor. Los propietarios de sitios web y los servicios de seguridad del lado del cliente podían ver el comportamiento del navegador. Los investigadores podían comparar muestras en diferentes condiciones. Ninguna vista única cubría necesariamente toda la campaña.

Cuarto, ¿quién podía contener la ruta? El operador podía detener la entrega, el registrador podía suspender el dominio, los proveedores de infraestructura podían reescribir o bloquear el tráfico, los mantenedores podían publicar correcciones y los propietarios de sitios web podían deshabilitar o eliminar referencias.

Quinto, ¿quién podía investigar el impacto? Cada propietario de sitio web tenía su propia arquitectura de página, registros de visitantes, quejas e historial de despliegue. Los proveedores tenían información sobre condiciones transitivas. Los proveedores de infraestructura tenían telemetría seleccionada de tráfico y respuesta. La investigación requería cooperación sin pretender que el conjunto de datos de una parte representara a todos los visitantes.

Sexto, ¿quién podía verificar la reparación y comunicarla? Los mantenedores podían vincular correcciones a versiones. Los proveedores podían mostrar la eliminación. Los propietarios de sitios web podían probar la ruta pública y declarar lo que cubría su evidencia. Los organismos gubernamentales y de seguridad podían actualizar las guías. La verificación debía mantenerse acotada a la visibilidad de la parte.

Este mapa hace que la responsabilidad sea comprobable. En lugar de preguntar solo quién causó el incidente, pregunta qué parte podía responder a cada pregunta de prevención, detección, contención, investigación y reparación. También expone lagunas de control. Si nadie monitoreaba la propiedad del dominio para un script con autoridad a nivel de página, la laguna existía antes de que apareciera la rama maliciosa.

Lo que un sitio web descendente debería poder demostrar

Una respuesta descendente creíble puede expresarse como una cadena de evidencia en lugar de una garantía genérica.

La cadena comienza con el inventario. La organización debe identificar cada referencia directa y transitiva a Polyfill.io, el componente o proveedor que la introdujo, las páginas que la representaban y las condiciones del navegador que la hacían alcanzable. Los resultados de búsqueda deben conectarse con el comportamiento desplegado, no dejarse como una lista de archivos coincidentes.

Lo siguiente es la necesidad. El propietario debe documentar si la función de compatibilidad sigue siendo requerida para los navegadores que soporta intencionadamente. Si no, debe preferirse la eliminación. Si es requerida, la organización debe explicar por qué el reemplazo elegido o la versión autoalojada es proporcionada a la necesidad.

El tercer paso es la reevaluación de la confianza. El registro debe mostrar cuándo la organización se enteró de la transición de propiedad o del incidente de junio, quién tomó la decisión de continuar, bloquear, reemplazar o eliminar el servicio, y qué evidencia respaldó esa decisión. Una revisión de febrero y una respuesta de emergencia de junio son eventos diferentes y no deben colapsarse.

El cuarto paso es el alcance histórico. La organización debe declarar qué fechas, poblaciones de visitantes y fuentes de telemetría examinó. Debe separar las referencias de endpoint, las solicitudes, las coincidencias de indicadores conocidas, las redirecciones y el daño reportado. Si faltan registros, la laguna debe permanecer explícita.

El quinto paso es la reparación. El propietario debe vincular el cambio a un lanzamiento, configuración o confirmación del proveedor. Debe dar cuenta de los activos generados, cachés, plugins, gestores de etiquetas y ramas condicionales. Meramente observar que el dominio suspendido ya no responde no es evidencia de eliminación.

El sexto paso es la verificación. Las pruebas deben cubrir las condiciones relevantes del navegador y confirmar que la página pública no hace ninguna solicitud al endpoint antiguo. El monitoreo debe buscar la reintroducción, orígenes de script inesperados y comportamiento de redirección. Cuando un proveedor suministró la corrección, el cliente debe verificar el resultado externo.

El séptimo paso es la comunicación. Un aviso debe usar definiciones estables y evitar convertir el uso en victimización. Debe explicar qué dependencia existía, si era alcanzable, qué evidencia de entrega maliciosa se encontró o no, qué cambió y qué incertidumbres permanecen. Los usuarios necesitan hechos prácticos, no una declaración amplia de que el problema fue "resuelto".

Finalmente, el propietario debe actualizar sus controles del ciclo de vida. Los scripts remotos de alta autoridad necesitan propietarios nombrados, fechas de revisión, registros de base de confianza, monitoreo de dominio y operador, rutas de desactivación de emergencia y retención de evidencia útil del navegador. De lo contrario, el mismo fallo de gobernanza puede repetirse bajo un nombre de host diferente.

Estas pruebas no requieren la divulgación de detalles defensivos sensibles. Requieren suficiente especificidad para hacer que la respuesta sea falsable. Un visitante, cliente o revisor debe poder distinguir "eliminamos la cadena" de "encontramos todas las rutas activas", y "no vimos explotación" de "nuestra evidencia la descarta para la población cubierta".

Una transferencia de dominio puede ser un cambio de software

Polyfill.io hizo difícil ignorar un principio simple: cuando un dominio devuelve código ejecutable, la propiedad del dominio es parte del estado de seguridad del software. La URL puede permanecer estable mientras el proveedor efectivo cambia. Un repositorio puede permanecer público mientras la respuesta alojada se mueve bajo un control diferente. HTTPS puede seguir siendo válido mientras la base de confianza que justificó la inclusión ya no existe.

Los avisos de febrero mostraron que este cambio era visible y accionable. Los informes de junio mostraron por qué importaba. La entrega selectiva de redirecciones explotó un modelo en el que diferentes visitantes podían recibir legítimamente código diferente, haciendo que la inspección casual fuera una garantía débil. La reescritura y suspensión posteriores limitaron la ruta, pero solo el inventario, la eliminación, la investigación y la verificación descendentes podían cerrar la parte de cada sitio web del problema.

El incidente no justifica llamar víctimas confirmadas a más de 100,000 sitios. No demuestra que cada referencia sirviera contenido malicioso, que cada visitante estuviera expuesto o que cada producto descendente fuera explotado. Tampoco justifica describir el código abierto original como universalmente malicioso o tratar una copia autoalojada como idéntica a la relación alojada comprometida.

Ni el evento respalda un veredicto legal o una historia de atribución completa a partir del registro disponible. La responsabilidad aquí es más limitada y más operativa. Es la obligación de explicar por qué se delegó autoridad ejecutable, cómo se detectó el cambio de control, qué evidencia estableció el alcance, qué acción redujo la exposición y cómo se verificó la reparación.

El operador del servicio, las empresas de infraestructura, el registrador, los mantenedores, los proveedores y los propietarios de sitios web tenían cada uno diferentes piezas de esa respuesta. La responsabilidad era compartida porque el sistema era compartido, pero no era fungible. Un registrador podía suspender un dominio y aún dejar código obsoleto. Un proveedor podía eliminar una referencia y aún carecer de la telemetría de visitantes del cliente. Un sitio web podía investigar a sus usuarios y aún depender de una parte ascendente para cambiar un componente empaquetado.

Para los propietarios descendentes, el estándar duradero es directo: conocer cada parte externa que puede elegir código para sus visitantes; monitorear los hechos que hicieron que esa parte fuera digna de confianza; eliminar la autoridad que ya no sirve una función necesaria; y conservar suficiente evidencia para distinguir exposición, entrega y daño.

Una etiqueta script puede ser una línea de HTML, pero crea una relación operativa. Cuando el propietario detrás de esa línea cambia, la relación de software también cambia. La responsabilidad del sitio web comienza por reconocer ese cambio antes de que un visitante tenga que revelarlo.

Fuentes

  1. https://sansec.io/research/polyfill-supply-chain-attack
  2. https://blog.cloudflare.com/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk/
  3. https://community.fastly.com/t/new-options-for-polyfill-io-users/2540
  4. https://github.com/formatjs/formatjs/issues/4363
  5. https://blog.cloudflare.com/automatically-replacing-polyfill-io-links-with-cloudflares-mirror-for-a-safer-internet/
  6. https://cert.ssi.gouv.fr/actualite/CERTFR-2024-ACT-030/
  7. https://soc.cyber.wa.gov.au/advisories/20240626004-JavaScript-Polyfill-Supply-Chain-Attack/
  8. https://tag-security.cncf.io/community/catalog/compromises/2024/polyfill/
  9. https://www.akamai.com/blog/security/polyfill-supply-chain-attack-what-to-know
  10. https://socket.dev/blog/namecheap-takes-down-polyfill-io-service-following-supply-chain-attack
  11. https://www.cve.org/CVERecord?id=CVE-2024-38537
  12. https://nvd.nist.gov/vuln/detail/cve-2024-38537
  13. https://jellyfish.co/library/jellyfish-security-advisory-june-27-2024/
  14. https://www.wordfence.com/threat-intel/vulnerabilities/detail/various-plugins-various-version-use-of-polyfillio
  15. https://codeql.github.com/codeql-query-help/javascript/js-functionality-from-untrusted-domain/
  16. https://cwe.mitre.org/data/definitions/830.html
  17. https://cheatsheetseries.owasp.org/cheatsheets/Third_Party_Javascript_Management_Cheat_Sheet.html
  18. https://www.w3.org/TR/SRI/
  19. https://developer.mozilla.org/en-US/docs/Web/Security/Practical_implementation_guides/SRI
  20. https://semgrep.dev/blog/2024/protect-your-code-from-the-polyfill-supply-chain-attack/
  21. https://cert-agid.gov.it/news/scoperto-un-grave-attacco-alla-supply-chain-del-servizio-polyfill-io-piu-di-100-000-i-siti-coinvolti/
  22. https://isomer-user-content.by.gov.sg/36/8bee5efc-3166-44a1-89ae-0f0b095ecb17/03-July-2024.pdf