npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

anci-oiv-resolver

v0.5.2

Published

Canonical Chilean OIV registry name → domain resolver. Eliminates false-positive OSINT findings under Ley 21.663 (Marco Nacional de Ciberseguridad).

Downloads

768

Readme

anci-oiv-resolver

Resolver canónico de nombres del registro chileno de Operadores de Importancia Vital (OIV) a sus dominios reales. Elimina los falsos positivos sistemáticos en investigación pasiva OSINT contra las 915 organizaciones reconocidas bajo la Ley 21.663 (Marco Nacional de Ciberseguridad).

License: Apache 2.0 npm Coverage Gap Domain Coverage DNS Verified Sectors Closed Node CFP

English README

¿Qué son los OIVs y por qué importa?

Los Operadores de Importancia Vital (OIVs) son organizaciones reconocidas formalmente por el Estado de Chile como críticas para la seguridad nacional. La Ley 21.663 (Marco Nacional de Ciberseguridad · 2024) designa 915 organizaciones bajo esta categoría, incluyendo:

| Sector | Ejemplos representativos | |--------|--------------------------| | Banca/Finanzas | BCI · BancoEstado · Santander · Banco de Chile · Bolsa de Comercio | | Salud pública | FONASA · Hospitales regionales · MINSAL | | Salud privada | Clínica Las Condes · Hospital Alemán · Clínica Indisa | | Energía | Enel · ENAP · Colbún · AES Andes · CGE | | Telecomunicaciones | ENTEL · Movistar · VTR · WOM · GTD | | Agua | Aguas Andinas · ESSBIO · ESSAL · Aguas del Altiplano | | Transporte | Metro · LATAM · EFE · concesionarias de autopistas | | Combustibles | COPEC · Shell · Gas Natural · Sonacol | | Gobierno | SII · ANCI · ONEMI · CMF · Registro Civil | | Infraestructura digital | Sonda · Microsystem · IT vendors críticos |

La Agencia Nacional de Ciberseguridad (ANCI) supervisa estas organizaciones bajo la nueva ley, estableciendo obligaciones de:

  • Gestión de riesgo cibernético
  • Notificación de incidentes en plazos definidos
  • Auditorías de seguridad periódicas
  • Planes de continuidad operacional

¿Para quién es este resolver?

Esta librería es útil para:

  • Investigadores de ciberseguridad que necesitan resolver dominios canónicos de OIVs antes de hacer research pasivo OSINT (caso de uso primario)
  • Consultores de cumplimiento normativo que asesoran OIVs en obligaciones bajo Ley 21.663
  • Periodistas tecnológicos que verifican identidades organizacionales en investigaciones sobre ciberseguridad o infraestructura crítica
  • Académicos que estudian la brecha de exposición cibernética en infraestructura crítica chilena
  • Equipos de respuesta a incidentes que correlacionan dominios con OIVs durante un incidente activo
  • Reguladores y policy makers que auditan la cobertura efectiva del marco normativo

Si trabajas en alguna de estas áreas y has tenido que resolver "razón social ANCI → dominio real" manualmente, este tool lo automatiza para las 915 OIVs (100% del universo) con verificación DNS honesta.

¿Por qué construimos esto?

Durante la investigación de la brecha de divulgación responsable en Chile (el "Coverage Gap" · ver paper companion), encontramos que las herramientas automáticas que infieren dominios desde razones sociales fallan sistemáticamente. El universo de OIVs registrados se distribuye así:

915 OIVs registrados ANCI (Ley 21.663)
    │
    └── 915 catalogados — este tool (100% universo)
        ├── 10 sectores cerrados 100%
        │   └── banca · telecomunicaciones · transporte · agua · empresas_estado
        │       combustibles · salud · administración_estado · energía_eléctrica
        │       infraestructura_digital
        ├── ~80% con dominios DNS verificados (A record confirmado)
        └── ~20% con estado honesto documentado
            └── NXDOMAIN · email-only · individual contractor · sin web pública

Esos errores de inferencia contaminan datasets de research académico, llenan inboxes de vendors equivocados con reportes falsos, y minan la credibilidad de cualquier investigación seria sobre infraestructura crítica chilena.

anci-oiv-resolver provee un mapping verificado RUT → dominio canónico, eliminando esos falsos positivos sistemáticos.

El problema

De los 915 Operadores de Importancia Vital (OIVs) registrados formalmente bajo la Ley 21.663 (Marco Nacional de Ciberseguridad), una fracción mínima cuenta con canal verificable de contacto para recibir un reporte de divulgación responsable. La cobertura efectiva de attack surface público es limitada, y pocas organizaciones cumplen las condiciones mínimas para iniciar un proceso de disclosure coordinado conforme a los principios de ISO/IEC 29147.

Esta es la primera capa estructural del Coverage Gap chileno.

La segunda capa es más sutil pero igualmente sistemática: las herramientas de research pasivo que infieren "razón social → dominio" mediante heurísticas ingenuas generan falsos positivos masivos:

| OIV (razón social ANCI) | Inferencia ingenua | Dominio real | |---|---|---| | BANCO DE CRÉDITO E INVERSIONES | bancodecrditoeinversiones.cl ❌ | bci.cl ✓ | | BANCO DEL ESTADO DE CHILE | bancodelestadodechile.cl ❌ | bancoestado.cl ✓ | | BANCO BICE | bancobice.cl ❌ | bice.cl ✓ | | TELEFÓNICA CHILE S.A. | telefonicachile.cl ❌ | movistar.cl ✓ | | EMPRESA NACIONAL DE TELECOMUNICACIONES | empresanacionaldetelecomunicaciones.cl ❌ | entel.cl ✓ |

Sin un resolver canónico, cualquier herramienta que escanee OIVs chilenos genera findings sobre dominios que no existen, contaminando reportes a vendors, perdiendo credibilidad de research, y polucionando datasets académicos.

La solución

anci-oiv-resolver provee un mapping RUT → dominio canónico validado vía DNS, cubriendo las 915 OIVs (100%) del universo oficial:

| Sector | Total | Layer-1 Verificado (v0.5.1) | Estado | |--------|-------|-----------|--------| | banca_finanzas | 34/34 | 34/34 (100%) | 100% cerrado ⭐ | | telecomunicaciones | 29/29 | 24/29 (82.8%) | 100% cerrado ⭐ | | transporte | 25/25 | 22/25 (88.0%) | 100% cerrado ⭐ | | agua | 25/25 | 12/25 (48.0%) | 100% cerrado ⭐ | | empresas_estado | 20/20 | 18/20 (90.0%) | 100% cerrado ⭐ | | combustibles | 25/25 | 18/25 (72.0%) | 100% cerrado ⭐ | | salud | 123/123 | 94/123 (76.4%) | 100% cerrado ⭐ | | administracion_estado | 146/146 | 122/146 (83.6%) | 100% cerrado ⭐ | | energia_electrica | 147/147 | 71/147 (48.3%) | 100% cerrado ⭐ | | infraestructura_digital | 413/413 | 409/413 (99.0%) | 100% cerrado ⭐ v0.4.0 | | TOTAL | 987 entries · 915 OIV universe | 824/987 (83.5%) | 100% universo |

Conteo Layer-1 cuenta dominios con A-record (live) más mail-only-MX (mail_only) como Layer-1 válido. Ver sección "Semántica de verificación".

83.5% Layer-1 verificados (A record o MX-only) · 16.5% documentados honestamente: NXDOMAIN · sin registros · contratistas individuales sin web. Sin sobreclaim de coverage técnico cuando no existe.

Con fallback heurístico mejorado (normalización de acentos + strip de sufijos legales + brand-override map) cuando el RUT no está en la tabla, y resolver multi-cadena (OS → Cloudflare → Google → Quad9) en v0.5.1 para reproducibilidad en endpoints con DNS endurecido.

915 OIVs catalogados · 100% universo ANCI · 83.5% Layer-1 verificados · 10/10 sectores cerrados · OSINT pasivo · cero escaneo activo · v0.5.1

Semántica de verificación (v0.5.1)

A partir de v0.5.1 cada entrada del catálogo y cada llamada a verifyDomain() reporta un status distinguido. La distinción es necesaria porque, en endpoints con DNS endurecido (DoH, NextDNS, filtros corporativos), el resolver del SO confunde NXDOMAIN con ESERVFAIL y produce falsos negativos para dominios perfectamente vivos.

| Status | Significado | Contado como Layer-1 verificado | |---|---|---| | live | Al menos un registro A o AAAA | ✓ Sí | | mail_only | Sin A/AAAA pero con MX (dominio registrado · mail-only) | ✓ Sí | | registered_no_a | ENODATA en resolvers públicos (registrado · sin A ni MX) | ✗ No | | nxdomain | ENOTFOUND en resolvers públicos (dominio no existe) | ✗ No | | serverr | Todos los resolvers respondieron ESERVFAIL (indeterminable) | ✗ No | | timeout | Todos los resolvers en la cadena timed out | ✗ No | | unknown | Cadena agotada sin código canónico | ✗ No |

verifyDomain() intenta primero el resolver del SO (rápido) · si falla con cualquier código distinto de ENOTFOUND autoritativo, cae a través de 1.1.1.1 → 8.8.8.8 → 9.9.9.9. Cada resultado incluye un campo via indicando qué resolver lo produjo, lo que permite a revisores independientes reproducir el hallazgo con la misma cadena de resolvers.

Instalación rápida

npm install anci-oiv-resolver

Uso

import { resolveOIVDomain } from 'anci-oiv-resolver';

// Lookup por tabla — alta confianza
const bci = await resolveOIVDomain('97006000-6', 'BANCO DE CRÉDITO E INVERSIONES');
// → { domain: 'bci.cl', source: 'known-domains', confidence: 1.0, verified: null }

// Con verificación DNS
const transbank = await resolveOIVDomain('96689310-9', 'TRANSBANK S.A.', { verify: true });
// → { domain: 'transbank.cl', source: 'known-domains', verified: true, mxRecords: ['10 mx.transbank.cl'] }

// Fallback heurístico para RUTs sin tabla
const unknown = await resolveOIVDomain('99000000-1', 'DISTRIBUIDORA GAS NORTE S.A.');
// → { domain: 'distribuidoragasnorte.cl', source: 'heuristic', confidence: 0.45, verified: null }

Resolución masiva (batch)

import { resolveBatch } from 'anci-oiv-resolver';

const oivs = [
  { rut: '97006000-6', razonSocial: 'BANCO DE CRÉDITO E INVERSIONES' },
  { rut: '97030000-7', razonSocial: 'BANCO DEL ESTADO DE CHILE' },
  { rut: '62000560-6', razonSocial: 'AGENCIA NACIONAL DE CIBERSEGURIDAD' },
];

const resolved = await resolveBatch(oivs, { verify: true });

Estadísticas de cobertura

import { getCoverageStats } from 'anci-oiv-resolver';

const stats = getCoverageStats();
// → { total: 995, bySector: { infraestructura_digital: { count: 416, dnsVerified: 410 }, banca_finanzas: { count: 34 }, salud: { count: 111 }, administracion_estado: { count: 155 }, energia_electrica: { count: 150 }, ... }, dnsVerified: 793, dnsUnverified: 202 }

CLI demo

# Lookup individual
npx tsx examples/cli-demo.ts 97006000-6

# Con verificación DNS
npx tsx examples/cli-demo.ts 96689310-9 "TRANSBANK S.A." --verify

# Estadísticas de cobertura
npx tsx examples/cli-demo.ts --stats

API completa

resolveOIVDomain(rut, razonSocial, options?)

Función principal de resolución.

| Parámetro | Tipo | Descripción | |-----------|------|-------------| | rut | string | RUT chileno — acepta "97006000-6", "97.006.000-6", "97006000-k" | | razonSocial | string | Nombre del registro ANCI — usado para fallback heurístico | | options.verify | boolean | Si true, ejecuta DNS A/MX lookup (agrega 50–300ms) |

Retorna: Promise<OIVDomainResolution>

interface OIVDomainResolution {
  domain: string;           // ej: "bci.cl"
  source: 'known-domains' | 'heuristic';
  rut: string;              // RUT normalizado
  razonSocial: string;
  sector: OIVSector;
  confidence: number;       // 0–1 (1.0 = tabla+verificado, 0.45 = heurístico)
  verified: boolean | null; // null si verify no fue solicitado
  mxRecords: string[] | null;
}

Primitivas de bajo nivel

resolveBytable(rut) / heuristicInfer(razonSocial) / verifyDomain(domain) / batchVerify(domains)

Exportadas para uso avanzado. Ver docs/ARCHITECTURE.md.

El Coverage Gap

915 OIVs registrados. Una fracción cuenta con contactos de disclosure documentados o attack surface públicamente mapeado.

Este es el Coverage Gap: la infraestructura crítica chilena opera en gran medida invisible para la comunidad de investigación de seguridad, no porque sea segura, sino porque la capa básica de reconocimiento (mapeo de dominios) nunca ha sido sistematizada.

Esta librería es el primer paso para cerrar esa brecha, sector a sector.

Ver docs/METHODOLOGY.md para metodología completa y lineamientos de uso responsable.

Contexto legal y ético

Este resolver opera bajo el marco de investigación pasiva OSINT, alineado con:

  • Ley 21.663 (Marco Nacional de Ciberseguridad de Chile) — designación oficial de OIVs vía ANCI
  • Ley 21.459 (Delitos Informáticos) — protección de research de buena fe que no involucra acceso no autorizado
  • ISO/IEC 29147:2018 — divulgación coordinada de vulnerabilidades
  • DOJ Good Faith Security Research Framework (2017) — research no malicioso

Esta herramienta no realiza ningún acceso no autorizado a sistemas. Solo consulta DNS público (registros A, AAAA, MX) y mantiene una tabla de mapping verificada manualmente desde fuentes públicas (registro ANCI, NIC Chile, DNS público).

Investigación companion

Este tool acompaña al working paper:

"Coverage Gap in Chilean Critical Infrastructure Cybersecurity: An Automated OSINT Assessment" (Mellafe, 2026) Zenodo DOI: pendiente publicación W2 jun 2026 arXiv: cs.CR pendiente W4 jun 2026

Ver dmzs.dev/research para el research home y publicaciones relacionadas.

Citación académica

Si usas esta herramienta en investigación, por favor cita:

@misc{mellafe2026anci,
  author       = {Mellafe Zuvic, David},
  title        = {anci-oiv-resolver: Canonical Chilean OIV Domain Resolver},
  year         = {2026},
  publisher    = {GitHub},
  version      = {v0.1.0},
  howpublished = {\url{https://github.com/raceksd-source/anci-oiv-resolver}},
  note         = {Companion paper: "Coverage Gap in Chilean Critical Infrastructure Cybersecurity" (Zenodo DOI pending)}
}

Contribuir

Issues y PRs bienvenidos. Especialmente necesarios:

  • Entradas de dominios adicionales — verificar con dig +short A <dominio> antes del PR
  • Sectores subrepresentados: agua, transporte, combustibles, salud regional, gobierno municipal
  • Bug fixes en heurística — especialmente nombres con acentos o sufijos legales no estándar
  • i18n — traducción de stopword lists al inglés para soporte no-español

Lee CONTRIBUTING.md para guidelines completos.

Roadmap público

  • v0.2.0 — PUBLICADO — 367 entradas · 6 sectores cerrados al 100% · 40.4% cobertura universo
  • v0.3.0 — PUBLICADO — 644 entradas · 9 sectores cerrados al 100% · 70.8% cobertura universo
  • v0.4.0 — PUBLICADO — 915 OIVs catalogados · 100% universo ANCI · 10/10 sectores cerrados · ~80% DNS-verificados ⭐
  • Q3 2026 — v0.5.0 · CLI binary (npx anci-oiv-resolver --rut X) · reverse lookup · Zenodo DOI
  • Q3 2026 — LASCON 2026 Austin TX (CFP en evaluación)
  • Q4 2026 — Annual Report "State of OIV Cybersecurity Chile 2026"

Autor

David Mellafe Zuvic · Investigador Independiente de Ciberseguridad · La Serena, Chile [email protected] · dmzs.dev/research

Reconocimientos

Construido como parte de investigación en curso sobre la exposición de ciberseguridad de los OIVs chilenos bajo el marco de la Ley 21.663. Todos los datos se derivan de fuentes públicas (registro ANCI, NIC Chile, DNS público).

Licencia

Apache 2.0 — ver LICENSE.