Uno de los desarrolladores de paquetes de JavaScript llevó a cabo un experimento creando y publicando en el repositorio NPM un paquete "everything", que cubre con sus dependencias todos los paquetes existentes en el repositorio. Para implementar esta posibilidad, el paquete "everything" está vinculado como dependencias directas a cinco paquetes "@everything-registry/chunk-N", que a su vez están vinculados como dependencias a más de 3000 paquetes "sub-chunk-N", en cada uno de los cuales se realiza una vinculación a 800 paquetes existentes en el repositorio.
La publicación de "everything" en NPM provocó dos efectos interesantes. En primer lugar, el paquete "everything" se convirtió en un tipo de herramienta para llevar a cabo ataques de DoS, ya que intentar su instalación resulta en la descarga de millones de paquetes alojados en NPM, agotando el espacio en disco disponible o deteniendo la ejecución de procesos de construcción. Según estadísticas, el paquete NPM fue descargado alrededor de 250 veces, pero nadie impide agregarlo como dependencia a otro paquete tras el hackeo de la cuenta del desarrollador para realizar una acción destructiva. Además, involuntariamente, algunas herramientas y servicios que monitorizan y verifican nuevos paquetes publicados en NPM se vieron afectados por el ataque.
En segundo lugar, la publicación del paquete "everything" bloqueó de hecho la posibilidad de eliminar cualquier paquete en NPM que estuviera en la lista de sus dependencias. Un paquete en NPM solo puede ser eliminado por su autor si aún no se está utilizando como dependencia en otros paquetes, pero después de la publicación de "everything", todos los paquetes en el repositorio se vieron cubiertos por sus dependencias. Curiosamente, la eliminación del propio paquete "everything" también se bloqueó, ya que hace 9 años se publicó un paquete de prueba llamado "everything-else", en el que se indicó la cadena "everything" en la lista de dependencias. Por lo tanto, el paquete "everything" terminó siendo dependiente de otro paquete después de su publicación.
Fuente: opennet.ru
