@theoptimalpartner/npm-security-kit 1.0.2 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -125
- package/LICENSE +1 -1
- package/README.md +127 -426
- package/bin/npm-security-kit.js +12 -0
- package/package.json +17 -34
- package/src/checks/dockerfile.js +217 -0
- package/src/checks/index.js +10 -0
- package/src/checks/install-scripts.js +77 -0
- package/src/checks/malware.js +61 -0
- package/src/checks/node-version.js +234 -0
- package/src/checks/npm-policy.js +121 -0
- package/src/checks/vulnerabilities.js +79 -0
- package/src/cli.js +117 -0
- package/src/context.js +147 -0
- package/src/init.js +236 -0
- package/src/lib/allow-scripts.js +61 -0
- package/src/lib/audit.js +80 -0
- package/src/lib/diff.js +54 -0
- package/src/lib/dockerfile.js +74 -0
- package/src/lib/json-lines.js +12 -0
- package/src/lib/lockfile.js +48 -0
- package/src/lib/node-calendar.js +73 -0
- package/src/lib/npmrc.js +93 -0
- package/src/lib/semver.js +74 -0
- package/src/policy.js +36 -0
- package/src/report.js +68 -0
- package/src/run.js +35 -0
- package/src/version.js +3 -0
- package/EXAMPLES.md +0 -528
- package/QUICK_START.md +0 -291
- package/bin/check.js +0 -30
- package/bin/install.js +0 -36
- package/bin/install.sh +0 -318
- package/src/index.js +0 -71
- package/template/.github/dependabot.yml +0 -63
- package/template/.github/workflows/security-audit.yml +0 -218
- package/template/.security/config.json +0 -94
- package/template/.security/malicious-packages-blacklist.json +0 -259
- package/template/scripts/check-malicious-packages.sh +0 -118
- package/template/scripts/security-check.sh +0 -166
package/README.md
CHANGED
|
@@ -1,495 +1,196 @@
|
|
|
1
|
-
#
|
|
1
|
+
# npm-security-kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Reglas de seguridad de dependencias npm en un solo comando que corre en el pipeline **antes de `npm ci`**. No tiene
|
|
4
|
+
dependencias: `npx` descarga un solo tarball y revisa el lockfile antes de que se ejecute un solo install script.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
- ✅ 175+ paquetes maliciosos conocidos (campaña de phishing Oct 2025)
|
|
7
|
-
- ✅ Vulnerabilidades en dependencias
|
|
8
|
-
- ✅ Supply chain attacks
|
|
9
|
-
- ✅ Typosquatting
|
|
10
|
-
- ✅ Malware en dependencias transitivas
|
|
6
|
+
## Qué revisa
|
|
11
7
|
|
|
12
|
-
|
|
8
|
+
| Chequeo | Qué mira | Error (bloquea) | Aviso |
|
|
9
|
+
|---|---|---|---|
|
|
10
|
+
| `malware` | `npm audit` sobre **todo** el lockfile, incluidas las devDependencies | Cualquier advisory de malware (CWE-506), con cualquier severidad | — |
|
|
11
|
+
| `vulnerabilities` | `npm audit --omit=dev` | Vulnerabilidades `critical` en producción | Resumen de las `high` |
|
|
12
|
+
| `node-version` | `.nvmrc`, `.node-version`, `.tool-versions`, `engines.node`, `volta.node`, `FROM node:` y `image:` del pipeline | Línea de Node sin soporte o que no es LTS | Hay una LTS más nueva (mientras no tenga su primera release LTS, solo se informa), pocos días de soporte, parche de seguridad pendiente, versiones mayores distintas, nada fijado |
|
|
13
|
+
| `npm-policy` | `.npmrc`, `engines.npm`, npm en uso, lockfile | Faltan `min-release-age`, `engine-strict` o `strict-allow-scripts`; npm < 11.17; no hay lockfile | Faltan `min-release-age-exclude[]`, `save-exact` o `audit-level`; lockfile < v3 |
|
|
14
|
+
| `install-scripts` | Paquetes con install scripts del lockfile contra `allowScripts` | Alguno sin aprobar (con `strict-allow-scripts`) | Alguno sin aprobar con el override por variable de entorno |
|
|
15
|
+
| `dockerfile` | `COPY` del `.npmrc` antes de `npm ci`, `.dockerignore` | Instala sin el `.npmrc` | Usa `npm install` en vez de `npm ci`; el `.dockerignore` deja fuera el lockfile |
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
Las versiones y fechas de Node se leen de nodejs.org en cada corrida: el kit no las trae fijas.
|
|
15
18
|
|
|
16
|
-
###
|
|
19
|
+
### El `.npmrc` que pide
|
|
17
20
|
|
|
18
|
-
```
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
O si tienes el kit localmente:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Desde la raíz de tu proyecto
|
|
27
|
-
bash /ruta/a/npm-security-kit/install.sh
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Opción 2: Instalación Manual (3 pasos)
|
|
21
|
+
```ini
|
|
22
|
+
# Dependencias externas: mínimo 7 días desde su publicación
|
|
23
|
+
min-release-age=7
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
cp -r /ruta/a/npm-security-kit/template/.security .
|
|
35
|
-
cp -r /ruta/a/npm-security-kit/template/scripts .
|
|
36
|
-
cp -r /ruta/a/npm-security-kit/template/.github .
|
|
37
|
-
|
|
38
|
-
# 2. Hacer scripts ejecutables
|
|
39
|
-
chmod +x scripts/*.sh
|
|
40
|
-
|
|
41
|
-
# 3. Agregar scripts a package.json
|
|
42
|
-
# Ver sección "Scripts NPM" más abajo
|
|
43
|
-
```
|
|
25
|
+
# Paquetes internos: se pueden instalar inmediatamente
|
|
26
|
+
min-release-age-exclude[]=@theoptimalpartner/*
|
|
44
27
|
|
|
45
|
-
|
|
28
|
+
# Guardar versiones exactas
|
|
29
|
+
save-exact=true
|
|
46
30
|
|
|
47
|
-
|
|
31
|
+
# Validar engines (npm >= la versión mínima de la política)
|
|
32
|
+
engine-strict=true
|
|
48
33
|
|
|
49
|
-
|
|
34
|
+
# Install scripts: solo corren los aprobados en allowScripts (package.json)
|
|
35
|
+
strict-allow-scripts=true
|
|
50
36
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
├── .github/
|
|
54
|
-
│ ├── workflows/
|
|
55
|
-
│ │ └── security-audit.yml # GitHub Actions automático
|
|
56
|
-
│ └── dependabot.yml # Actualizaciones automáticas
|
|
57
|
-
├── .security/
|
|
58
|
-
│ ├── malicious-packages-blacklist.json # 175+ paquetes maliciosos
|
|
59
|
-
│ └── config.json # Configuración personalizable
|
|
60
|
-
├── scripts/
|
|
61
|
-
│ ├── check-malicious-packages.sh # Verificar paquetes maliciosos
|
|
62
|
-
│ └── security-check.sh # Auditoría completa
|
|
63
|
-
└── SECURITY.md # Documentación
|
|
37
|
+
# npm audit falla solo por vulnerabilidades críticas
|
|
38
|
+
audit-level=critical
|
|
64
39
|
```
|
|
65
40
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"scripts": {
|
|
71
|
-
"security:check": "./scripts/security-check.sh",
|
|
72
|
-
"security:check-malicious": "./scripts/check-malicious-packages.sh",
|
|
73
|
-
"security:audit": "npm audit --audit-level=moderate",
|
|
74
|
-
"security:audit:fix": "npm audit fix",
|
|
75
|
-
"security:outdated": "npm outdated",
|
|
76
|
-
"security:licenses": "npm list --json | jq -r '.dependencies | to_entries[] | \"\\(.key): \\(.value.license)\"'",
|
|
77
|
-
"security:full": "npm run security:audit && npm run security:check"
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
```
|
|
41
|
+
Además, `engines.npm` en `>=11.17`: npm 10 ignora `min-release-age` sin avisar y no aplica `allowScripts`.
|
|
81
42
|
|
|
82
|
-
|
|
43
|
+
## Uso
|
|
83
44
|
|
|
84
|
-
|
|
45
|
+
### En el pipeline
|
|
85
46
|
|
|
86
|
-
|
|
47
|
+
Un step **antes de `npm ci`**, con la versión del kit fija y solo en los PR a ramas que despliegan (ejemplo de
|
|
48
|
+
`bitbucket-pipelines.yml`, el pipeline que lee el chequeo de Node):
|
|
87
49
|
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
|
|
50
|
+
```yaml
|
|
51
|
+
definitions:
|
|
52
|
+
steps:
|
|
53
|
+
- step: &test
|
|
54
|
+
name: Test (supply chain + build)
|
|
55
|
+
image: node:24.22.1
|
|
56
|
+
caches:
|
|
57
|
+
- npm
|
|
58
|
+
script:
|
|
59
|
+
# Antes de instalar: malware, vulnerabilidades, Node, .npmrc, install scripts, Dockerfiles
|
|
60
|
+
- npx --yes --min-release-age=0 @theoptimalpartner/npm-security-kit@2.0.0 check
|
|
61
|
+
- npm ci # con strict-allow-scripts, los scripts no aprobados cortan acá
|
|
62
|
+
- npm audit signatures
|
|
63
|
+
- npm run build
|
|
91
64
|
|
|
92
|
-
|
|
93
|
-
|
|
65
|
+
pipelines:
|
|
66
|
+
pull-requests:
|
|
67
|
+
'**':
|
|
68
|
+
- step:
|
|
69
|
+
<<: *test
|
|
70
|
+
condition:
|
|
71
|
+
state: BITBUCKET_PR_DESTINATION_BRANCH == "develop" || BITBUCKET_PR_DESTINATION_BRANCH == "main"
|
|
94
72
|
```
|
|
95
73
|
|
|
96
|
-
|
|
74
|
+
- **Antes de `npm ci`:** `npm audit` funciona solo con el lockfile, así que el malware se detecta antes de que
|
|
75
|
+
corra su `postinstall`.
|
|
76
|
+
- **Versión fija** (`@2.0.0`): subir la política en un repo es un cambio visible en su PR.
|
|
77
|
+
- **`--min-release-age=0` solo para `npx`:** `npx` no aplica `min-release-age-exclude` (npm 11.19.1 lo aplica al
|
|
78
|
+
instalar, no al resolver el paquete de `npx`). Sin el flag, dentro de un repo con `min-release-age=7` una versión
|
|
79
|
+
nueva del kit no se puede usar hasta cumplir 7 días (`ETARGET … with a date before`). Afecta solo al kit: la
|
|
80
|
+
versión va fija y no tiene dependencias. El `npm ci` que sigue aplica los 7 días como siempre.
|
|
81
|
+
- **`npm audit signatures`** va después de `npm ci` porque necesita `node_modules`.
|
|
82
|
+
- Para guardar el resultado como artefacto: `npx --yes --min-release-age=0 @theoptimalpartner/npm-security-kit@2.0.0 check --json > npm-security-kit.json`.
|
|
97
83
|
|
|
98
|
-
|
|
99
|
-
# Verificación rápida
|
|
100
|
-
npm run security:audit
|
|
101
|
-
|
|
102
|
-
# Verificación completa (recomendado)
|
|
103
|
-
npm run security:full
|
|
104
|
-
```
|
|
84
|
+
### Dockerfile
|
|
105
85
|
|
|
106
|
-
|
|
86
|
+
El `.npmrc` se copia con el lockfile, antes de `npm ci`. Si no, dentro de la imagen no aplican
|
|
87
|
+
`strict-allow-scripts`, `min-release-age` ni `engine-strict`:
|
|
107
88
|
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
npm
|
|
111
|
-
|
|
112
|
-
# Si hay problemas, auto-fix
|
|
113
|
-
npm run security:audit:fix
|
|
89
|
+
```dockerfile
|
|
90
|
+
COPY package.json package-lock.json .npmrc ./
|
|
91
|
+
RUN npm ci
|
|
114
92
|
```
|
|
115
93
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
## ⚙️ Configuración
|
|
119
|
-
|
|
120
|
-
### Personalizar para tu Proyecto
|
|
121
|
-
|
|
122
|
-
Edita `.security/config.json`:
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"projectName": "mi-proyecto",
|
|
127
|
-
"projectType": "node",
|
|
128
|
-
"excludeDirs": ["node_modules", "dist", "build"],
|
|
129
|
-
"strictMode": true,
|
|
130
|
-
"notifications": {
|
|
131
|
-
"email": "security@tuempresa.com",
|
|
132
|
-
"slack": "https://hooks.slack.com/..."
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Tipos de Proyecto Soportados
|
|
138
|
-
|
|
139
|
-
- `node` - Proyectos Node.js backend
|
|
140
|
-
- `react` - Aplicaciones React
|
|
141
|
-
- `nextjs` - Aplicaciones Next.js
|
|
142
|
-
- `vue` - Aplicaciones Vue.js
|
|
143
|
-
- `express` - APIs Express
|
|
144
|
-
- `serverless` - Funciones serverless
|
|
145
|
-
- `library` - Librerías npm
|
|
146
|
-
|
|
147
|
-
---
|
|
94
|
+
Si el `.dockerignore` excluye el `.npmrc` (por ejemplo con `.*`), agregar `!.npmrc` al final.
|
|
148
95
|
|
|
149
|
-
|
|
96
|
+
### Adoptarlo en un repo: `init`
|
|
150
97
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
**Blacklist de 175+ paquetes conocidos**:
|
|
154
|
-
- Campaña de phishing Oct 2025
|
|
155
|
-
- Patrones maliciosos (`redirect-*`)
|
|
156
|
-
- Dominios de phishing
|
|
157
|
-
- Cuentas npm comprometidas
|
|
98
|
+
Una vez por repo, en una rama:
|
|
158
99
|
|
|
159
100
|
```bash
|
|
160
|
-
|
|
101
|
+
npx --yes --min-release-age=0 @theoptimalpartner/npm-security-kit@2.0.0 init --dry-run
|
|
161
102
|
```
|
|
162
103
|
|
|
163
|
-
### 2. Auditoría Automática
|
|
164
|
-
|
|
165
|
-
**npm audit mejorado**:
|
|
166
|
-
- Verifica vulnerabilidades conocidas
|
|
167
|
-
- Auto-fix cuando es posible
|
|
168
|
-
- Reportes detallados
|
|
169
|
-
|
|
170
104
|
```bash
|
|
171
|
-
|
|
105
|
+
npx --yes --min-release-age=0 @theoptimalpartner/npm-security-kit@2.0.0 init
|
|
172
106
|
```
|
|
173
107
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
**Verificación en cada PR/Push**:
|
|
177
|
-
- ✅ npm audit
|
|
178
|
-
- ✅ Paquetes maliciosos
|
|
179
|
-
- ✅ Dependency review
|
|
180
|
-
- ✅ License compliance
|
|
181
|
-
- ✅ Secrets detection
|
|
108
|
+
`init`:
|
|
182
109
|
|
|
183
|
-
|
|
110
|
+
- agrega al `.npmrc` las claves de la política que faltan (con un comentario) y corrige las que tienen otro valor,
|
|
111
|
+
sin borrar ni reordenar nada;
|
|
112
|
+
- completa `engines.npm` (`>=11.17`) y, solo si falta, `engines.node`;
|
|
113
|
+
- **no aprueba install scripts**: lista los pendientes y los comandos para revisarlos;
|
|
114
|
+
- **no edita** `bitbucket-pipelines.yml` ni los Dockerfiles: muestra el step y los `COPY` corregidos;
|
|
115
|
+
- se puede correr de nuevo sin cambiar nada.
|
|
184
116
|
|
|
185
|
-
|
|
117
|
+
Después: revisar el diff, aprobar o negar los install scripts, aplicar el step y el Dockerfile, y correr `check`.
|
|
186
118
|
|
|
187
|
-
|
|
188
|
-
- Security patches prioritarios
|
|
189
|
-
- Agrupación inteligente
|
|
190
|
-
- PRs con contexto
|
|
191
|
-
|
|
192
|
-
### 5. Pre-commit Hooks (Opcional)
|
|
193
|
-
|
|
194
|
-
Instalar con Husky:
|
|
119
|
+
### En local
|
|
195
120
|
|
|
196
121
|
```bash
|
|
197
|
-
|
|
198
|
-
npx husky init
|
|
199
|
-
echo "npm run security:check-malicious" > .husky/pre-commit
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## 📊 Ejemplos de Salida
|
|
205
|
-
|
|
206
|
-
### ✅ Proyecto Limpio
|
|
207
|
-
|
|
122
|
+
npx --yes --min-release-age=0 @theoptimalpartner/npm-security-kit@2.0.0 check
|
|
208
123
|
```
|
|
209
|
-
========================================
|
|
210
|
-
Malicious Package Detection
|
|
211
|
-
========================================
|
|
212
|
-
|
|
213
|
-
Loading blacklist...
|
|
214
|
-
✓ Loaded 175 malicious packages
|
|
215
|
-
Source: Socket.dev - 175 Malicious npm Packages...
|
|
216
|
-
Last Updated: 2025-10-20
|
|
217
|
-
|
|
218
|
-
Analyzing installed packages...
|
|
219
|
-
Total installed packages: 342
|
|
220
|
-
|
|
221
|
-
Checking against blacklist...
|
|
222
|
-
|
|
223
|
-
Checking against malicious patterns...
|
|
224
|
-
|
|
225
|
-
========================================
|
|
226
|
-
Results
|
|
227
|
-
========================================
|
|
228
|
-
✓ No malicious packages detected
|
|
229
|
-
|
|
230
|
-
Summary:
|
|
231
|
-
- Checked: 342 packages
|
|
232
|
-
- Against: 175 known malicious packages
|
|
233
|
-
- Found: 0 threats
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### ❌ Amenaza Detectada
|
|
237
|
-
|
|
238
|
-
```
|
|
239
|
-
========================================
|
|
240
|
-
Results
|
|
241
|
-
========================================
|
|
242
|
-
✗ MALICIOUS PACKAGES FOUND!
|
|
243
|
-
|
|
244
|
-
Summary:
|
|
245
|
-
- Direct matches: 1
|
|
246
|
-
- Pattern matches: 0
|
|
247
|
-
- Total threats: 1
|
|
248
|
-
|
|
249
|
-
Malicious packages found:
|
|
250
|
-
- redirect-abc123 (direct match)
|
|
251
|
-
|
|
252
|
-
IMMEDIATE ACTIONS REQUIRED:
|
|
253
|
-
1. DO NOT use this application
|
|
254
|
-
2. Uninstall malicious packages immediately
|
|
255
|
-
3. Review application logs for suspicious activity
|
|
256
|
-
4. Check for data exfiltration
|
|
257
|
-
5. Report to security team
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## 🔄 Actualización
|
|
263
|
-
|
|
264
|
-
### Actualizar Blacklist
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
# Descargar última blacklist
|
|
268
|
-
curl -o .security/malicious-packages-blacklist.json \
|
|
269
|
-
https://raw.githubusercontent.com/tu-org/npm-security-kit/main/blacklist.json
|
|
270
124
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
```
|
|
125
|
+
No se instala como devDependency ni usa husky: el `.npmrc` protege el `npm install` local y el pipeline es el
|
|
126
|
+
control que no se puede saltar.
|
|
274
127
|
|
|
275
|
-
|
|
128
|
+
## Cómo leer la salida
|
|
276
129
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
```
|
|
130
|
+
Un bloque por chequeo. `✗` error, `⚠` aviso, `ℹ` información, con `archivo:línea` cuando aplica. Cada mensaje dice
|
|
131
|
+
qué hacer. Cuando el mismo aviso aparece en varios archivos (por ejemplo, la misma versión de Node en `.nvmrc`,
|
|
132
|
+
Dockerfile y pipeline) va una sola vez, con la lista de archivos.
|
|
281
133
|
|
|
282
|
-
|
|
134
|
+
| Exit code | Significado |
|
|
135
|
+
|---|---|
|
|
136
|
+
| 0 | Sin errores (puede haber avisos) |
|
|
137
|
+
| 1 | Hay al menos un error |
|
|
138
|
+
| 2 | Uso incorrecto o fallo del kit |
|
|
283
139
|
|
|
284
|
-
|
|
140
|
+
`check --json` escribe solo JSON en stdout:
|
|
141
|
+
`{ kitVersion, policy, results: [{ check, level, message, file?, line?, data? }], summary: { errors, warnings } }`.
|
|
285
142
|
|
|
286
|
-
|
|
143
|
+
## Recetas
|
|
287
144
|
|
|
288
|
-
|
|
289
|
-
# ❌ NO HACER
|
|
290
|
-
npm install paquete-random
|
|
291
|
-
|
|
292
|
-
# ✅ HACER
|
|
293
|
-
npm info paquete-random
|
|
294
|
-
npm view paquete-random repository
|
|
295
|
-
npm view paquete-random license
|
|
296
|
-
npm install paquete-random
|
|
297
|
-
npm run security:check-malicious
|
|
298
|
-
```
|
|
145
|
+
### `npm ci` falla con EUSAGE (lockfile incompleto)
|
|
299
146
|
|
|
300
|
-
|
|
147
|
+
Pasa con lockfiles generados con npm 10, a los que les faltan opcionales de plataforma. Regenerarlo con npm 11:
|
|
301
148
|
|
|
302
149
|
```bash
|
|
303
|
-
|
|
304
|
-
npm run security:outdated
|
|
305
|
-
|
|
306
|
-
# Actualizar con cuidado
|
|
307
|
-
npm update
|
|
308
|
-
npm run security:full
|
|
150
|
+
npm install --package-lock-only
|
|
309
151
|
```
|
|
310
152
|
|
|
311
|
-
###
|
|
312
|
-
|
|
313
|
-
- ✅ Priorizar PRs de seguridad
|
|
314
|
-
- ✅ Leer changelog antes de aprobar
|
|
315
|
-
- ✅ Probar en staging primero
|
|
316
|
-
|
|
317
|
-
### 4. Auditorías Regulares
|
|
318
|
-
|
|
319
|
-
| Frecuencia | Acción | Comando |
|
|
320
|
-
|------------|--------|---------|
|
|
321
|
-
| **Diario** | Revisar Dependabot PRs | GitHub UI |
|
|
322
|
-
| **Semanal** | GitHub Actions (automático) | - |
|
|
323
|
-
| **Mensual** | Auditoría manual completa | `npm run security:full` |
|
|
324
|
-
| **Trimestral** | Actualizar blacklist | Ver sección Actualización |
|
|
325
|
-
|
|
326
|
-
---
|
|
327
|
-
|
|
328
|
-
## 🚨 Respuesta a Incidentes
|
|
329
|
-
|
|
330
|
-
### Si se Detecta un Paquete Malicioso
|
|
331
|
-
|
|
332
|
-
1. **DETENER** - No desplegar ni ejecutar
|
|
333
|
-
2. **AISLAR** - Marcar entorno como comprometido
|
|
334
|
-
3. **ANALIZAR**:
|
|
335
|
-
```bash
|
|
336
|
-
npm run security:check-malicious
|
|
337
|
-
npm list | grep nombre-paquete
|
|
338
|
-
git log package-lock.json
|
|
339
|
-
```
|
|
340
|
-
4. **REMOVER**:
|
|
341
|
-
```bash
|
|
342
|
-
npm uninstall nombre-paquete
|
|
343
|
-
npm audit
|
|
344
|
-
npm run security:full
|
|
345
|
-
```
|
|
346
|
-
5. **INVESTIGAR**:
|
|
347
|
-
- Revisar logs de aplicación
|
|
348
|
-
- Verificar conexiones de red
|
|
349
|
-
- Buscar data exfiltration
|
|
350
|
-
6. **REPORTAR**:
|
|
351
|
-
- Equipo de seguridad interno
|
|
352
|
-
- npm security (security@npmjs.com)
|
|
353
|
-
- Socket.dev (https://socket.dev/report)
|
|
354
|
-
|
|
355
|
-
---
|
|
153
|
+
### Parche urgente con menos de 7 días
|
|
356
154
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
### Error: "jq command not found"
|
|
360
|
-
|
|
361
|
-
```bash
|
|
362
|
-
# Ubuntu/Debian
|
|
363
|
-
sudo apt-get install jq
|
|
364
|
-
|
|
365
|
-
# macOS
|
|
366
|
-
brew install jq
|
|
367
|
-
|
|
368
|
-
# Windows (WSL)
|
|
369
|
-
sudo apt-get install jq
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
### Error: "Permission denied" en scripts
|
|
155
|
+
`min-release-age=7` no deja instalar versiones recién publicadas. Para un parche de seguridad que no puede esperar:
|
|
373
156
|
|
|
374
157
|
```bash
|
|
375
|
-
|
|
158
|
+
npm install paquete@x.y.z --min-release-age=0
|
|
376
159
|
```
|
|
377
160
|
|
|
378
|
-
|
|
161
|
+
Dejar en la descripción del PR qué versión es, por qué no puede esperar (el advisory) y quién lo aprobó, y revisar que
|
|
162
|
+
el lockfile solo cambió en ese paquete y sus dependencias.
|
|
379
163
|
|
|
380
|
-
|
|
164
|
+
### Aprobar o negar install scripts
|
|
381
165
|
|
|
382
166
|
```bash
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
167
|
+
npm ci --ignore-scripts
|
|
168
|
+
npm install-scripts ls
|
|
169
|
+
npm install-scripts approve esbuild # baja el binario de su plataforma: lo necesita
|
|
170
|
+
npm install-scripts deny core-js # solo imprime un mensaje: no hace falta
|
|
386
171
|
```
|
|
387
172
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## 📚 Recursos
|
|
395
|
-
|
|
396
|
-
### Documentación Adicional
|
|
397
|
-
|
|
398
|
-
- **SECURITY_PROTOCOL.md** - Protocolo completo (en auth-service)
|
|
399
|
-
- **SECURITY_AUDIT_REPORT.md** - Ejemplo de informe
|
|
400
|
-
- **SECURITY_QUICK_GUIDE.md** - Guía rápida
|
|
401
|
-
|
|
402
|
-
### Enlaces Útiles
|
|
173
|
+
Se aprueba lo que necesita compilar o bajar binarios para funcionar, y se niega lo que es solo telemetría o
|
|
174
|
+
publicidad. El kit no aprueba nada en automático. Queda en `allowScripts` del `package.json`. Reglas (las mismas de
|
|
175
|
+
npm):
|
|
403
176
|
|
|
404
|
-
-
|
|
405
|
-
-
|
|
406
|
-
-
|
|
407
|
-
-
|
|
177
|
+
- `"pkg": true|false` vale para cualquier versión; `"pkg@1.2.3"` solo para esa; `"pkg@1.2.3 || 1.2.4"` para una lista.
|
|
178
|
+
- `false` le gana a `true`.
|
|
179
|
+
- **npm ignora los rangos** (`pkg@^1`) y los dist-tags (`pkg@latest`): esa entrada no aprueba nada, y el kit lo avisa.
|
|
180
|
+
- Las opcionales de otra plataforma (como `fsevents` en Linux) npm no las instala: en el pipeline no cuentan.
|
|
408
181
|
|
|
409
|
-
###
|
|
182
|
+
### Desactivar `strict-allow-scripts` en un repo (override)
|
|
410
183
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
- GitHub Security: https://github.com/security
|
|
184
|
+
Si un repo no puede adoptar todavía la aprobación de install scripts, se define la variable de npm, que le gana al
|
|
185
|
+
`.npmrc`:
|
|
414
186
|
|
|
415
|
-
|
|
187
|
+
- en el pipeline: *Repository variable* `npm_config_strict_allow_scripts` = `false`;
|
|
188
|
+
- en local: `npm_config_strict_allow_scripts=false npm ci`.
|
|
416
189
|
|
|
417
|
-
|
|
190
|
+
Con el override, npm ejecuta los scripts sin aprobar y el kit los informa como **aviso**, más un aviso de que el
|
|
191
|
+
override está activo. Dentro del `docker build` la variable no llega sola: hay que pasarla como `ARG`.
|
|
418
192
|
|
|
419
|
-
###
|
|
420
|
-
|
|
421
|
-
1. Verificar en múltiples fuentes (Socket.dev, Snyk, GitHub)
|
|
422
|
-
2. Editar `.security/malicious-packages-blacklist.json`
|
|
423
|
-
3. Agregar evidencia y referencias
|
|
424
|
-
4. Pull request con documentación
|
|
425
|
-
|
|
426
|
-
### Mejorar Scripts
|
|
427
|
-
|
|
428
|
-
1. Fork del repositorio
|
|
429
|
-
2. Crear rama con feature
|
|
430
|
-
3. Probar en múltiples proyectos
|
|
431
|
-
4. PR con tests y documentación
|
|
432
|
-
|
|
433
|
-
---
|
|
434
|
-
|
|
435
|
-
## 📄 Licencia
|
|
436
|
-
|
|
437
|
-
MIT License - Úsalo libremente en proyectos comerciales y open source
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
## ⭐ Proyectos Usando Este Kit
|
|
442
|
-
|
|
443
|
-
- auth-service
|
|
444
|
-
- jwt-auth-package
|
|
445
|
-
- auth-react-client
|
|
446
|
-
|
|
447
|
-
¿Usas este kit? Agrega tu proyecto aquí!
|
|
448
|
-
|
|
449
|
-
---
|
|
450
|
-
|
|
451
|
-
## 🎯 Roadmap
|
|
452
|
-
|
|
453
|
-
- [ ] npm package instalable (`npm install -D @tuorg/security-kit`)
|
|
454
|
-
- [ ] Integración con más CI/CD (GitLab, Bitbucket, CircleCI)
|
|
455
|
-
- [ ] Dashboard web de métricas
|
|
456
|
-
- [ ] Integración con Slack/Discord
|
|
457
|
-
- [ ] Soporte para Python/pip, Ruby/gems, etc.
|
|
458
|
-
- [ ] Machine learning para detectar patrones
|
|
459
|
-
|
|
460
|
-
---
|
|
461
|
-
|
|
462
|
-
## 📞 Soporte
|
|
463
|
-
|
|
464
|
-
- **Issues**: GitHub Issues
|
|
465
|
-
- **Discusiones**: GitHub Discussions
|
|
466
|
-
- **Email**: security@tuempresa.com
|
|
467
|
-
- **Slack**: #security channel
|
|
468
|
-
|
|
469
|
-
---
|
|
470
|
-
|
|
471
|
-
**Versión**: 1.0.0
|
|
472
|
-
**Última actualización**: 2025-10-20
|
|
473
|
-
**Mantenedor**: Diego
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
|
-
## 🚀 Quick Start
|
|
478
|
-
|
|
479
|
-
```bash
|
|
480
|
-
# 1. Clonar o descargar el kit
|
|
481
|
-
git clone https://github.com/tu-org/npm-security-kit
|
|
482
|
-
|
|
483
|
-
# 2. Ir a tu proyecto
|
|
484
|
-
cd mi-proyecto
|
|
485
|
-
|
|
486
|
-
# 3. Ejecutar instalación
|
|
487
|
-
bash /ruta/a/npm-security-kit/install.sh
|
|
488
|
-
|
|
489
|
-
# 4. Verificar
|
|
490
|
-
npm run security:check-malicious
|
|
491
|
-
|
|
492
|
-
# 5. ¡Listo! Tu proyecto está protegido
|
|
493
|
-
```
|
|
193
|
+
### El registro de npm no responde
|
|
494
194
|
|
|
495
|
-
|
|
195
|
+
El chequeo de malware falla cerrado: `no se pudo consultar los advisories del registro (…); reintentar el step`.
|
|
196
|
+
No es un hallazgo de seguridad; se reintenta el step. Si nodejs.org no responde, `node-version` avisa y se omite.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { main } from '../src/cli.js';
|
|
3
|
+
|
|
4
|
+
main(process.argv.slice(2)).then(
|
|
5
|
+
(code) => {
|
|
6
|
+
process.exitCode = code;
|
|
7
|
+
},
|
|
8
|
+
(error) => {
|
|
9
|
+
process.stderr.write(`npm-security-kit: fallo interno: ${error?.stack ?? error}\n`);
|
|
10
|
+
process.exitCode = 2;
|
|
11
|
+
},
|
|
12
|
+
);
|