Esta mañana eran 0. Tras la tabla curada (228) y este paso, 936. Ninguna receta se
re-hasheó: verificado en 30 de las 708 tocadas, 30 hashes idénticos, 0 cambiados.
DE DÓNDE SALE EL DATO, Y POR QUÉ NO ES ADIVINAR. `scripts/licencias-detectar.sh` consulta
la API /repos/{o}/{r}/license de GitHub para las 673 recetas cuya fuente vive allí. Eso
devuelve el resultado de DETECTAR el fichero LICENSE que el repo tiene de verdad
(licensee), no una etiqueta escrita a mano en una web: es la misma evidencia que veríamos
abriendo el tarball, obtenida sin bajar 673 tarballs por un enlace de 8 Mbps. 610 con SPDX
definido; las 63 que GitHub marca NOASSERTION/other se DESCARTAN — un «no sé» de la fuente
se propaga como hueco, no se redondea a una licencia plausible.
Las familias no-GitHub van curadas por la URL DE FUENTE, que es la evidencia que el nombre
no da. Y ahí cometí el error simétrico al que este mismo fichero advertía: había puesto
`knighttime` entre las «herramientas Go» POR SU NOMBRE, y su tarball sale de
download.kde.org — es un Framework de KDE, LGPL. Descartar por nombre falla igual que
aceptar por nombre. Corregido en la cabecera.
LAS DOS IMPRECISIONES, contables con `licencias.sh --revisar` en vez de escondidas:
1. SPDX OBSOLETOS Y AMBIGUOS (71 recetas). GitHub devuelve `GPL-3.0`, `LGPL-2.1`,
`AGPL-3.0`… identificadores que SPDX declaró obsoletos PRECISAMENTE porque no
distinguen `-only` de `-or-later`, y esa diferencia decide con qué se puede combinar el
paquete. NO se normalizan a ciegas: mapear GPL-3.0 → GPL-3.0-or-later sería inventar el
dato que falta. Quedan marcadas para resolver mirando el fuente.
2. LICENCIAS DOBLES COLAPSADAS. La API devuelve UNA sola licencia y muchos proyectos Rust
son «MIT OR Apache-2.0» (p.ej. `fd` quedó como Apache-2.0). No es falso —cumplir una de
las opciones concedidas basta— pero es incompleto. Lo resuelve el cierre estructural:
leer el campo `license` del Cargo.toml en la fase de fetch.
Y un fallo que habría escrito basura en silencio: `licencias-detectadas.tsv` tiene TRES
columnas (añade el owner/repo consultado, para poder auditar) y el sembrador leía dos, así
que la licencia se habría llevado pegado el slug — `license = "MIT<TAB>owner/repo"`, sin
que nada lo validara. Arreglado antes de sembrar.
Quedan 205 sin licencia y 71 por desambiguar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
51 lines
2.7 KiB
TOML
51 lines
2.7 KiB
TOML
# Importada de nixpkgs por `hammer import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
|
|
# - el build usa el lab de hammer (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
|
|
# compiler/link/phases y adaptá hasta que compile.
|
|
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
|
|
name = "naabu"
|
|
version = "2.6.1"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
repo = "https://github.com/projectdiscovery/naabu"
|
|
commit = "5a0ca8bde91b5bb16213e9e8b5c6871eac954bd8"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# DINÁMICO A PROPÓSITO (no es deuda: es la única opción correcta). Auditado 2026-07-17.
|
|
#
|
|
# naabu depende (vía github.com/Mzack9999/gopacket) de github.com/ebitengine/purego, una FFI
|
|
# SIN cgo que hace `dlopen("libpcap.so.1")` EN RUNTIME. Dos consecuencias encadenadas:
|
|
#
|
|
# 1. `link = "static"` es INALCANZABLE: un binario estático no puede dlopen(). Declararlo
|
|
# static no lo vuelve estático — sólo silencia el escaneo SYN (su feature principal) en
|
|
# runtime. Preferimos la verdad declarada al veredicto cómodo.
|
|
#
|
|
# 2. El NEEDED se ve ANÓMALO (libc.so.6 / libpthread.so.0 / libdl.so.2 = nombres GLIBC en una
|
|
# distro musl) pero NO hay glibc de por medio. La inversión es contraintuitiva: es
|
|
# CGO_ENABLED=0 el que los CAUSA. purego/internal/fakecgo/zsymbols_linux.go está guardado
|
|
# con `//go:build !cgo` y hardcodea los sonames:
|
|
# //go:cgo_import_dynamic purego_malloc malloc "libc.so.6"
|
|
# //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
|
|
# //go:cgo_import_dynamic purego_dlopen dlopen "libdl.so.2"
|
|
# El linker interno de Go honra esos pragmas ⇒ emite el binario dinámico con esos DT_NEEDED
|
|
# literales. El INTERP sí es musl (/lib/ld-musl-x86_64.so.1): se construyó en el sandbox.
|
|
# En runtime musl los absorbe: su ldso (dynlink.c, "reserved names") bloquea recargar la
|
|
# implementación de libc y resuelve los tres a SÍ MISMO. Verificado en el rootfs Alpine,
|
|
# que no tiene ningún libc.so.6:
|
|
# libdl.so.2 => /lib/ld-musl-x86_64.so.1
|
|
# libc.so.6 => /lib/ld-musl-x86_64.so.1
|
|
# ⇒ son strings vestigiales, no una dependencia glibc real. El binario corre en musl puro.
|
|
#
|
|
# `cgo = true` NO es el arreglo: excluiría los pragmas (files !cgo), pero el lab lo liga con
|
|
# `-extldflags=-static` ⇒ vuelve al problema (1), estático sin dlopen.
|
|
link = "dynamic"
|
|
flags = ["./cmd/naabu"] # varios mains en el repo; fijo el CLI real
|
|
|
|
# buildInputs de nix: go, libpcap. libpcap NO va en deps: no se linkea, se dlopenea en runtime
|
|
# (ver arriba) y no hay receta libpcap en el corpus todavía. El escaneo SYN queda inerte hasta
|
|
# que exista; el escaneo connect (`-s c`, Go puro) funciona sin ella.
|
|
[deps]
|
|
build = ["go"]
|