vigía --uso: de los 64 applets que sólo da busybox, 12 tienen llamador

Es lo que el plan dejó sin medir tres veces («no se midió qué applets usa el
producto de verdad; eso abarataría el paso 1»). El modo lee del TSV los applets
con proveedor_medido = SOLO-BUSYBOX y los busca en el repo con las reglas
anti-ruido que el vigía ya tenía.

12 invocados: sh (28 sitios, lo cierra simi), ifconfig/route/udhcpc/netstat
(todos con ip/ss como primera opción y el applet como respaldo), setuidgid (3
cards: gitea, pacha-secretos, tejido), getty (la card de la consola), adduser,
nc, nslookup, poweroff. Y uno que es falso positivo del grep y conviene tener
escrito: los `insmod` de iso-image.sh/install-image.sh son de GRUB —`insmod
part_gpt` dentro de un grub.cfg—, no del busybox.

Los otros 52 no los llama nadie EN EL REPO, y la salida lo dice sin dejar que se
lea como una lista de borrado: un grep ve a quien invoca por nombre, y hay dos
consumidores que no aparecen nunca — el KERNEL (llama a /sbin/modprobe por
call_usermodehelper y al gestor de /dev por hotplug, así que modprobe/lsmod/
depmod/rmmod/modinfo/mdev/uevent/makedevs salen «libres» y no lo son) y el
USUARIO de la máquina, que espera clear/reset/vi/traceroute al entrar por ssh.

La primera versión del modo decía 10 y estaba mal en dos casos, los dos del lado
peligroso — dan permiso para retirar algo que se usa:

  · setuidgid se invoca como `exec /usr/bin/setuidgid pacha`, con RUTA ABSOLUTA,
    y el patrón de comando pide el nombre pegado al exec.
  · getty vive como `"argv": ["getty", …]`, elemento de un array JSON, y la regla
    que filtra cadenas por «parece una línea de comandos» —la que bajó el ruido
    de 91 hits a 0— descarta un nombre suelto.

Las reglas que quitan ruido son las que crean ceguera; lo que decide es hacia
dónde se equivoca cada una. Ahora busca tres formas: nombre desnudo, ruta
absoluta y primer elemento de argv. El vigía sigue verde en su modo original
(123 applets retirados, nadie los invoca) y se salta su propio fichero, que
nombra applets en la documentación y se denunciaba a sí mismo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-21 21:53:06 +00:00
co-authored by Claude Opus 5
parent 4357b29cb7
commit 8a109400b5
2 changed files with 171 additions and 0 deletions
+45
View File
@@ -1252,3 +1252,48 @@ ncurses— moría en ejecución con `Error relocating /lib/libncursesw.so.6`, to
anfitrión. Un `file` sobre los binarios lo dice en un segundo; ninguna prueba del build lo iba a
decir. Es [[cgo-sin-baseline-sigill]] otra vez: **redefinir una variable que el harness ya puebla
pierde en silencio lo que el harness había puesto**, y el síntoma aparece lejos.
## Quién usa lo que queda — `busybox-vigia.py --uso` (2026-09-21)
Esto es **lo que el documento dejó sin medir tres veces**: «no se midió qué applets usa el producto
de verdad; eso abarataría el paso 1». Ahora se mide. El modo nuevo lee del TSV los applets con
`proveedor_medido = SOLO-BUSYBOX` y los busca en el repo con las reglas anti-ruido del vigía.
De los **64**, sólo **12 tienen un llamador dentro del producto**:
| applet | quién lo llama |
|---|---|
| `sh` | 28 sitios — el `/bin/sh` de todo; lo cierra `simi` |
| `ifconfig` `route` `udhcpc` `netstat` | `metal-iso.sh`, `cosmic/metal-desktop-image.sh`, `test-foco-egress.sh`, `mudanza/censar.py`**todos con `ip`/`ss` como primera opción y el applet como respaldo** (`ip link set … \|\| ifconfig …`) |
| `insmod` | `iso-image.sh`, `install-image.sh` — ⚠ **es el `insmod` de GRUB**, no el de busybox: `insmod part_gpt` dentro de un `grub.cfg`. Falso positivo del grep, no migración |
| `setuidgid` | `gitea`, `pacha-secretos`, `tejido` — tres cards |
| `getty` | la card de la consola (`ssh-e2e-test.sh`, `takana-bootstrap`) |
| `adduser` | `servidor/alta-usuario.sh` |
| `nc` | `test-foco-egress.sh` |
| `nslookup` | `drive-netup.py` |
| `poweroff` | `farm/harkaq-campana-vol.sh` |
**Los otros 52 no los invoca nadie en el repo.** Y ahí está la trampa, escrita en la salida del
propio comando para que no se lea como una lista de borrado:
> **«Candidato» no es «retirable».** Un grep ve a quien invoca POR NOMBRE. Hay dos clases de
> consumidor que no aparecen nunca: **el kernel** —llama a `/sbin/modprobe` por
> `call_usermodehelper` y al gestor de `/dev` por hotplug, así que `modprobe lsmod depmod rmmod
> modinfo mdev uevent makedevs` salen «libres» y no lo son— y **el usuario de la máquina**, que
> espera encontrar `clear`, `reset`, `vi` o `traceroute` al entrar por ssh.
### Y los dos falsos negativos que tuvo el modo, que son la parte que enseña
La primera versión decía **10 invocados** y estaba mal en dos casos, los dos peligrosos porque
llevan a retirar un applet que el producto usa:
1. **`setuidgid`** — se invoca como `exec /usr/bin/setuidgid pacha`, con **ruta absoluta**. El
patrón de comando pide el nombre pegado al `exec`, y ahí hay un `/usr/bin/` en medio.
2. **`getty`** — vive como `"argv": ["getty", "-n", …]`, **elemento de un array JSON**. La regla que
filtra cadenas de Rust/TOML por «parece una línea de comandos» —la que en su día bajó el ruido de
91 hits a 0— descarta una cadena que es sólo un nombre.
Las dos reglas que quitan ruido son las mismas que crean ceguera, y la diferencia es hacia dónde se
equivoca cada una. En el modo original —«¿alguien llama a algo que ya retiré?»— un falso positivo
cuesta un minuto y un falso negativo cuesta un boot roto. En este modo pasa igual, así que ahora
busca **tres formas**: nombre desnudo, ruta absoluta y primer elemento de `argv`.