Saltar al contenido
← Volver a Onopen

Guía por archivo

Scripts postinstall: lo que se ejecuta al instalar dependencias

El primer comando que casi todo el mundo escribe después de clonar es npm install. Ese comando no solo descarga paquetes: ejecuta los scripts que el proyecto y sus dependencias declaran para la instalación.

package.json.pnpmfile.cjs.yarnrc.ymlcomposer.jsonGemfile

Lo medimos

19.0%

de los 9,997 repositorios más populares de GitHub tienen al menos un hallazgo de la familia npm.

447 · 121 · 57

repositorios con hallazgos de pnpm, Yarn y Composer, respectivamente.

Cómo lo medimos

Qué se ejecuta y cuándo

En package.json, los scripts preinstall, install, postinstall y prepare del propio proyecto se ejecutan al hacer npm install en esa carpeta, con tu usuario. Los de las dependencias también, salvo que lo impidas. pnpm 10 y Bun ya no ejecutan los scripts de las dependencias si no los apruebas, pero los del proyecto raíz siguen corriendo.

Hay otras rutas menos conocidas. .pnpmfile.cjs es código JavaScript que pnpm carga en cada instalación. En Yarn moderno, .yarnrc.yml puede apuntar yarnPath a un archivo del repositorio que se ejecuta con cada comando yarn, y declarar plugins locales. En PHP, composer.json define scripts como post-install-cmd. En Ruby, el Gemfile es código que Bundler evalúa. Y una dependencia que llega desde una URL de git en vez del registro esquiva las comprobaciones habituales.

Lo que ya ha pasado

Según CISA, en septiembre de 2025 el gusano Shai-Hulud comprometió más de 500 paquetes de npm. CERT/CC describe que la primera oleada se apoyaba en un script postinstall que ejecutaba un bundle.js malicioso, y recomienda instalar con --ignore-scripts donde sea posible.

Es la familia más grande de nuestro estudio: 1,899 de los 9,997 repositorios más populares (19.0%) tienen al menos un hallazgo de npm. La mayoría son legítimos, como compilar un módulo nativo. Precisamente por eso nadie los lee, y es donde mejor se esconde uno que no lo es.

Cómo revisarlo a mano

Antes de instalar, lee la sección scripts de package.json y busca los ganchos de instalación. Abre cualquier archivo al que apunten. Revisa también .pnpmfile.cjs, yarnPath y los plugins de .yarnrc.yml, y los scripts de composer.json.

Para instalar sin ejecutar nada, usa --ignore-scripts (o ignore-scripts=true en .npmrc de tu usuario) y ejecuta a mano solo los scripts que hayas leído. En Composer, --no-scripts.

node -e "console.log(require('./package.json').scripts)"ls .pnpmfile.cjs 2>/dev/null; grep -nE 'yarnPath|plugins' .yarnrc.yml 2>/dev/nullnpm install --ignore-scripts

Qué marca Onopen

El escáner packages lee la configuración de npm, pnpm, Bun, Yarn, Composer y Bundler. Marca los scripts de instalación (la regla npm/install-lifecycle-script), los módulos precargados y las opciones de arranque de npm, el código propio del gestor y sus plugins, las aprobaciones de build y las dependencias que llegan por URL directa.

Onopen no juzga la intención: un postinstall que compila y uno que roba credenciales salen igual. Te dice dónde mirar. Si ya revisaste uno, puedes silenciarlo en .onopenignore y el informe seguirá contando lo silenciado.

onopen --only packages --explain ./repo

Preguntas frecuentes

¿npm install ejecuta código?

Sí. Ejecuta los scripts de instalación del proyecto y, salvo que lo impidas, los de las dependencias. --ignore-scripts lo evita.

¿Usar pnpm o Bun me protege?

En parte: no ejecutan los scripts de las dependencias sin aprobación. Los del propio proyecto y archivos como .pnpmfile.cjs siguen ejecutándose.

¿Un postinstall es señal de malware?

No. Muchos paquetes lo usan para compilar o descargar binarios. Es una ruta de ejecución que vale la pena leer, no un veredicto.

Fuentes

Otras guías

Revisa un repositorio antes de abrirlo

Onopen es gratis y de código abierto. Lee la configuración, no ejecuta nada y no abre ninguna conexión.