From 44b6032522903dbf8e99a5856f62253f5d2b8de5 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 6 Sep 2026 23:00:59 +0000 Subject: [PATCH] =?UTF-8?q?vigia-sonames:=20dos=20falsos=20positivos=20men?= =?UTF-8?q?os=20=E2=80=94=20los=20cinco=20perfiles=20en=20CERO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NO hacía falta una receta de perl. `libperl.so` está en el artefacto, son 9,6 MB en usr/lib/perl5/5.40.2/x86_64-linux/CORE/, y el binario la encuentra por su RUNPATH, que apunta justo ahí. El vigía no la veía porque perl la construye con -Duseshrplib y NO le pone SONAME: el código sólo registraba el nombre del fichero `if son:`. Un ELF compartido sin SONAME se resuelve POR NOMBRE DE FICHERO, y eso es exactamente lo que había que indexar. El otro falso positivo era el último «hueco» del informe: usr/lib/go/src/debug/elf/testdata/libtiffxx.so_ — un ELF de MUESTRA que Go shipea para los tests de su propio paquete debug/elf, pidiendo libc.so.6 (glibc) en una distro musl. Un binario que nadie ejecuta. `testdata/` no es cierre. Importa arreglar un falso positivo aunque «sólo» sea ruido: un vigía que grita en falso enseña a ignorarlo, y así es como libstdc++.so.6 —que SÍ rompía el navegador en los cuatro escritorios— estuvo en esta misma salida sin que nadie la mirara. escritorio-mirada 41 nodos · 231 sonames · 0 sin proveedor escritorio-kde 306 nodos · 2083 sonames · 0 sin proveedor escritorio-gnome 190 nodos · 657 sonames · 0 sin proveedor escritorio-cosmic 161 nodos · 498 sonames · 0 sin proveedor escritorio-sway 201 nodos · 509 sonames · 0 sin proveedor PROBADO CON UNA ROTURA A PROPÓSITO, porque un vigía todo-verde se ve igual que uno roto. Quitando `runtime = ["gcc-libs"]` de firefox SOLO no pasa nada —atuq lo declara también y es raíz de los mismos perfiles, así que la librería entra igual; el primer control estaba mal montado—. Quitándolo de las DOS, kde y cosmic vuelven a reportar libstdc++.so.6 y libgcc_s.so.1 exactamente. Restaurado después. --- docs/state/sonames.txt | 16 +++++----------- scripts/vigia-sonames.py | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/state/sonames.txt b/docs/state/sonames.txt index e864ee9e..f88ffc9d 100644 --- a/docs/state/sonames.txt +++ b/docs/state/sonames.txt @@ -1,11 +1,5 @@ -== escritorio-mirada 41 nodos · 136 sonames provistos · 1 sin proveedor - FALTA libperl.so ← lo piden: perl -== escritorio-kde 306 nodos · 1387 sonames provistos · 1 sin proveedor - FALTA libperl.so ← lo piden: perl -== escritorio-gnome 190 nodos · 517 sonames provistos · 1 sin proveedor - FALTA libperl.so ← lo piden: perl -== escritorio-cosmic 161 nodos · 390 sonames provistos · 1 sin proveedor - FALTA libperl.so ← lo piden: perl -== escritorio-sway 201 nodos · 402 sonames provistos · 2 sin proveedor - FALTA libc.so.6 ← lo piden: go - FALTA libperl.so ← lo piden: perl +== escritorio-mirada 41 nodos · 231 sonames provistos · 0 sin proveedor +== escritorio-kde 306 nodos · 2083 sonames provistos · 0 sin proveedor +== escritorio-gnome 190 nodos · 657 sonames provistos · 0 sin proveedor +== escritorio-cosmic 161 nodos · 498 sonames provistos · 0 sin proveedor +== escritorio-sway 201 nodos · 509 sonames provistos · 0 sin proveedor diff --git a/scripts/vigia-sonames.py b/scripts/vigia-sonames.py index d2c4e11f..5a9cb0fc 100755 --- a/scripts/vigia-sonames.py +++ b/scripts/vigia-sonames.py @@ -84,6 +84,15 @@ def escanear(nodos): for raiz, _, ficheros in os.walk(d): for fn in ficheros: p = os.path.join(raiz, fn) + # ⚠ `testdata/` NO ES CIERRE (2026-09-06). Go shipea su árbol de fuentes entero, y + # `usr/lib/go/src/debug/elf/testdata/` trae ELF de MUESTRA para los tests de su + # propio paquete `debug/elf`. Uno de ellos pide `libc.so.6` —glibc— y el vigía lo + # contaba como dep de ejecución del perfil sway: un binario que nadie ejecuta, + # pidiendo una libc que esta distro no usa. Era el último «hueco» del informe y era + # falso. Mismo criterio que el `libperl.so` de abajo: el ruido de un vigía es lo que + # enseña a ignorarlo. + if "/testdata/" in p: + continue if os.path.islink(p): # un symlink `libfoo.so.1 -> libfoo.so.1.2.3` TAMBIÉN provee ese nombre if ".so" in fn: @@ -98,6 +107,22 @@ def escanear(nodos): provee.update(son) if son: provee.add(fn) + elif ".so" in fn: + # ⚠ ELF COMPARTIDO **SIN SONAME**: provee por NOMBRE DE FICHERO (2026-09-06). + # Sin esta rama el vigía daba un hueco FALSO en los cinco perfiles: + # + # FALTA libperl.so ← lo piden: perl + # + # y `libperl.so` estaba ahí, 9,6 MB, en + # `usr/lib/perl5/5.40.2/x86_64-linux/CORE/`. Perl la construye con + # `-Duseshrplib` y NO le pone SONAME: el binario la encuentra por su + # `RUNPATH`, que apunta a ese CORE. O sea que el enlace resuelve por NOMBRE + # DE FICHERO, y eso es exactamente lo que hay que indexar. + # + # Importa arreglarlo aunque «sólo» sea un falso positivo: un vigía que grita + # en falso enseña a ignorarlo, y así es como `libstdc++.so.6` —que sí rompía + # el navegador— estuvo en esta misma salida sin que nadie lo mirara. + provee.add(fn) for n in need: pide.setdefault(n, set()).add(nombre) return provee, pide