diff --git a/recipes/naabu.toml b/recipes/naabu.toml index 1d664022..732d82bd 100644 --- a/recipes/naabu.toml +++ b/recipes/naabu.toml @@ -12,9 +12,38 @@ commit = "5a0ca8bde91b5bb16213e9e8b5c6871eac954bd8" [build] compiler = "zig-cc" target = "x86_64-linux-musl" -link = "static" +# 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 (no usados con CGO off): go, libpcap +# 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"]