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 1182Shell 87Rust 63Markdown 541592 Sutichaykuna

⎇ d611f8577d0ebb0f265143be9007a5b94a7dd1fc scripts/harkaq/runtime-policy.sh Shell · 82 siq'ikuna · 4.1 KB Ñawpa willay ch'uya

harkaq: revertir busybox (era runtime base, rompía builds) + coordinar el §3 con Fable 5 d99ed5885 · sergio ·

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    # CONTACTO con el §3 (clases de servicio, diseño de Fable 5): la medición no sólo lista
66    # paths — propone la CLASE. El path va a Landlock (detalle, userspace); la clase va al bit
67    # del u32 firmado (frontera, Ring 0). La medición ALIMENTA la tabla; la tabla decide el bit.
68    # Ninguno ensancha por su cuenta (D3).
69    clases=""
70    echo "$propios" | grep -qE '/etc/(resolv\.conf|hosts)'    && clases="$clases dns"
71    echo "$propios" | grep -qE '/etc/ssl/certs'                && clases="$clases tls-certs"
72    echo "$propios" | grep -qE '/usr/share/zoneinfo|/etc/TZ'   && clases="$clases tz"
73    echo "$propios" | grep -qE '/dev/log'                      && clases="$clases syslog"
74    if [ -n "$clases" ]; then
75        echo
76        echo "   ── clases de servicio detectadas (§3: van al u32 firmado, NO a Landlock):"
77        for c in $clases; do echo "      $c"; done
78        echo "      ⇒ declarar por nombre en la ConcesionCapacidad; el resto de arriba es Landlock."
79    fi
80    echo
81    echo "   ⇒ los `ro` van a la política Landlock del binario instalado."
82fi