secmanifest 1.0.0

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/README.md ADDED
@@ -0,0 +1,308 @@
1
+ # secmanifest
2
+
3
+ Herramienta de CLI para auditoria de seguridad profunda en proyectos JavaScript/TypeScript. Detecta vulnerabilidades, malware, backdoors, secrets expuestos y paquetes comprometidos antes de que te hackeen.
4
+
5
+ ## Instalacion
6
+
7
+ ### Opcion 1: Desde el repositorio
8
+
9
+ ```bash
10
+ git clone https://github.com/tu-usuario/secmanifest.git
11
+ cd secmanifest
12
+ bun install
13
+ bun run build
14
+ bun link
15
+ ```
16
+
17
+ ### Opcion 2: Compilar directamente
18
+
19
+ ```bash
20
+ bun install
21
+ bun run build
22
+ # El binario se genera como secmanifest.exe
23
+ ```
24
+
25
+ ### Requisitos
26
+
27
+ - [Bun](https://bun.sh) >= 1.0
28
+ - Un gestor de paquetes seguro: **pnpm**, **bun** o **yarn** (npm esta bloqueado por seguridad)
29
+
30
+ ## Comandos Disponibles
31
+
32
+ ### `secmanifest audit`
33
+
34
+ Auditoria de seguridad completa. Ejecuta 10 escaners diferentes.
35
+
36
+ ```bash
37
+ secmanifest audit # Audita directorio actual
38
+ secmanifest audit ./mi-proyecto # Audita un directorio especifico
39
+ secmanifest audit --json # Output en formato JSON
40
+ secmanifest audit --quick # Escaneo rapido (sin API externa)
41
+ secmanifest audit --auto-fix # Arregla paquetes inseguros automaticamente
42
+ ```
43
+
44
+ #### Opciones
45
+
46
+ | Flag | Descripcion |
47
+ |------|-------------|
48
+ | `--json` | Output en formato JSON para integracion con otros tools |
49
+ | `--verbose` | Muestra errores detallados durante el escaneo |
50
+ | `--quick` | Escaneo local sin consultar Sonatype OSS Index ni paquetes outdated |
51
+ | `--auto-fix` | Arregla automaticamente paquetes con "latest" o deprecated |
52
+ | `--skip-malware` | Omitir escaneo de malware y typosquatting |
53
+ | `--skip-secrets` | Omitir escaneo de secrets y credenciales |
54
+ | `--skip-licenses` | Omitir escaneo de licencias restrictivas |
55
+ | `--skip-outdated` | Omitir escaneo de paquetes desactualizados |
56
+ | `--skip-metadata` | Omitir escaneo de metadata sospechosa |
57
+ | `--skip-obfuscation` | Omitir escaneo de codigo ofuscado |
58
+ | `--skip-node-version` | Omitir chequeo de Node.js EOL |
59
+
60
+ ### `secmanifest check`
61
+
62
+ Escaneo rapido de seguridad sin consultar APIs externas. Ideal para CI/CD o ejecuciones rapidas.
63
+
64
+ ```bash
65
+ secmanifest check # Escaneo rapido
66
+ secmanifest check --json # Output JSON
67
+ secmanifest check ./proyecto # Directorio especifico
68
+ ```
69
+
70
+ ### `secmanifest fix`
71
+
72
+ Arregla paquetes con versiones inseguras automaticamente. Consulta el registry de npm para encontrar versiones seguras.
73
+
74
+ ```bash
75
+ secmanifest fix # Analiza y arregla todos los paquetes inseguros
76
+ secmanifest fix chalk lodash # Arregla paquetes especificos
77
+ secmanifest fix --dry-run # Muestra que haria sin ejecutar cambios
78
+ ```
79
+
80
+ #### Como funciona el auto-fix
81
+
82
+ 1. Detecta paquetes con `"latest"`, versiones deprecated o con vulnerabilidades criticas
83
+ 2. Consulta el registry de npm para encontrar la ultima version segura
84
+ 3. Desinstala la version insegura
85
+ 4. Instala la version segura con `^version`
86
+ 5. Si falla, restaura la version original automaticamente
87
+
88
+ ## Escaners de Seguridad
89
+
90
+ ### 1. Malware y Typosquatting (`malware.ts`)
91
+
92
+ Detecta paquetes maliciosos conocidos y suplantaciones de paquetes populares.
93
+
94
+ - Lista de paquetes comprometidos conocidos (event-stream, faker.js, colors.js, etc.)
95
+ - Deteccion de typosquatting con distancia de Levenshtein (ej: `exress` vs `express`)
96
+ - Analisis de paquetes con nombres sospechosamente similares a paquetes populares
97
+
98
+ ### 2. Backdoors en Manifiestos (`backdoors.ts`)
99
+
100
+ Analiza `package.json` en busca de ajustes peligrosos que atacantes pueden explotar.
101
+
102
+ - Scripts peligrosos: `preinstall`, `postinstall`, `install`, `prepare`
103
+ - Dependencias que apuntan a repositorios Git externos sin version fija
104
+ - Version ranges abiertos (`*`, `>=0.0.0`)
105
+ - Dependencias con `"latest"` (vector de ataque de cadena de suministro)
106
+ - Hooks de ciclo de vida complejos con multiples comandos encadenados
107
+
108
+ ### 3. Drift en Lockfile (`lockfile-drift.ts`)
109
+
110
+ Detecta paquetes instalados pero no declarados en `package.json`.
111
+
112
+ - Soporte para `pnpm-lock.yaml`, `bun.lock` y `yarn.lock`
113
+ - Detecta "paquetes fantasma" que pueden ser dependencias no intencionadas
114
+ - Identifica divergencias entre lo declarado y lo instalado
115
+
116
+ ### 4. Secrets y Credenciales (`secrets.ts`)
117
+
118
+ Escanea el codigo fuente y archivos de entorno en busca de secretos expuestos.
119
+
120
+ - AWS Access Keys y Secret Keys
121
+ - GitHub/GitLab tokens (PAT, Fine-grained)
122
+ - Slack tokens y webhooks
123
+ - Stripe API keys
124
+ - Google API keys
125
+ - Bearer tokens y JWTs
126
+ - Connection strings (MongoDB, MySQL, PostgreSQL, Redis)
127
+ - Archivos `.env` committeados
128
+ - Verificacion de `.gitignore`
129
+
130
+ ### 5. Licencias Restringidas (`licenses.ts`)
131
+
132
+ Detecta paquetes con licencias que pueden forzar divulgacion de codigo privado.
133
+
134
+ - AGPL-3.0: Requiere liberar codigo incluso en SaaS
135
+ - GPL-2.0/3.0: Copyleft fuerte que aplica a trabajos derivados
136
+ - SSPL: Requiere liberar todo el stack de servicios
137
+ - EUPL/OSL: Copyleft con implicaciones legales
138
+
139
+ ### 6. Metadata Sospechosa (`metadata.ts`)
140
+
141
+ Analiza metadatos de paquetes instalados en busca de anomalias.
142
+
143
+ - Paquete sin repositorio asociado
144
+ - Paquete sin licencia declarada
145
+ - Paquete con codigo nativo (gypfile)
146
+ - Scripts que acceden a red durante instalacion
147
+
148
+ ### 7. Codigo Ofuscado (`obfuscation.ts`)
149
+
150
+ Detecta patronies de ofuscacion comunes en malware.
151
+
152
+ - Ejecucion de codigo codificado en Base64
153
+ - `eval()` con concatenacion de strings
154
+ - `String.fromCharCode` y secuencias hex/unicode
155
+ - Compresion/descompresion en tiempo de ejecucion
156
+ - `child_process` para ejecucion de comandos del sistema
157
+
158
+ ### 8. Version Node.js EOL (`node-version.ts`)
159
+
160
+ Detecta si el proyecto requiere versiones de Node.js sin soporte.
161
+
162
+ - Versiones End-of-Life (0.10 - 19)
163
+ - Recomendacion de versiones soportadas
164
+
165
+ ### 9. Vulnerabilidades (Sonatype OSS Index) (`vulnerabilities.ts`)
166
+
167
+ Consulta la base de datos de Sonatype para vulnerabilidades conocidas.
168
+
169
+ - CVEs conocidas con severidad y CVSS score
170
+ - Rate limiting automatico con retry
171
+ - Soporte para batch de 128 paquetes por request
172
+
173
+ ### 10. Paquetes Desactualizados (`outdated.ts`)
174
+
175
+ Detecta paquetes con versiones nuevas disponibles.
176
+
177
+ - Paquetes con actualizaciones mayores (breaking changes)
178
+ - Paquetes con actualizaciones menores (patches)
179
+
180
+ ## Ejemplo de Salida
181
+
182
+ ```
183
+ ╔══════════════════════════════════════╗
184
+ ║ SECMANIFEST - Security Audit ║
185
+ ╚══════════════════════════════════════╝
186
+
187
+ Resumen del Proyecto
188
+ ─────────────────────────────────────
189
+ Proyecto: mi-app
190
+ Directorio: /home/user/mi-app
191
+ Gestor: pnpm v9.0.0
192
+ Paquetes: 45
193
+ Hallazgos: 3
194
+ Tiempo: 8.21s
195
+
196
+ Desglose por Severidad:
197
+ [!!] Alto: 1
198
+ [!] Medio: 1
199
+ * Bajo: 1
200
+
201
+ Score de Riesgo:
202
+ [██████████████████░░░░░░░░░░░░] 59/100
203
+
204
+ ℹ PROYECTO CON RIESGOS MODERADOS - Revisión recomendada
205
+
206
+ Hallazgos Detallados:
207
+
208
+ ┌──────────────┬──────────────┬──────────────────────────────────┬────────────┐
209
+ │ Severidad │ Categoria │ Titulo │ Paquete │
210
+ ├──────────────┼──────────────┼──────────────────────────────────┼────────────┤
211
+ │ [!!] high │ Backdoor │ Dependencia con "latest": axios │ axios │
212
+ │ [!] medium │ Backdoor │ Rango de version abierto: lodash │ lodash │
213
+ │ * low │ Malware │ Paquete sin repositorio: foo │ foo │
214
+ └──────────────┴──────────────┴──────────────────────────────────┴────────────┘
215
+ ```
216
+
217
+ ## Arquitectura
218
+
219
+ ```
220
+ secmanifest/
221
+ ├── src/
222
+ │ ├── cli.ts # Entry point - Commander setup
223
+ │ ├── commands/
224
+ │ │ ├── audit.ts # Comando principal de auditoria
225
+ │ │ └── fix.ts # Comando de auto-fix
226
+ │ ├── core/
227
+ │ │ ├── package-manager.ts # Deteccion de gestores de paquetes
228
+ │ │ ├── project-analyzer.ts # Analisis de package.json
229
+ │ │ ├── reporter.ts # Reporte en terminal con colores
230
+ │ │ └── fixer.ts # Logica de desinstalar/reinstalar
231
+ │ ├── scanners/
232
+ │ │ ├── vulnerabilities.ts # Sonatype OSS Index API
233
+ │ │ ├── malware.ts # Typosquatting + paquetes maliciosos
234
+ │ │ ├── backdoors.ts # Scripts peligrosos en package.json
235
+ │ │ ├── lockfile-drift.ts # Comparacion package.json vs lockfile
236
+ │ │ ├── secrets.ts # Credenciales expuestas
237
+ │ │ ├── licenses.ts # Licencias restrictivas
238
+ │ │ ├── metadata.ts # Metadatos sospechosos
239
+ │ │ ├── obfuscation.ts # Codigo ofuscado
240
+ │ │ ├── outdated.ts # Paquetes desactualizados
241
+ │ │ └── node-version.ts # Node.js EOL
242
+ │ └── utils/
243
+ │ ├── http.ts # Cliente HTTP con rate limiting
244
+ │ ├── registry.ts # Consulta npm registry
245
+ │ └── types.ts # Tipos compartidos
246
+ ├── package.json
247
+ ├── tsconfig.json
248
+ └── .gitignore
249
+ ```
250
+
251
+ ## Veto a npm
252
+
253
+ secmanifest tiene un **veto absoluto a npm** como gestor de paquetes. Esto se debe a sus historial de vulnerabilidades en la ejecucion de scripts de dependencias. La herramienta detecta automaticamente el gestor de paquetes y sigue este orden de prioridad:
254
+
255
+ 1. **pnpm** (prioritario)
256
+ 2. **bun** (alternativa segura)
257
+ 3. **yarn** (ultimo recurso)
258
+ 4. **npm** → Bloqueado
259
+
260
+ Si no se detecta ningun gestor seguro, la herramienta pregunta si desea continuar.
261
+
262
+ ## Como Ayudar a Mejorar el Proyecto
263
+
264
+ ### Funciones Pendientes
265
+
266
+ - [ ] Integracion con Socket.dev API para deteccion de supply chain attacks
267
+ - [ ] Analisis de dependencias transitivas (no solo directas)
268
+ - [ ] Deteccion de paquetes con binarios sospechosos
269
+ - [ ] Integracion con GitHub Actions para CI/CD
270
+ - [ ] Modo watch para auditoria continua
271
+ - [ ] Reporte en HTML exportable
272
+ - [ ] Integracion con Slack/Discord para notificaciones
273
+ - [ ] Cache local de resultados de Sonatype
274
+ - [ ] Soporte para monorepos (workspaces)
275
+ - [ ] Deteccion de dependencias duplicadas
276
+ - [ ] Analisis de bundle size para detectar paquetes sospechosamente grandes
277
+ - [ ] Verificacion de integridad con checksums
278
+
279
+ ### Contribuir
280
+
281
+ 1. Fork el repositorio
282
+ 2. Crea una branch para tu feature (`git checkout -b feature/nueva-funcion`)
283
+ 3. Haz commit de tus cambios (`git commit -m 'Add nueva funcion'`)
284
+ 4. Push a la branch (`git push origin feature/nueva-funcion`)
285
+ 5. Abre un Pull Request
286
+
287
+ ### Desarrollo
288
+
289
+ ```bash
290
+ # Instalar dependencias
291
+ bun install
292
+
293
+ # Ejecutar en desarrollo
294
+ bun run dev audit
295
+
296
+ # Verificar tipos
297
+ bun run typecheck
298
+
299
+ # Compilar binario
300
+ bun run build
301
+
302
+ # Registrar globalmente
303
+ bun link
304
+ ```
305
+
306
+ ## Licencia
307
+
308
+ MIT
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "secmanifest",
3
+ "version": "1.0.0",
4
+ "description": "Deep security auditing tool for JavaScript/TypeScript projects. Detects vulnerabilities, malware, backdoors, secrets, and compromised packages.",
5
+ "type": "module",
6
+ "main": "src/cli.ts",
7
+ "bin": {
8
+ "secmanifest": "./src/cli.ts"
9
+ },
10
+ "scripts": {
11
+ "dev": "bun run src/cli.ts",
12
+ "build": "bun build src/cli.ts --compile --outfile secmanifest",
13
+ "typecheck": "bunx tsc --noEmit"
14
+ },
15
+ "keywords": [
16
+ "security",
17
+ "audit",
18
+ "vulnerabilities",
19
+ "malware",
20
+ "supply-chain",
21
+ "npm",
22
+ "javascript",
23
+ "typescript",
24
+ "cli",
25
+ "scanner",
26
+ "backdoor",
27
+ "secrets"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "files": [
32
+ "src/**/*",
33
+ "README.md"
34
+ ],
35
+ "repository": {
36
+ "type": "git",
37
+ "url": ""
38
+ },
39
+ "dependencies": {
40
+ "commander": "^14.0.3",
41
+ "@clack/prompts": "^1.5.0",
42
+ "chalk": "^5.4.1",
43
+ "cli-table3": "^0.6.5"
44
+ },
45
+ "devDependencies": {
46
+ "@types/bun": "latest"
47
+ },
48
+ "peerDependencies": {
49
+ "typescript": "^5"
50
+ },
51
+ "engines": {
52
+ "node": ">=18"
53
+ }
54
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { initI18n, setLocale, t } from "./i18n/index.js";
5
+ import { runAudit } from "./commands/audit.js";
6
+ import { runFix } from "./commands/fix.js";
7
+ import { runWatch } from "./commands/watch.js";
8
+ import { saveConfig } from "./core/notify.js";
9
+ import { cacheClear } from "./utils/cache.js";
10
+
11
+ const program = new Command();
12
+
13
+ initI18n();
14
+
15
+ program
16
+ .name("secmanifest")
17
+ .description(t("cli.description"))
18
+ .version("1.0.0");
19
+
20
+ program
21
+ .command("audit")
22
+ .description("Deep security audit of the project")
23
+ .argument("[path]", "Directory to audit", ".")
24
+ .option("--json", "JSON output")
25
+ .option("--verbose", "Show detailed errors during scan")
26
+ .option("--quick", "Quick scan (no external APIs)")
27
+ .option("--auto-fix", "Auto-fix insecure packages")
28
+ .option("--html [path]", "Generate exportable HTML report")
29
+ .option("--notify", "Send notifications to Slack/Discord")
30
+ .option("--lang <locale>", "Language (en/es)", "en")
31
+ .option("--skip-malware", "Skip malware/typosquatting scan")
32
+ .option("--skip-secrets", "Skip secrets/credentials scan")
33
+ .option("--skip-licenses", "Skip license scan")
34
+ .option("--skip-outdated", "Skip outdated packages scan")
35
+ .option("--skip-metadata", "Skip metadata scan")
36
+ .option("--skip-obfuscation", "Skip obfuscation scan")
37
+ .option("--skip-node-version", "Skip Node.js EOL check")
38
+ .option("--skip-socket", "Skip Socket.dev scan")
39
+ .option("--skip-transitive", "Skip transitive dependencies scan")
40
+ .option("--skip-binaries", "Skip suspicious binaries scan")
41
+ .option("--skip-duplicates", "Skip duplicate dependencies scan")
42
+ .option("--skip-bundle-size", "Skip bundle size analysis")
43
+ .option("--skip-integrity", "Skip integrity check")
44
+ .action(async (path, options) => {
45
+ setLocale(options.lang);
46
+ try {
47
+ await runAudit(path, options);
48
+ } catch (error) {
49
+ console.error(
50
+ `${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
51
+ );
52
+ process.exit(1);
53
+ }
54
+ });
55
+
56
+ program
57
+ .command("check")
58
+ .description("Quick security scan (no external APIs)")
59
+ .argument("[path]", "Directory to audit", ".")
60
+ .option("--json", "JSON output")
61
+ .option("--verbose", "Show detailed errors")
62
+ .option("--lang <locale>", "Language (en/es)", "en")
63
+ .action(async (path, options) => {
64
+ setLocale(options.lang);
65
+ try {
66
+ await runAudit(path, { ...options, quick: true });
67
+ } catch (error) {
68
+ console.error(
69
+ `${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
70
+ );
71
+ process.exit(1);
72
+ }
73
+ });
74
+
75
+ program
76
+ .command("fix")
77
+ .description("Fix packages with insecure versions (latest, deprecated)")
78
+ .argument("[packages...]", "Packages to fix (if omitted, analyzes all)")
79
+ .option("--dry-run", "Show what would be done without executing")
80
+ .option("--lang <locale>", "Language (en/es)", "en")
81
+ .action(async (packages, options) => {
82
+ setLocale(options.lang);
83
+ try {
84
+ await runFix(packages, options);
85
+ } catch (error) {
86
+ console.error(
87
+ `${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
88
+ );
89
+ process.exit(1);
90
+ }
91
+ });
92
+
93
+ program
94
+ .command("watch")
95
+ .description("Continuous security audit every N seconds")
96
+ .argument("[path]", "Directory to audit", ".")
97
+ .option("-i, --interval <seconds>", "Interval in seconds", "300")
98
+ .option("--quick", "Quick scan")
99
+ .option("--lang <locale>", "Language (en/es)", "en")
100
+ .action(async (path, options) => {
101
+ setLocale(options.lang);
102
+ try {
103
+ await runWatch(path, {
104
+ interval: parseInt(options.interval, 10),
105
+ quick: options.quick,
106
+ });
107
+ } catch (error) {
108
+ console.error(
109
+ `${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
110
+ );
111
+ process.exit(1);
112
+ }
113
+ });
114
+
115
+ program
116
+ .command("config")
117
+ .description("Configure secmanifest")
118
+ .option("--slack-webhook <url>", "Configure Slack webhook")
119
+ .option("--discord-webhook <url>", "Configure Discord webhook")
120
+ .option("--clear-cache", "Clear results cache")
121
+ .option("--lang <locale>", "Language (en/es)", "en")
122
+ .action(async (options) => {
123
+ setLocale(options.lang);
124
+ if (options.slackWebhook || options.discordWebhook) {
125
+ const config: Record<string, string> = {};
126
+ if (options.slackWebhook) config.slackWebhook = options.slackWebhook;
127
+ if (options.discordWebhook) config.discordWebhook = options.discordWebhook;
128
+ await saveConfig(config);
129
+ console.log(t("config.saved"));
130
+ }
131
+
132
+ if (options.clearCache) {
133
+ await cacheClear();
134
+ console.log(t("config.cache_cleared"));
135
+ }
136
+ });
137
+
138
+ program.parse();