La investigación de 2025 confirmó que los LLM alucinan nombres de paquetes en aproximadamente el 19,7% de las sugerencias de codificación, y los atacantes registraron paquetes maliciosos que coincidían con las alucinaciones más frecuentes. Una puesta en marcha de producción se vio comprometida en enero de 2026 cuando un desarrollador ejecutó npm install en un paquete sugerido por Claude que no existía hasta que un atacante lo registró semanas antes. Este tutorial crea un paso de verificación que se ejecuta antes de cualquier instalación sugerida por LLM.
Requisitos previos
- Nodo.js 20+
- Una clave API de Scavio (250 créditos gratis)
- Acceso a la CLI de npm
Guia paso a paso
Paso 1: Instalar el cliente Scavio
Agregue Scavio a su espacio de trabajo de herramientas.
npm install scavioPaso 2: Escribe la función de verificación
El verificador verifica tres señales: registro npm, Google SERP y discusión en Reddit.
import { Scavio } from 'scavio';
import { execSync } from 'child_process';
const scavio = new Scavio({ apiKey: process.env.SCAVIO_API_KEY });
export async function verifyPackage(name: string) {
const registryExists = await fetch(`https://registry.npmjs.org/${name}`).then(r => r.ok);
if (!registryExists) return { safe: false, reason: 'Does not exist on npm' };
const serp = await scavio.search({ query: `npm "${name}"` });
const hasDocs = serp.organic_results?.some((r: any) => r.link.includes('npmjs.com') || r.link.includes('github.com'));
const reddit = await scavio.search({ platform: 'reddit', query: name });
const mentions = reddit.organic_results?.length || 0;
return { safe: hasDocs && mentions > 0, hasDocs, mentions };
}Paso 3: Ajustar la instalación de npm
Bloquear instalaciones que no superen la verificación.
import { verifyPackage } from './verify';
const pkg = process.argv[2];
const result = await verifyPackage(pkg);
if (!result.safe) {
console.error(`BLOCKED: ${pkg} failed verification`, result);
process.exit(1);
}
execSync(`npm install ${pkg}`, { stdio: 'inherit' });Paso 4: Conéctelo a su flujo de trabajo LLM
Claude Code, Cursor o cualquier agente que sugiera instalaciones deben ejecutar la verificación antes de ejecutar.
// In your agent's pre-install hook:
const verified = await verifyPackage(suggestedPackage);
if (!verified.safe) throw new Error('Blocked hallucinated package');Paso 5: Prueba con una alucinación conocida
Pruebe con un nombre de paquete plausible pero falso para confirmar que el verificador lo detecte.
node install-safe.js ultra-fast-json-parser-pro-2026
# BLOCKED: failed verificationEjemplo en Python
import os, requests
from scavio import Scavio
scavio = Scavio(api_key=os.environ['SCAVIO_API_KEY'])
def verify_package(name):
if not requests.get(f'https://pypi.org/pypi/{name}/json').ok:
return {'safe': False, 'reason': 'Not on PyPI'}
serp = scavio.search(query=f'pypi "{name}"')
has_docs = any('pypi.org' in r['link'] or 'github.com' in r['link'] for r in serp['organic_results'])
reddit = scavio.search(platform='reddit', query=name)
return {'safe': has_docs and len(reddit['organic_results']) > 0}Ejemplo en JavaScript
import { Scavio } from 'scavio';
const scavio = new Scavio({ apiKey: process.env.SCAVIO_API_KEY });
export async function verifyPackage(name) {
const exists = await fetch(`https://registry.npmjs.org/${name}`).then(r => r.ok);
if (!exists) return { safe: false };
const serp = await scavio.search({ query: `npm "${name}"` });
return { safe: serp.organic_results?.length > 0 };
}Salida esperada
Hallucinated names are blocked before install. Real packages pass verification in under 2 seconds (npm lookup + 2 Scavio calls at ~60 credits total).