Files
fn_registry/functions/cybersecurity/extract_iocs.md
T
egutierrez b04bb846c7 feat(go): html_to_markdown + extract_iocs
functions/core/html_to_markdown: convierte HTML a Markdown limpio (golang-only
sin dependencias externas). util como prep para LLMs y para indexar contenido
web.

functions/cybersecurity/extract_iocs + types/cybersecurity/ioc: extrae
indicators of compromise (IPs, domains, URLs, hashes, emails, CVEs,
crypto wallets) de texto libre. Devuelve []IOC tipado.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 11:51:51 +02:00

3.8 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
extract_iocs function go cybersecurity 1.0.0 pure func ExtractIocs(text string, types []string) []IoC Port a Go de extract_iocs_py_cybersecurity. Extrae todos los IoCs (email, ip_address, domain, file_hash, crypto_wallet, cve_id, mac_address, phone_number) de un texto usando regex puro. Si types es nil corre todos los extractores; si tiene valores filtra solo esos tipos. Deduplica por (Type, Value) y elimina spans contenidos (ej. dominio dentro de un email). Retorna slice ordenada por offset.
ioc
cybersecurity
regex
threat-intel
email
ip
domain
hash
wallet
cve
mac
phone
ioc_go_cybersecurity
false
net
regexp
sort
name desc
text Texto plano o markdown del que extraer IoCs. Puede contener cualquier contenido — se aplican todos los extractores sobre el texto completo.
name desc
types Slice de tipos a extraer. Valores validos: email, ip_address, domain, file_hash, crypto_wallet, cve_id, mac_address, phone_number. Si es nil, se corren todos los extractores. Tipos desconocidos se ignoran silenciosamente.
Slice de IoC ordenada por offset Start ascendente. Cada IoC tiene Type, Value, Start (byte offset inicio), End (byte offset fin) y opcionalmente Extra (algorithm para file_hash, asset para crypto_wallet). Sin duplicados: mismo (Type, Value) aparece una sola vez, y spans completamente contenidos dentro de otro span se descartan. true
texto sin IoCs retorna slice vacia
un IoC de cada tipo detectado
filtro por types=[email] retorna solo emails
dedup mismo email aparece dos veces solo una entrada
IPv4 valida detectada
numero con octeto 999 no es IPv4
numero con octeto 256 no es IPv4
hash MD5 exactamente 32 hex chars detectado
hash SHA1 exactamente 40 hex chars detectado
hash SHA256 exactamente 64 hex chars detectado
hash SHA512 exactamente 128 hex chars detectado
longitud intermedia 60 hex chars ignorada
dominio contenido en email span se descarta
tipos desconocidos se ignoran sin error
CVE-2014-0160 extraido
multiples CVEs en mismo texto
MAC con dos puntos extraida
separadores mezclados rechazados
E.164 con prefijo pais extraido
formato ES 9 digitos extraido
offsets Start/End cubren el valor exacto en el texto
pipeline completo detecta email ip cve mac wallet
functions/cybersecurity/extract_iocs_test.go functions/cybersecurity/extract_iocs.go

Ejemplo

iocs := ExtractIocs("Contact alice@example.com, vuln CVE-2023-1234, ip 192.0.2.5", nil)
// iocs[0] = IoC{Type:"email", Value:"alice@example.com", Start:8, End:25}
// iocs[1] = IoC{Type:"ip_address", Value:"192.0.2.5", ...}
// iocs[2] = IoC{Type:"cve_id", Value:"CVE-2023-1234", ...}

// Solo emails:
emails := ExtractIocs(text, []string{"email"})

// Campo extra para hashes:
// ioc.Extra["algorithm"] == "sha256"

// Campo extra para wallets:
// ioc.Extra["asset"] == "btc" | "eth"

Notas

Port directo de extract_iocs_py_cybersecurity. La validacion de IPv4/IPv6 usa net.ParseIP de stdlib, equivalente al modulo ipaddress de Python. Los regex son equivalentes a los Python — Go usa RE2 (sin lookbehind de longitud variable) por lo que los patrones de contexto se implementan con grupos capturadores y ajuste de offsets al grupo 1.

La deduplicacion opera en dos niveles:

  1. (Type, Value) — el mismo valor del mismo tipo solo aparece una vez (primer match gana).
  2. Contencion de spans — si el span de un IoC queda completamente dentro del span de otro ya aceptado, se descarta (ej. "example.com" dentro de "alice@example.com").