harkaq: la granja VPS ya puede ser el compilador continuo — golden bumpeada a 6.17 (ABI 7)

El VPS va a ser el compilador permanente ⇒ harkaq TIENE que correr ahí o el
frente queda como decoración de laptop. Verificado de punta a punta en un worker
efímero desde la golden, no en el papel:

  antes:   kernel 6.8.0-134  →  Landlock ABI 4  →  sin audit  →  SinEvidencia siempre
  después: kernel 6.17.0-40  →  Landlock ABI 7  →  AUDIT ✓

`apt install linux-image-generic-hwe-24.04` (archivo estándar de Ubuntu 24.04, sin
PPA ni cambiar distro), reboot, y la cadena COMPLETA de evidencia corre igual que
en el laptop:
    same-exec 2 registros · new-exec 0 (el ciego) · new-exec-logon 4
    domain=14e9f83c2 blockers=fs.read_file path="/etc/passwd" dev="sda1" ino=133259
El store del catálogo (103 artefactos) sobrevivió el bump intacto.

NUEVA GOLDEN: snapshot 408909310 "hammer-golden-harkaq-6.17-2026-07-15".
farm-up.sh pasa a usarla por defecto. La vieja (405120842) queda como fallback.

+ harkaq-uapi.h — EL HALLAZGO QUE IMPORTA para un compilador continuo: **el kernel
y los headers envejecen por separado**. El worker corre 6.17 pero su
linux-libc-dev es 6.8 y NO define NADA de lo necesario: ni los flags de log de ABI
7/8, ni AUDIT_LANDLOCK_ACCESS/DOMAIN (¡los tipos de registro!), ni IOCTL_DEV de
ABI 5. El kernel puede; el compilador no sabe pedírselo.

Es el mismo error de §3.1 al revés: allá, deducir el ABI de la versión del kernel;
acá, de la versión de los headers. NINGUNA de las dos dice la verdad — la única
fuente es el syscall en runtime. Estas constantes son números de contrato de UAPI,
estables por definición, seguros de fijar con #ifndef.

Sin esto harkaq sólo compila en distros con headers al día, que es justo lo que un
compilador continuo NO puede exigir. Y el modo de falla habría sido el peor: sin
AUDIT_LANDLOCK_ACCESS el lector filtraría por un número que no conoce y vería CERO
denegaciones — el falso `Hermetico` de D9, esta vez por headers viejos.

Nota: ABI 7 da el audit (lo que el proyecto necesita); TSYNC (ABI 8) pide 7.0 y no
está — es robustez opcional de D5, no un bloqueo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 17:33:14 -04:00
co-authored by Claude Opus 4.8
parent b122ded31f
commit cba59e829b
6 changed files with 91 additions and 8 deletions
+3 -2
View File
@@ -12,13 +12,14 @@
# La flota viva se registra en scripts/farm/.fleet ("<name> <ip>" por línea; gitignored).
# Idempotente al escalar: re-correr con más N agrega workers sin pisar los vivos.
#
# Env: IMAGE (snapshot, def 405120842=hammer-golden-2026-07-05), TYPE (def ccx23), LOCATION
# Env: IMAGE (snapshot, def 408909310=hammer-golden-harkaq-6.17-2026-07-15), TYPE (def ccx23),
# LOCATION
# (def hel1), SSHKEY (llave del proyecto Hetzner, def desarrollo@jlsoltech.com), SSH_KEY
# (privada local p/ SSH, def ~/.ssh/github5), REMOTE (def /opt/hammer).
set -euo pipefail
N="${1:-1}"
IMAGE="${IMAGE:-405120842}"
IMAGE="${IMAGE:-408909310}"
TYPE="${TYPE:-ccx23}"
LOCATION="${LOCATION:-hel1}"
SSHKEY="${SSHKEY:-desarrollo@jlsoltech.com}"
+1 -1
View File
@@ -16,7 +16,7 @@
// de desarrollo: sudo setcap cap_audit_read,cap_audit_control+ep harkaq-audit
#define _GNU_SOURCE
#include <linux/audit.h>
#include "harkaq-uapi.h"
#include <linux/netlink.h>
#include <signal.h>
#include <stdio.h>
+1 -1
View File
@@ -30,8 +30,8 @@
// Nunca se afirma evidencia que el kernel no respaldó.
#define _GNU_SOURCE
#include "harkaq-uapi.h"
#include <fcntl.h>
#include <linux/landlock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+84
View File
@@ -0,0 +1,84 @@
/* harkaq-uapi.h — las constantes del ABI de Landlock/audit, con respaldo propio.
*
* Por qué existe: **el kernel y los headers envejecen por separado**. El worker de la granja
* corre kernel 6.17 (Landlock ABI 7, con audit de denegaciones) pero su `linux-libc-dev` es
* 6.8 y no define NADA de lo que hace falta — ni los flags de log de ABI 7/8, ni
* `AUDIT_LANDLOCK_ACCESS`, ni `IOCTL_DEV` de ABI 5. El kernel puede; el compilador no sabe
* pedírselo. Medido en Ubuntu 24.04 + HWE 6.17 (SDD 16 §4.8).
*
* Es el mismo error de fondo que §3.1 advierte al revés: allá, deducir el ABI de la versión del
* kernel; acá, deducirlo de la versión de los headers. **Ninguna de las dos dice la verdad.** La
* única fuente es el syscall en runtime (`LANDLOCK_CREATE_RULESET_VERSION`), y estas constantes
* son números de contrato del kernel — estables por definición de UAPI, seguros de fijar.
*
* Sin esto, harkaq sólo compila en distros con headers al día, que es justo lo que un
* compilador continuo NO puede exigir.
*/
#ifndef HARKAQ_UAPI_H
#define HARKAQ_UAPI_H
#include <linux/audit.h>
#include <linux/landlock.h>
/* ABI 1 */
#ifndef LANDLOCK_CREATE_RULESET_VERSION
#define LANDLOCK_CREATE_RULESET_VERSION (1U << 0)
#endif
/* ABI 2 — sin REFER no compila software real (D7) */
#ifndef LANDLOCK_ACCESS_FS_REFER
#define LANDLOCK_ACCESS_FS_REFER (1ULL << 13)
#endif
/* ABI 3 */
#ifndef LANDLOCK_ACCESS_FS_TRUNCATE
#define LANDLOCK_ACCESS_FS_TRUNCATE (1ULL << 14)
#endif
/* ABI 5 */
#ifndef LANDLOCK_ACCESS_FS_IOCTL_DEV
#define LANDLOCK_ACCESS_FS_IOCTL_DEV (1ULL << 15)
#endif
/* ABI 6 — scoping de IPC (D8) */
#ifndef LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET
#define LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET (1ULL << 0)
#endif
#ifndef LANDLOCK_SCOPE_SIGNAL
#define LANDLOCK_SCOPE_SIGNAL (1ULL << 1)
#endif
/* ABI 7 — los flags de logging. LOG_NEW_EXEC_ON es del que cuelga TODO el proyecto: sin él el
* kernel no audita ninguna denegación posterior al execve y harkaq certificaría como herméticos
* todos los builds, sin un solo error visible (§3.4). */
#ifndef LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF
#define LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF (1U << 0)
#endif
#ifndef LANDLOCK_RESTRICT_SELF_LOG_NEW_EXEC_ON
#define LANDLOCK_RESTRICT_SELF_LOG_NEW_EXEC_ON (1U << 1)
#endif
#ifndef LANDLOCK_RESTRICT_SELF_LOG_SUBDOMAINS_OFF
#define LANDLOCK_RESTRICT_SELF_LOG_SUBDOMAINS_OFF (1U << 2)
#endif
/* ABI 8 */
#ifndef LANDLOCK_RESTRICT_SELF_TSYNC
#define LANDLOCK_RESTRICT_SELF_TSYNC (1U << 3)
#endif
/* Tipos de registro de audit. Sin éstos el lector no reconoce la evidencia AUNQUE el kernel la
* emita: filtraría por un número que no conoce y vería cero denegaciones — el falso `Hermetico`
* de D9, esta vez por headers viejos. */
#ifndef AUDIT_LANDLOCK_ACCESS
#define AUDIT_LANDLOCK_ACCESS 1423
#endif
#ifndef AUDIT_LANDLOCK_DOMAIN
#define AUDIT_LANDLOCK_DOMAIN 1424
#endif
/* Grupo multicast de sólo-lectura del audit (requiere CAP_AUDIT_READ). */
#ifndef AUDIT_NLGRP_READLOG
#define AUDIT_NLGRP_READLOG 1
#endif
#endif /* HARKAQ_UAPI_H */
+1 -2
View File
@@ -16,8 +16,7 @@
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <linux/audit.h>
#include <linux/landlock.h>
#include "harkaq-uapi.h"
#include <linux/netlink.h>
#include <stdio.h>
#include <stdlib.h>
+1 -2
View File
@@ -19,8 +19,7 @@
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <linux/audit.h>
#include <linux/landlock.h>
#include "harkaq-uapi.h"
#include <linux/netlink.h>
#include <stdio.h>
#include <stdlib.h>