corpus: la cadena nftables (libmnl + libnftnl + nft 1.1.6), que el grafo pedía y nadie había puesto
Entra por el §6.5 del SDD 26 —el «modo foco» de atuq lo sostiene el cortafuegos del sistema y no una extensión que el navegador puede apagar— pero `nftables` estaba `wanted` en el grafo desde antes: la cadena sirve igual al servidor de producción del SDD 28. Selladas y MEDIDAS con el consumidor, no por presencia: nft --version → nftables v1.1.6, corriendo desde nuestro artefacto nft -c -f / nft -f → aceptan Y APLICAN en un netns privado (bwrap --unshare-net + CAP_NET_ADMIN) socket cgroupv2 level 1 "<cgroup>" → la expresión EXACTA que genera cortafuegos-core: aplica Dos hallazgos del camino, los dos en los comentarios de la receta: 1. nftables NO reproduce de fábrica: `MAKE_STAMP` es `$(shell date +%s)` y `nftversion.h` lo mete byte a byte en el binario — la familia del BuildID de waterfox. No mira SOURCE_DATE_EPOCH. Se fija en 0, que además es lo correcto: el sello sólo sirve para comparar qué nft creó una tabla, y dos builds de la misma versión SON el mismo nft. 2. su `config.status` trae un bashismo (`for ((i = 56; ...))`) que busybox rechaza con «bad for loop variable». Se arregla en el parche y no con CONFIG_SHELL=bash: el lab no entra en `hash_inputs`, así que apoyarse en su bash sería una dependencia invisible. Y una medición que condiciona al guardián que viene: `nft -c` NO es un chequeo de sintaxis — resuelve el path del cgroup contra la máquina viva y falla con «cgroupv2 path fails» si no existe. O sea que verificar una política del cortafuegos exige crear los cgroups, y eso pide root.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# libmnl 1.0.5 — la envoltura mínima de netlink de netfilter. Entra por el §6.5 del SDD 26: el
|
||||
# «modo foco» de `atuq` no lo sostiene una extensión sino el cortafuegos del sistema, y el
|
||||
# cortafuegos de tawasuyu habla con el kernel por `nft`, que se apoya en libnftnl → libmnl.
|
||||
#
|
||||
# El grafo ya pedía `nftables` como `wanted` desde antes; nadie había puesto la cadena. Son tres
|
||||
# recetas y ésta es la hoja.
|
||||
#
|
||||
# Tarball de release y no fuente por commit: el árbol de git NO trae `configure` (lo genera
|
||||
# `autoreconf`) y el corpus no tiene autoconf/automake — mismo motivo por el que jq y gmp entran
|
||||
# por tarball. El sha256 es el que publica netfilter.org junto al fichero, verificado al bajarlo.
|
||||
#
|
||||
# `link = "dynamic"` para que la cadena entera comparta forma con gmp, que sólo publica `.so`:
|
||||
# `nft` va a enlazar contra las tres, y mezclar `.a` de una con `.so` de otra es la clase de
|
||||
# detalle que se descubre cuando algo no arranca.
|
||||
name = "libmnl"
|
||||
version = "1.0.5"
|
||||
license = "LGPL-2.1-or-later"
|
||||
|
||||
[source]
|
||||
tarball = "https://www.netfilter.org/pub/libmnl/libmnl-1.0.5.tar.bz2"
|
||||
sha256 = "274b9b919ef3152bfb3da3a13c950dd60d6e2bcd54230ffeca298d03b40d0525"
|
||||
|
||||
[build]
|
||||
compiler = "zig-cc"
|
||||
target = "x86_64-linux-musl"
|
||||
link = "dynamic"
|
||||
flags = []
|
||||
|
||||
[build.phases]
|
||||
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-static --enable-shared'
|
||||
compile = 'make -j"$(nproc)"'
|
||||
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
||||
|
||||
[deps]
|
||||
build = ["binutils", "busybox", "make", "pkgconf"]
|
||||
@@ -0,0 +1,29 @@
|
||||
# libnftnl 1.3.2 — la librería que traduce entre las estructuras de nftables y netlink. Eslabón
|
||||
# del medio de la cadena que pide el §6.5 del SDD 26 (`libmnl` → `libnftnl` → `nftables`).
|
||||
#
|
||||
# La versión NO es libre: `nftables` 1.1.6 exige `libnftnl >= 1.3.1` en su `configure.ac:60`
|
||||
# (leído en el tarball pineado, no supuesto). 1.3.2 es la última de la serie.
|
||||
#
|
||||
# Tarball de release por el mismo motivo que libmnl: el árbol de git no trae `configure` y el corpus
|
||||
# no tiene autoconf/automake.
|
||||
name = "libnftnl"
|
||||
version = "1.3.2"
|
||||
license = "GPL-2.0-or-later"
|
||||
|
||||
[source]
|
||||
tarball = "https://www.netfilter.org/pub/libnftnl/libnftnl-1.3.2.tar.xz"
|
||||
sha256 = "c97abc3409f8fa396b4462b2bb7f147a3a47a4ddc97cfa0b2f18890c9cfde8b0"
|
||||
|
||||
[build]
|
||||
compiler = "zig-cc"
|
||||
target = "x86_64-linux-musl"
|
||||
link = "dynamic"
|
||||
flags = []
|
||||
|
||||
[build.phases]
|
||||
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-static --enable-shared'
|
||||
compile = 'make -j"$(nproc)"'
|
||||
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
||||
|
||||
[deps]
|
||||
build = ["binutils", "busybox", "make", "pkgconf", "libmnl"]
|
||||
@@ -0,0 +1,20 @@
|
||||
--- a/configure 2026-09-10 22:26:51.138468172 +0000
|
||||
+++ b/configure 2026-09-10 22:27:03.298756289 +0000
|
||||
@@ -15608,7 +15608,7 @@
|
||||
|
||||
# Current date should be fetched exactly once per build,
|
||||
# so have 'make' call date and pass the value to every 'gcc' call
|
||||
-MAKE_STAMP="\$(shell date +%s)"
|
||||
+MAKE_STAMP="0"
|
||||
|
||||
|
||||
# Check whether --enable-distcheck was given.
|
||||
@@ -17940,7 +17940,7 @@
|
||||
echo " ${STABLE_RELEASE}"
|
||||
echo "};"
|
||||
echo "static char nftbuildstamp[] = {"
|
||||
- for ((i = 56; i >= 0; i-= 8)); do
|
||||
+ for i in 56 48 40 32 24 16 8 0; do
|
||||
echo " ((uint64_t)MAKE_STAMP >> $i) & 0xff,"
|
||||
done
|
||||
echo "};"
|
||||
@@ -0,0 +1,61 @@
|
||||
# nftables 1.1.6 — el `nft` con el que se aplica el reglaset del cortafuegos. Es la pieza que el
|
||||
# grafo pedía como `wanted` desde antes de este frente, y la que destraba el §6.5 del SDD 26: el
|
||||
# «modo foco» de `atuq` lo sostiene el sistema (una regla de egress por cgroup) y no una extensión
|
||||
# que el propio navegador puede apagar.
|
||||
#
|
||||
# ⚠ LA VERSIÓN ES UNA DECISIÓN, NO UN DEFAULT. 1.1.7 ya está publicada (2026-09-01), pero el SDD del
|
||||
# cortafuegos de tawasuyu dice que sus expresiones —en particular `socket cgroupv2 level N`— están
|
||||
# «verificadas en metal contra nftables 1.1.6». Cambiar de versión cambia qué acepta `nft -c`, así
|
||||
# que se pinea la que la otra mitad ya midió; subirla es su propia unidad de trabajo, con la
|
||||
# revalidación incluida.
|
||||
#
|
||||
# `--without-cli`: el modo interactivo pide readline o editline, y acá nadie escribe reglas a mano
|
||||
# — las genera `cortafuegos-core` y se aplican con `nft -f`. `--disable-man-doc` porque el manual
|
||||
# sale de asciidoc/docbook, que no están en el corpus.
|
||||
#
|
||||
# Sin bison ni flex en `[deps]`: el tarball de release YA trae `src/parser_bison.c` y `src/scanner.c`
|
||||
# generados (comprobado en el tarball pineado). El árbol de git no, y ésa es otra de las razones por
|
||||
# las que esto entra por tarball.
|
||||
#
|
||||
# EL PARCHE ARREGLA DOS COSAS QUE VIENEN DE FÁBRICA, y las dos se midieron acá:
|
||||
#
|
||||
# 1. **un bashismo en `config.status`** — `configure.ac` emite `for ((i = 56; i >= 0; i-= 8))` para
|
||||
# escribir `nftversion.h`, y el `/bin/sh` del lab es busybox: el build murió con
|
||||
# `config.status: line 2041: syntax error: bad for loop variable`. Se reemplaza por un `for i in
|
||||
# 56 48 ... 0` POSIX, que produce la MISMA secuencia. Se podría haber pasado `CONFIG_SHELL=bash`
|
||||
# —el lab trae bash— pero eso mete una dependencia INVISIBLE: el lab no entra en `hash_inputs`
|
||||
# (ADR pendiente), así que el día que un lab sin bash construya esta receta, el fallo vuelve sin
|
||||
# que nada haya cambiado en el corpus. El parche sí entra en el hash.
|
||||
#
|
||||
# 2. **un sello de tiempo dentro del binario** — `MAKE_STAMP` es literalmente
|
||||
# `$(shell date +%s)`, y `nftversion.h` lo mete byte a byte en el ejecutable. Eso es la familia
|
||||
# exacta del `BuildID` de waterfox: dos builds de la misma fuente NO reproducen. nftables no mira
|
||||
# `SOURCE_DATE_EPOCH`. Se fija en `0`, que además es lo correcto acá: el sello sólo se usa
|
||||
# (`src/netlink.c:version_cmp`) para comparar qué `nft` creó una tabla, y en una distro
|
||||
# reproducible dos builds de la MISMA versión son el mismo `nft`.
|
||||
#
|
||||
# `link = "dynamic"` porque no hay alternativa honesta: nft necesita libgmp y `recipes/gmp.toml`
|
||||
# publica sólo `.so` (`--disable-static`). Un `link = "static"` acá sellaría un binario dinámico y
|
||||
# la receta estaría mintiendo — la familia de fallos del `link=static` por libtool.
|
||||
name = "nftables"
|
||||
version = "1.1.6"
|
||||
license = "GPL-2.0-only"
|
||||
|
||||
[source]
|
||||
tarball = "https://www.netfilter.org/pub/nftables/nftables-1.1.6.tar.xz"
|
||||
sha256 = "372931bda8556b310636a2f9020adc710f9bab66f47efe0ce90bff800ac2530c"
|
||||
patches = ["nftables-sin-bashismo-ni-sello.patch"]
|
||||
|
||||
[build]
|
||||
compiler = "zig-cc"
|
||||
target = "x86_64-linux-musl"
|
||||
link = "dynamic"
|
||||
flags = []
|
||||
|
||||
[build.phases]
|
||||
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sbindir=/usr/sbin --disable-static --enable-shared --without-cli --disable-man-doc'
|
||||
compile = 'make -j"$(nproc)"'
|
||||
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
||||
|
||||
[deps]
|
||||
build = ["binutils", "busybox", "make", "pkgconf", "libmnl", "libnftnl", "gmp"]
|
||||
Reference in New Issue
Block a user