Un ataque de dependencia permite la ejecución de código en PayPal, Microsoft, Apple, Netflix, Uber y otras 30 empresas
Hace pocos dias se dio a conocer un método sorprendentemente simple que permite atacar dependencias en aplicaciones que se desarrollan utilizando repositorios de paquetes internos. Los investigadores que identificaron el problema pudieron ejecutar su código en los servidores internos de 35 empresas, incluidas PayPal, Microsoft, Apple, Netflix, Uber, Tesla y Shopify.
Los hacks se llevaron a cabo como parte de los programas Bug Bounty, en coordinación con las empresas atacadas y ya se les ha aportado a los autores 130.000 dólares en forma de bonificaciones por identificar vulnerabilidades.
El método se basa en el hecho de que muchas empresas utilizan dependencias de repositorios estándar de NPM, PyPI y RubyGems en sus aplicaciones internas, así como dependencias internas que no se distribuyen públicamente ni se descargan de sus propios repositorios.
El problema es que los administradores de paquetes como npm, pip y gem intentan descargar las dependencias internas de las empresas, incluso de los repositorios públicos. Para un ataque, basta con definir los nombres de los paquetes con dependencias internas y crear sus propios paquetes con los mismos nombres en los repositorios públicos de NPM, PyPI y RubyGems.
El problema no es específico de NPM, PyPI y RubyGems, y también se manifiesta en otros sistemas como NuGet, Maven y Yarn.
La idea del método propuesto apareció después de que un investigador notó accidentalmente que en el código disponible públicamente publicado en GitHub, muchas empresas no eliminan de sus archivos de manifiesto la mención de dependencias adicionales utilizadas en proyectos internos o al implementar funcionalidades extendidas. Se han encontrado rastros similares en el código JavaScript de los servicios web, así como en los proyectos Node.JS, Python y Ruby de muchas empresas.
Las principales filtraciones estaban relacionadas con la incrustación del contenido de los archivos package.json en el código JavaScript disponible públicamente durante el proceso de compilación, así como con el uso de elementos de ruta reales en llamadas require(), que se pueden usar para juzgar los nombres de dependencias.
El escaneo de varios millones de dominios corporativos reveló varios miles de nombres de paquetes de JavaScript que no estaban en el repositorio de NPM. Habiendo recopilado una base de datos de nombres de paquetes internos, el investigador decidió realizar un experimento para piratear la infraestructura de las empresas que participan en los programas Bug Bounty. Los resultados fueron sorprendentemente efectivos y el investigador pudo ejecutar su código en muchas computadoras de desarrollo y servidores responsables de construir o probar con base en sistemas de integración continua.
Al descargar dependencias, los administradores de paquetes npm, pip y gem instalaron principalmente paquetes de los repositorios públicos primarios NPM, PyPI y RubyGems, que se consideraron de mayor prioridad.
La presencia de paquetes similares con los mismos nombres en los repositorios de empresas privadas se ignoró sin mostrar ninguna advertencia ni provocar bloqueos que pudieran llamar la atención de los administradores. En PyPI, la prioridad de descarga estaba influenciada por el número de versión (independientemente del repositorio, se descargó la versión más reciente del paquete). En NPM y RubyGems, la prioridad solo dependía del repositorio.
El investigador ha colocado paquetes en repositorios de NPM, PyPI y RubyGems que se cruzan con los nombres de las dependencias internas encontradas, agregando código al script que se ejecuta antes de la instalación (preinstalado en NPM) para recopilar información sobre el sistema y enviar la información recibida al host externo.
Para transmitir información sobre el éxito del hackeo, eludir los cortafuegos que bloquean el tráfico externo, el método de organización de las comunicaciones de canal encubierto sobre el protocolo DNS. El código que se estaba ejecutando resolvió el host en el dominio atacante bajo el control del dominio atacante, lo que hizo posible recopilar información sobre operaciones exitosas en el servidor DNS. Se pasó información sobre el host, el nombre de usuario y la ruta actual.
El 75% de todas las ejecuciones de código registradas se asociaron con descargas de paquetes NPM, principalmente debido al hecho de que había significativamente más nombres de módulos internos de JavaScript que nombres de dependencias en Python y Ruby.
Fuente: https://medium.com/