gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ main scripts/harkaq/harkaq-run.sh Shell · 73 lines · 3.5 KB History raw

harkaq: §4 corregido (política POR FICHERO) + Q2 con método y primeros datos reales 24c6ab455 · sergio ·

1#!/bin/sh
2# harkaq-run — corre un comando enjaulado y emite su Verdict (SDD 16, Fase 1).
3#
4#   harkaq-run.sh <fichero-política> <cmd...>
5#
6# Encadena las tres piezas: harkaq-audit escuchando en el HOST, bwrap poniendo los namespaces,
7# harkaq-exec poniendo la política dentro. El canario (D9) lleva un nonce único por corrida: es
8# lo que distingue "build limpio" de "lector ciego" —que producen los mismos bytes— y de paso
9# es la clave primaria que atribuye los registros a ESTE build y no a otro de la granja (§3.5).
10#
11# Variables: HARKAQ_BIN (default ~/.cache/harkaq), NONCE (default: derivado del pid).
12set -eu
13
14BIN="${HARKAQ_BIN:-$HOME/.cache/harkaq}"
15POLICY="$1"
16shift
17
18NONCE="${NONCE:-$$-$(date +%s 2>/dev/null || echo 0)}"
19CANARY="/tmp/harkaq-canary-$NONCE"
20
21# El canario es un fichero que EXISTE en el sandbox y que la política deja deliberadamente
22# fuera de la clausura. Su fuente da igual (sólo importa que el open rebote): usamos algo
23# mínimo y siempre presente.
24CANARY_SRC="$(mktemp)"
25echo "harkaq-canary $NONCE" > "$CANARY_SRC"
26trap 'rm -f "$CANARY_SRC" "$FIFO" 2>/dev/null || true' EXIT
27
28# Arrancar el lector ANTES del build y esperar a que confirme que escucha. Sin esta barrera,
29# las primeras denegaciones —el canario entre ellas— se emitirían sin nadie escuchando y el
30# veredicto sería SinEvidencia por una carrera, no por un problema real.
31FIFO="$(mktemp -u)"
32mkfifo "$FIFO"
33VERDICT="$(mktemp)"
34trap 'rm -f "$CANARY_SRC" "$FIFO" "$VERDICT" 2>/dev/null || true' EXIT
35
36"$BIN/harkaq-audit" --canary "$CANARY" --timeout "${HARKAQ_TIMEOUT:-120}" --ready-fd 3 \
37    3>"$FIFO" >"$VERDICT" &
38AUDIT_PID=$!
39read -r _ < "$FIFO" || true   # bloquea hasta que el lector esté escuchando
40
41# El probe del canario va DENTRO del `sh -c`, o sea DESPUÉS del execve: es el único sitio donde
42# valida lo que tiene que validar (que el logging post-exec funciona). Si lo hiciera harkaq-exec
43# antes de ejecutar, sería una denegación same-exec —que el kernel loguea por defecto— y no
44# probaría nada sobre el caso que importa (§3.4).
45# Sin redirects a /dev/null: exige /dev en la clausura y, si falta, sh falla en la redirección y
46# el probe no llega a correr — el error medía otra cosa (§3.5, nota de método).
47# Y sin `cat`: dependía de /bin/cat (applet de busybox); fuera de la clausura, el probe moría
48# antes de probar nada. Sólo builtins: `read` + redirección abre el fichero igual y dispara el
49# hook del LSM, sin depender de un solo binario del sistema.
50CMD="read _ < $CANARY || true; $*"
51
52# harkaq-exec y la política van bajo /tmp (tmpfs) y NO bajo /: con `--ro-bind / /` la raíz es de
53# sólo lectura y bwrap no puede crear ahí el punto de montaje. Que vivan en /tmp no los mete en
54# la clausura: se leen y se ejecutan ANTES del restrict_self — la jaula empieza en el `sh -c`.
55set +e
56bwrap --unshare-all --ro-bind / / --tmpfs /tmp \
57      --ro-bind "$CANARY_SRC" "$CANARY" \
58      --ro-bind "$BIN/harkaq-exec" /tmp/harkaq-exec \
59      --ro-bind "$POLICY" /tmp/harkaq.policy \
60      --die-with-parent \
61      /tmp/harkaq-exec --policy /tmp/harkaq.policy -- /bin/sh -c "$CMD"
62BUILD_RC=$?
63set -e
64
65# Gracia para que llegue el `deallocated` (el kernel lo emite con retraso: RCU/workqueue), y
66# después despertar al lector si sigue esperando — pasa cuando el build ni arrancó y el canario
67# nunca se emitió. Sin esto se comería el timeout entero por un fallo trivial.
68sleep 2
69kill -TERM "$AUDIT_PID" 2>/dev/null || true
70wait "$AUDIT_PID" 2>/dev/null || true
71cat "$VERDICT"
72echo "[harkaq-run] build rc=$BUILD_RC" >&2
73exit $BUILD_RC