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…
cierres §3: política de runtime derivada por medición (sin tocar la cripto)
1#!/bin/sh
2# runtime-policy.sh <binario> [args…] — política de RUNTIME derivada por medición (SDD 17 §3).
3#
4# La clausura que harkaq mide en BUILD **no** es la política de runtime: un build lee `zlib.h`,
5# `make`, el compilador; el binario resultante no lee nada de eso. Son dos clausuras de dos
6# sujetos distintos. Lo que sí sirve es la TÉCNICA: correr el binario bajo la jaula con política
7# mínima y dejar que las denegaciones digan qué necesita. Eso ES su política de runtime, derivada
8# por evidencia y no escrita a mano.
9#
10# scripts/harkaq/runtime-policy.sh store/<hash>-htop/usr/bin/htop --version
11#
12# BASELINE: el `sh` que lanza al binario también deniega cosas (locale, ld.so.cache). Se mide
13# primero un `true` para conocer ese ruido y RESTARLO — si no, la política del binario se lleva
14# la basura del lanzador.
15#
16# Cómo encaja con la concesión firmada de arje/wawa (PLAN-ATESTACION):
17# - `ConcesionCapacidad` firma `(blake3(binario), u32)` en 36 bytes canónicos, zero-alloc, Ring 0
18# ⇒ es la FRONTERA gruesa. NO se toca: meterle paths rompería todas las firmas y contradice
19# "capacidad = frontera física, no tabla".
20# - Esta política es el DETALLE granular (fs, paths), vive en userspace y se aplica con Landlock.
21# Los dos coexisten: el kernel verifica la frontera; Landlock aplica el detalle.
22set -eu
23
24BIN="${1:?uso: runtime-policy.sh <binario> [args…]}"
25shift || true
26HUB="$(cd "$(dirname "$0")/../.." && pwd)"
27cd "$HUB"
28BIN="$(cd "$(dirname "$BIN")" && pwd)/$(basename "$BIN")" # absoluto
29POL="$(mktemp)"; BASE="$(mktemp)"; MED="$(mktemp)"
30trap 'rm -f "$POL" "$BASE" "$MED"' EXIT
31
32# Política mínima DERIVADA (no a mano: escribirla a mano se olvida de libc.musl y el sh ni
33# arranca). El sandbox de harkaq-run monta el HOST ⇒ el cierre es el del sh DEL HOST.
34scripts/harkaq/harkaq-base-closure.py / /bin/sh 2>/dev/null > "$POL"
35echo "ro $BIN" >> "$POL"
36
37denegados() { # corre $1 bajo la jaula y lista los paths denegados
38 HARKAQ_TIMEOUT=10 scripts/harkaq/harkaq-run.sh "$POL" "$1" 2>/dev/null \
39 | grep '^{' | head -1 \
40 | python3 -c 'import json,sys
41try:
42 v=json.load(sys.stdin)
43 if v["estado"]=="SinEvidencia": print("SIN-EVIDENCIA:"+v.get("motivo","")[:60]); raise SystemExit
44 for d in v["denials"]: print(d["path"])
45except Exception: pass'
46}
47
48echo "══ baseline: el ruido del lanzador (sh)"
49denegados "true" | sort -u > "$BASE"
50grep -q 'SIN-EVIDENCIA' "$BASE" && { echo " $(cat "$BASE")"; echo " ⇒ sin evidencia fiable: no se afirma ninguna política"; exit 3; }
51sed 's/^/ − /' "$BASE"
52
53echo "══ medición: $(basename "$BIN") $*"
54denegados "$BIN $*" | sort -u > "$MED"
55grep -q 'SIN-EVIDENCIA' "$MED" && { echo " $(cat "$MED")"; exit 3; }
56
57echo
58echo "══ POLÍTICA DE RUNTIME de $(basename "$BIN") (medida − baseline):"
59propios=$(comm -23 "$MED" "$BASE")
60if [ -z "$propios" ]; then
61 echo " (ninguna) — el binario no tocó NADA fuera de sí mismo."
62 echo " ⇒ política Landlock: sólo \`ro $BIN\`. Es el caso de un estático que no abre ficheros."
63else
64 echo "$propios" | sed 's/^/ ro /'
65 echo
66 echo " ⇒ pegar en la política Landlock del binario instalado."
67fi