Commit Graph
2 Commits
Author SHA1 Message Date
sergioandClaude Opus 4.8 372baed4f6 static-audit: el '28 mienten' estaba INFLADO por mi propio bug (ls|head -1)
El audit tomaba 'ls -d store/*-<n> | head -1' = orden ALFABÉTICO POR HASH, no el
artefacto vigente. El store guarda TODOS los sellados de una receta (expat tenía
5, de junio a hoy), así que auditaba uno de hace tres semanas. Mismo bug de
clase que comparar libpng.a con libpng16.a por find|head -1.

Con 'ls -dt' (más reciente): 28 → 11. Tres de las supuestas mentirosas
(cargo-audit, git-absorb, yazi) nunca lo fueron: su artefacto reciente ya era
estático y el audit leía el viejo.

Lo que NO cambia: el hallazgo central es real y verificado a mano. libtool
ignora el -static del lab, el curl sellado NO arrancaba en el host, y de las 14
que arreglé cada una se verificó contra sus artefactos previos (expat: los 4
viejos con NEEDED=1, el nuevo con 0). Estaban rotas de verdad.

HONESTIDAD escrita en el script: 'más reciente' ≠ 'vigente'. Lo vigente sería el
artefacto cuyo hash corresponde a la receta de HOY, y hammer no lo expone sin
construir (no hay hammer hash / dry-run). Por eso el audit va DESPUÉS del
rebuild, nunca antes.

Quedan 11: file, helix, libcap, libgcrypt, pcre2, pkgconf, samurai, tuc,
util-linux, xz + naabu (nuevo: Go con libc.so.6 de GLIBC, otro caso).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 05:01:40 -04:00
sergioandClaude Opus 4.8 c707c1e13f static-audit: link="static" era mentira en 28 recetas selladas (libtool lo ignora)
Destapado migrando procps-ng. libtool lee el -static del lab como "preferí mis
.a", NO como flag al linker: el binario sale dinámico y la receta jura que es
estático. Con gcc pasaba igual — no es regresión de zig, es un agujero que
nadie había medido.

Tres consecuencias medidas, no teóricas:

1. NO CORREN. El curl sellado en el host: "Error relocating /lib/libz.so.1:
   __snprintf_chk: symbol not found". Su NEEDED libc.so es el soname de la musl
   de zig; en el host /lib/libc.so son 255B de linker script. El artefacto sólo
   funciona dentro del sandbox.
2. ARRASTRAN GCC. helix, yazi, git-absorb, cargo-audit y tuc traen libgcc_s.so.1
   de Alpine DENTRO del binario. Deuda de matar-gcc que ningún compiler="gcc"
   declara: invisible para el frente entero hasta ahora.
3. Un NEEDED es una entrada no declarada — lo que harkaq mide en build, pero en
   RUNTIME. Rompe el cono de affected.py (SDD 17 §4): un CVE en zlib no
   alcanzaría a un curl que se declara estático.

Script, no gate duro: fallar hoy rompe 28 selladas de golpe, varias del sistema
base (curl, util-linux, sudo). Primero se arreglan con evidencia, después se
cierra la puerta. Exit 1 mientras haya mentirosos ⇒ sirve de gate en CI cuando
la lista llegue a cero.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 00:12:59 -04:00