From 5999aeda4516d7cf40cb092645eea942a1339f13 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 18 Sep 2026 15:39:14 +0000 Subject: [PATCH] =?UTF-8?q?borr=C3=A9=20/usr/bin/id=20probando=20el=20setu?= =?UTF-8?q?id=20=E2=80=94=20qu=C3=A9=20pas=C3=B3=20y=20por=20qu=C3=A9=20no?= =?UTF-8?q?=20se=20prueba=20as=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Para saber si el bit setuid elevaba copié busybox sobre /usr/bin/id (busybox elige el applet por argv[0] y necesitaba un nombre válido) y después borré «mis» copias de prueba. Una era el `id` del sistema, y no quedaba otro: /bin/id tampoco existía. El usuario se lo encontró de frente: «claude: line 23: id: not found» y «-bash: /usr/bin/id: No such file or directory». Restaurado como sus hermanos de identidad —whoami y groups apuntan a ../../bin/busybox— y comprobado con id de root, de sergio y con el `id -un` que usa el lanzador. Barrido: 0 enlaces colgados en /bin, /usr/bin, /sbin y /usr/sbin. La lección es de método: para probar una propiedad del sistema no se usa un nombre que el sistema ya ocupa. La sonda correcta fue la que terminé escribiendo —cinco líneas de C a un nombre inventado—. Y es la misma familia que el /etc/shadow del §6.51: la caja no avisa cuando le falta algo esencial, se entera el que lo usa. Co-Authored-By: Claude Opus 5 (1M context) --- docs/28-servidor-de-produccion.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index a157a946..30e0a053 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -3243,6 +3243,31 @@ ahí llevaba quién sabe cuánto igual de mudo. Se creó el `/etc/profile` con e caché de `zig cc` vive en `/work/zig-cache` (54 M) y **no** en la raíz de 5,9 G, por lo aprendido en §6.50 quinquies. +### 6.53 🔧 Borré `/usr/bin/id` probando el setuid *(2026-09-18)* + +Para saber si el bit setuid elevaba en esta caja copié `busybox` sobre **`/usr/bin/id`** —porque +busybox elige el applet por `argv[0]` y necesitaba un nombre válido— y después borré «mis» copias de +prueba. Una de ellas **era el `id` del sistema**. Resultado, del lado del usuario: + +``` + $ claude --dangerously-skip-permissions + /usr/bin/claude: line 23: id: not found + $ id + -bash: /usr/bin/id: No such file or directory +``` + +No quedaba ninguno: `/bin/id` tampoco existía. Se restauró como sus hermanos de identidad —`whoami` +y `groups` apuntan a `../../bin/busybox`— y se comprobó con `id` de root, de `sergio` y con el +`id -un` que usa el lanzador. Barrido posterior: **0 enlaces colgados** en `/bin`, `/usr/bin`, +`/sbin` y `/usr/sbin`, y presentes los ocho comandos de los que dependen el arranque y el lanzador. + +> **La lección, que es de método:** para probar una propiedad del sistema —¿eleva el setuid?— **no se +> usa un nombre que el sistema ya ocupa**. La sonda correcta era la que terminé escribiendo: cinco +> líneas de C compiladas con el `cc` nuevo a un nombre inventado (`probe-suid`). Copiar sobre `id` +> fue elegir el camino corto, y el camino corto se llevó un binario del que depende hasta el script +> que abre al agente. Es la misma familia que el `/etc/shadow` del §6.51: **la caja no avisa cuando +> le falta algo esencial — se entera el que lo usa**. + ### 6.51 🔥 Me dejé afuera de la caja — 20 minutos caída, y tres causas encadenadas *(2026-09-17)* Crear una cuenta de usuario tiró el servidor de producción. Queda escrito entero porque **ninguna de