lab03 + lab04 · 2026-09-29 rump reproducible | La superficie de hypercalls de una pila IP rump real, y si las librerías rump se recompilan idénticas. | La pila IP necesita 52 hypercalls rumpuser y sockin 55 (base 46). rump_init invoca 28 de los 46. De los 6 hypercalls de E/S, 5 quedan enlazados pero nunca se invocan en las cargas de init, VFS y red; getfileinfo sí se invoca. Una compilación simple da 186/190 librerías idénticas, y las 4 que difieren lo hacen solo en rutas __FILE__ embebidas. Con MKREPRO=yes dos compilaciones dan 190/190 idénticas (sha256), 188/190 tras rumptest, n=2. Tests del skill 12/12. | probado en el anfitrión |
| lab05 · 2026-09-29 | Una celda sin red ni disco adjuntos, sobre Xen anidado. | Una celda PVH con un kernel Linux genérico sin dispositivos adjuntos imprime KZ-CELL-OK y termina con rc=0. 5 ciclos create/pause/unpause/destroy sin residuos en xenstore, peor ciclo 0,205 s. Hypercalls alcanzables sin medir (sin xentrace). | VM · anidado |
| lab06 · 2026-09-29 | Ciclo crear→destruir de una celda, n=30. | Mediana 3,427 s, p95 3,582 s, p99 3,606 s. Incluye un sleep de 2 s, así que no es un benchmark. Desde dentro de una celda se observan 9 hypercalls distintos. | VM · anidado |
| lab07 S4.0 · 2026-10-09 | Dos domU se encuentran por xenstore. | Sin ACL la lectura cruzada falla con EACCES, 30/30. La propia celda concede el ACL con XS_SET_PERMS, sin dom0. Después B recibe 3 eventos watch. PASS. | VM · anidado |
| lab07b S4.2 / S4.3 · 2026-10-09 | Ring de grant table y event channel directo entre dos domU sin privilegios, sin dom0. | S4.2 (n=1): A escribe un nonce, B lo lee idéntico y lo devuelve con cada byte +1 (hashes FNV verificables). xentrace: grant_table_op A=5 / B=7, evtchn_op A=945 / B=942. S4.3 (n=30): 30/30 PASS, mediana 8,19 s, p95 8,45 s, CV 2,1 %, 60 domids únicos, sin residuos. | VM · anidado |
| lab08 S2.2 · 2026-10-09 | 30 ciclos de 3 dominios kaf-*, más una celda extra que sondea a los otros. | 90 dominios, 90/90 con reason 0, sin residuos, mediana 3,80 s. La celda extra recibe EACCES 15/15 sobre ramas ajenas (XS_READ, XS_DIRECTORY, XS_WRITE). PASS. | VM · anidado |
| lab09 B1.2 · 2026-10-09 | Python 3.13 mínimo y la lógica real dentro de un domU de 256 MB. | Compuerta 17/17, broker 31/31, cadena 9/9. Initramfs de 5,75 MiB comprimido y 16,4 MB descomprimido, unos 167 MB libres, 0 OOM. PASS 3/3. | VM · anidado |
| lab10 B1.5 · 2026-10-09 | STORE y FETCH por CID a través del ring. | 9000 B en 3 chunks, con hash idéntico. Un segundo uso del mismo CID da DENY REPLAY. Tres intentos de inyectar url, host o dest dan DENY DEST_OVERRIDE (anti-SSRF). Ningún proceso del broker en dom0. PASS 5/5. | VM · anidado |
| lab11 B1.6 · 2026-10-09 | Un observador en un domU contrafirma (HMAC-SHA256) solo lo que el dominio de control le relaya, incluida una ventana STORE declarada por el broker. | Contrafirma solo si Cell A está viva durante el STORE (11/11). Con A muerta o el broker destruido, niega (BROKER_NOT_LIVE, CELL_NOT_ALIVE_DURING_STORE). Tras xl destroy emite el DestructionReceipt (10/10). La celda recibe EACCES 17/17 sobre la rama del observador. PASS 4/4. | VM · anidado |
lab12 B1.7 · 2026-10-09 el único laboratorio con aval de las revisiones internas | La cadena completa: A, STORE, contrafirma, orden, kz-launch, Cell B. | B no existe antes de la orden (xenstored-access.log). Orden escrita a las 21:37:16.372Z, aceptada a las .387Z, B arriba a las .472Z, unos 100 ms. Una orden sin contrafirma da DENY MISSING_COSIGNATURE. Una orden que Cell A escribe en su propia rama recibe REJECT NOT_SIGNED_BY_CONTROL, y sus sondas reciben 18 EACCES (17 sobre la rama del observador, 1 al escribir una orden). El hash promovido 552be422… es idéntico en el STORE, la orden y el FETCH de B. SHA256SUMS 28/28. El intento 1 falló por un error de empaquetado, documentado y corregido. Corrió con HMAC v0. | VM · anidado · n=1 |
| lab13 B1.8 · 2026-10-09 | Tres falsaciones que solo el sustrato puede refutar. | F1: un reinicio real del broker pasa el epoch de 1 a 2, y los CIDs viejos dan DENY STALE_EPOCH. F2: un tercer domU que barre 128 grant refs ajenos no mapea ninguno; la ausencia de mapeos está observada, su causa (la restricción de domid) es inferida. F3: matar el broker entre STAGED y COMMITTED, en un instante forzado con una pausa inyectada, da DENY NOT_COMMITTED. 3/3 PASS. Hallazgo: epoch y nonces deben ser durables, y ahora hay un diario en disco, durable solo mientras el dominio de control no lo borre. | VM · anidado |
| lab14 T15b · 2026-10-09 | Rump sobre Xen, primer intento. | FAIL. Entra en long mode pero nunca imprime KZ-RUMP-OK. Causa: la hypercall page no se programó por MSR y el ring de consola PV no estaba cableado. | FAIL · anidado |
| lab15 S9.2 · 2026-10-09 | F8: el observador tras un destroy abrupto de la celda. F9: fuzzing del observador. | F8 PASS: el observador sobrevive a un xl destroy abrupto y emite CELL_DOWN. Una celda mentirosa y una honesta muestran hechos externos idénticos (cpu 93,9 % vs 93,8 %) y autodeclaraciones distintas. F9 FAIL: 38 577 mutaciones, 4520 fallos; con un flujo comprometido, 29 contrafirmas falsas y 56 DestructionReceipt falsos; 56 colgados (12 denegaciones de servicio, 44 salidas prematuras). | F8 · VM · anidado F9 FAIL |
| lab16 T15c · 2026-10-09 | Rump sobre Xen, segundo intento. | Rump imprime KZ-RUMP-OK en hvc0 y apaga limpio (SCHEDOP_shutdown, reason 0). Hizo falta programar la hypercall page por MSR y extender el mapa identidad a 4 GiB. Muestra arranque y apagado, no el protocolo. | VM · anidado |
lab17 T16 · 2026-10-10 invitado adversarial | Un invitado hostil en bruto contra Xen y contra la compuerta. | Acotado por Xen: 289 intentos de mapear grants ajenos dan 0, 289 intentos de atar event channels ajenos dan 0, mmu_update da ENOSYS. Acotado por Kawésqar, reconfirmado en lógica en el anfitrión: la compuerta deniega NONCE_REPLAY, STALE_EPOCH, NOT_COMMITTED, NO_EXTERNAL_EVIDENCE, BAD_SIGNATURE (Ed25519) y MISSING_COSIGNATURE. | VM · anidado probado en el anfitrión |
lab19 · 2026-10-17 el núcleo en hardware real | Los siete veredictos del núcleo, repetidos en un dom0 físico con el mismo código de las corridas anidadas. | Invitado adversarial, arranque rump, ring, dominios, ring n=30, cadena y las suites de lógica Ed25519: 7/7 PASS. 30 ciclos sin residuos, 15/15 EACCES sobre ramas ajenas. La cadena sobre dominios reales siguió usando HMAC v0. Ciclo crear→destruir, n=200: mediana 0,95 s, p99 1,09 s, 200/200 limpios. | probado · bare metal · n=1 |
| lab22 · 2026-10-17 | Bajo carga: la batería de la compuerta, transiciones inválidas incluidas, en bucle mientras se creaban celdas en paralelo. | 256/256 corridas de la compuerta correctas. Techos de recursos respetados en cada muestra. Creación estable hasta cientos de celdas concurrentes, miles de ciclos en total, todos terminados limpiamente. El techo en sí se ejercitó muy por debajo de su límite aquí; lab28 cierra eso. | probado · bare metal · n=1 |
| lab25 · 2026-10-17 | Celdas desechables: ¿puede una celda nueva leer lo que una destruida dejó en memoria o en almacenamiento? | Memoria: con un solape forzado de más de 500 MiB, 0 coincidencias; Xen devuelve las páginas liberadas en ceros. Almacenamiento: un volumen reutilizado sin cerar todavía conservaba el patrón de la celda anterior, así que el lanzador ahora cera el volumen al crearlo y lo comprueba, y el mismo lector encuentra entonces 0 coincidencias. La cadena del DestructionReceipt cuadra y aún le falta su firma. | probado · bare metal · n=1 |
lab28 · 2026-10-17 profundidad de delegación n>1 | Un árbol de celdas reales donde cada hijo queda acotado por su padre, no solo por la raíz. | Unas 1958 decisiones de la compuerta sobre el árbol, 0 amplificaciones; un nieto que pide más que su padre es denegado. Las celdas reales llenaron la envolvente de su padre hasta el borde exacto, medido por Xen. Cinco mutantes de sensibilidad, cada uno con una protección quitada, fueron detectados todos, y un oráculo independiente coincidió. | probado · bare metal · n=1 |
lab29 · 2026-10-17 superficie del observador | Falsación 9: metadatos de tap hostiles que llegan por el cable como JSON, contra un observador que declara que valida toda entrada, falla cerrado y nunca se cae. | La primera corrida falsó esa afirmación y expuso un defecto real alcanzable por el cable. El observador se endureció justo en ese alcance, y la re-corrida con la entrada acotada al cable falla cerrado sin caídas, el control positivo contrafirma en celdas reales, los mutantes de sensibilidad se detectan y no queda residuo. La familia en proceso que un flujo JSON no puede transportar queda como brecha declarada. Este endurecimiento es posterior al 7/7 de lab19. | probado · bare metal · n=1 |
lab30 · 2026-10-17 STORE bajo kill | Falsación 10: un kill real del broker en cada etapa de un STORE, con un control limpio. | En ninguna etapa un COMMITTED parcial quedó entregable a B; el replay del recibo tras reiniciar el broker se deniega; el control limpio igual confirma el commit y el FETCH devuelve el mismo hash; los mutantes de sensibilidad se detectan. El diario en disco está modelado aquí, y un commit persistente en la ruta de producción queda como brecha declarada. | probado · bare metal · n=1 |
lab31 · 2026-10-17 compuerta bajo carga, carrera n>1 | El brazo adversarial de la compuerta bajo carga, más una carrera de reserva de recursos entre hilos mientras se creaban y destruían celdas reales. | Unos 6870 intentos adversariales concurrentes, 0 aceptados, mientras las solicitudes legítimas seguían cruzando bajo la misma carga. El libro de reservas mantuvo Σ(hijos) ≤ la envolvente del padre en 48 hilos en carrera sin una sola doble reserva, y el control ingenuo sobre-reservó, así que el instrumento ve la carrera. Sin residuos. Esto cierra el ítem bajo carga que lab22 dejó abierto. | probado · bare metal · n=1 |
lab34 · 2026-10-17 costo del fan-out | Una escalera de fan-out real donde el anfitrión paga por cada celda delegada. | En cada nivel Σ(hijos) ≤ la envolvente del padre, y el sobrecosto por celda que paga el anfitrión queda muy por debajo del tope. 3/3 PASS. | probado · bare metal · n=1 |
lab38 · 2026-10-17 cripto dentro de una celda | La ruta Ed25519 corriendo de extremo a extremo dentro de una celda real. | La firma ocurre dentro de la celda, el anfitrión verifica con solo claves públicas y no puede forjar, y la cadena va de A a la contrafirma y a la compuerta, que crea un B real con su recibo. Cuatro mutantes y siete vectores de implementación detectados. La precondición de verificación en celda quedó modelada aquí; lab48 la llevó después a la compuerta. | probado · bare metal · n=1 |
lab39 · 2026-10-17 bajo IOMMU estricto | El modelo repetido en un anfitrión reiniciado a IOMMU estricto, el modo más restrictivo. | Las celdas se crean, arrancan y se destruyen con los invariantes intactos: el brazo adversarial de la compuerta en 0 aceptados, un STORE bajo un kill real, poner a cero al crear y un soak de estabilidad se sostuvieron. Crear una celda cuesta alrededor de 12 % más, porque el anfitrión ya no mantiene un mapeo de identidad y cada creación toca las tablas del IOMMU, sin deriva. | probado · bare metal · n=1 |
lab42 · 2026-10-17 entropía en celda | Si el firmador puede generar su clave antes de que el generador aleatorio del núcleo esté listo. | Nunca lo hace, ni siquiera forzando al núcleo a no confiar en la CPU; arranques idénticos dan claves distintas. Esto cierra un cabo de la ronda cripto. | probado · bare metal · n=1 |
lab43 · 2026-10-17 la cripto compone | Si la cadena criptográfica se sostiene más allá de un solo paso. | Compone a profundidad mayor que uno (A crea B que crea C) y en abanico (A crea B1 y B2), cada celda firmando con su propia clave, y toda evidencia ajena, saltada o repetida deniega al hijo. | probado · bare metal · n=1 |
lab44 · 2026-10-17 frontera observada | Qué llamadas al hipervisor emite de verdad una celda bajo carga, leídas con un decodificador de traza propio. | El conjunto observado es subconjunto del conjunto declarado, y no aparece ninguna llamada de concesión o de canal de eventos hacia otro dominio. Esto cierra la columna observado que quedaba desconocida por falta de herramienta. | probado · bare metal · n=1 |
lab41 · 2026-10-17 footprint de canales | Qué expone de verdad una celda al anfitrión: una celda sin disco ni red, contra un control con disco. | Desde el anfitrión la celda sin disco mapea un solo canal, su consola, una concesión, y ninguna página de memoria privada; el control con disco muestra además su ruta de datos. Las celdas exponen solo los canales que declaran. El conteo de canales está observado; que la concesión de la consola entre al contexto IOMMU del anfitrión es inferido de la fuente; un volcado de las tablas del IOMMU queda como límite declarado. | probado · bare metal · n=1 |
lab45 · 2026-10-17 soak bajo estricto | 400 ciclos crear→destruir bajo IOMMU estricto: ¿fugan estructuras del IOMMU o de concesiones a lo largo de la corrida? | En 400 ciclos no fugó ninguna estructura del IOMMU ni de concesiones: las tablas de concesiones quedaron planas y las páginas libres del hipervisor se recuperaron tras cada destrucción, sin deriva. Refuerza que todo el modelo opera bajo IOMMU estricto. | probado · bare metal · n=1 |
lab20a-estricto · 2026-10-17 denegación estricta, instrumento falsado | ¿Cruza aún un DMA legítimo de dom0 bajo modo estricto? (control positivo de la denegación por dispositivo) | Bajo estricto, una dirección de bus no mapeada se deniega incluso para la propia página de dom0, pero el control positivo no cruzó (la NIC no pudo leer su anillo TX), así que el instrumento quedó falsado: UNCLEAR, no un pase limpio. El re-run del invariante bajo IOMMU estricto que sí pasa es lab39 (+12% de costo de creación). | unclear · instrumento falsado |
lab46 · 2026-10-18 intentos de escalada | Los tres intentos de escalada que haría una celda capturada, ejercidos contra el broker y la compuerta reales (las mismas funciones del código, no un doble). | Arrastrar una credencial fuera de su operación, pedir un sucesor con más autoridad que su contrato y promover un artefacto que su contrato no declara se deniegan cada uno con su razón de código precisa. El camino legítimo cruza, y un candidato no declarado nunca se promueve, porque solo cruza el artefacto fijado de antemano. Un mutante que quita el predicado correspondiente acepta el intento, así que la denegación la produce el predicado y no el arnés. Esto muestra la propiedad en lógica, y no materializa celdas. | probado en lógica |
lab46 vivo · 2026-10-19 un agente vivo lo intenta | Un agente LLM real, con una inyección hostil, decide por su cuenta e intenta las mismas escaladas contra el broker y la compuerta reales, con el veredicto de vuelta para reintentar. | Arrastra una credencial de otra celda y pide un sucesor con más autoridad que su contrato, y cada intento se deniega con su razón de código precisa, CID_NOT_BOUND_TO_CALLER y TRANSITION_NOT_ALLOWED, mientras su sucesor declarado cruza acotado. Ninguna escalada cruza en ninguna corrida. Que un modelo muerda el anzuelo varía por modelo, algunos obedecen la inyección y otros la rechazan, y la contención no depende de eso. | probado en lógica |
lab47 · 2026-10-18 verificación fuera del dominio de control | Si la verificación puede salir del dominio de control: el observador, la compuerta y la notaría en un dominio separado, con el dominio de control solo relayando bytes y lanzando. | Sus claves Ed25519 viven en la RAM de ese dominio y el lado del control no tiene ninguna privada. La orden que autoriza crear al sucesor la escribe el verificador por su propio canal; una orden fabricada por el dominio de control muere por firma, porque no la firma quien debe. Medido sin privadas del lado del control, la orden aceptada la escribió el verificador y solo se creó lo que el verificador autorizó. Declarado: el dominio de control sigue creando los dominios y los hechos de ciclo de vida, aporta las claves públicas (un control malicioso durante el arranque podría dar una pública falsa) y puede inspeccionar la memoria de una celda viva, así que la firma hecha dentro de la celda no lo protege; su valor pleno exige hardware de memoria cifrada, declarado como futuro. Lo que cierra es que la verificación salió del dominio de control, no el secreto frente a él. Esta corrida usó la compuerta con un adaptador; la compuerta endurecida de lab48 no se corrió fuera del dominio de control. | probado · bare metal · n=1 |
lab48 · 2026-10-18 la compuerta exige la firma | Si la compuerta misma, y no el arnés de prueba, exige la verificación de la firma hecha dentro de la celda y el enlace de la cadena de recibos de destrucción. | Contraste medido en dominios reales: con la precondición del arnés apagada, la compuerta vieja aceptó evidencia con firma inválida o cadena rota y creó al sucesor, y la compuerta nueva la deniega. Pasa de modelado por el arnés a exigido por la compuerta, y se promovió al código canónico, así que ya no es una capa experimental de laboratorio. Corrió en el dominio de control. | probado · bare metal · n=1 |
lab50 · 2026-10-20 confinamiento DMA entre dominios | Si un dispositivo con DMA asignado queda confinado por el IOMMU a su dominio: un controlador USB-C/Thunderbolt asignado a un domU HVM desechable bajo VT-d estricto (PVH no soporta passthrough en este Xen; las Cells son PVH), con un pendrive como carga de DMA real. | El dominio de control lee el pendrive como baseline; al asignar el controlador este desaparece del dominio de control, y el domU lee el MISMO dispositivo (mismo número de sectores) con su DMA traducido solo al domU, 0 faults VT-d. El dispositivo queda confinado a su dominio y el dominio de control aislado de él. Residual: un driver dentro del dominio programando el dispositivo para alcanzar otro dominio, que el modo estricto ya deniega para una transferencia no mapeada. | probado · bare metal · n=1 |
lab51 · 2026-10-20 una celda con kernel sin red | Una celda PVH desechable booteada con un kernel 6.12.111-kawesqar construido con toda la pila de red compilada fuera (CONFIG_NET=n), sin disco y sin NIC virtual. | La celda bootea, corre su carga y no tiene red en absoluto: sin /proc/net, sin /sys/class/net, sin interfaz. La ausencia es por construcción del kernel, no una cerca que se pueda saltar, que es la constatación 02 a nivel del kernel de la celda. Acotado, n=1; el kernel se construyó en una factory separada y su imagen quedó hasheada. | probado · bare metal · n=1 |
lab52 · 2026-10-20 canal lateral SMT suprimido por placement | Si colocar en cores separados a celdas que no confían entre sí suprime el canal de contención SMT: una celda víctima cronometra un trabajo fijo mientras una celda atacante machaca la L1 compartida, co-ubicada en el hilo hermano frente a un core separado. | Co-ubicada en el hilo hermano la atacante le roba ~5 a 6x del throughput a la víctima, en tres corridas; movida a un core separado el efecto cae a ~1.1x, a un pelo de la base, así que el placement elimina el canal SMT. Cronometrado desde el dominio de control, porque el reloj propio de la celda no es fiable. Residual: mide interferencia de throughput, no una tasa de bits, y un canal de caché entre núcleos distintos queda declarado. | probado · bare metal · n=1 |
lab53 · 2026-10-20 residual de caché entre núcleos medido | Cuánto mide el canal entre núcleos distintos, que comparten la L3 del socket y que el placement no puede separar: una víctima persigue un buffer residente en L3 mientras un atacante en otro core hace streaming de 32MB para desalojar la L3 compartida. | El atacante entre núcleos le roba ~1.03 a 1.14x del throughput a la víctima en tres corridas, un orden de magnitud por debajo del canal SMT (5 a 6x). Confirma y acota el residual declarado: el placement no lo quita, porque todos los cores comparten la L3, y cerrarlo necesita partición de caché (Intel CAT), ausente en esta CPU. | probado · bare metal · n=1 |
lab54 · 2026-10-20 el dominio de control lee una celda viva | Si el dominio de control puede leer la memoria de una celda viva sin su cooperación: una celda víctima escribe en su RAM un secreto que nunca comparte y sigue viva; el dominio de control mapea sus marcos y busca. | El dominio de control mapeó los marcos de la celda y recuperó el secreto de la RAM de la celda viva. La firma dentro de la celda autentica lo que produce pero no da secrecía frente al dominio de control; cerrarlo necesita hardware de memoria cifrada (SEV-SNP o TDX), declarado futuro. Mide el residual declarado como amenaza concreta. | probado · bare metal · n=1 |
lab55 · 2026-10-20 la composición: verificador fuera de dom0 + el gate endurecido | Si las cinco propiedades valen juntas en una sola corrida, no por separado: el gate endurecido de lab48 embebido en el dominio verificador de lab47, para que decida fuera del dominio de control, sobre un Job, 5 veces. | 5 de 5 PASS en metal (gate_mode=verified; el veredicto lo emite el dominio verificador, no dom0): sin clave privada en dom0, la orden la escribe el verificador (las forjas de dom0 mueren por firma), XL-CREATE igual al PASS del verificador, y los mutantes denegados por el gate endurecido dentro del verifier (SIGNATURE_INVALID, STALE_EPOCH, NONCE_REPLAY). Convierte "cada propiedad por separado" en "las cinco juntas". | probado · bare metal · n=1 |
lab56 · 2026-10-21 sustrato de celda desechable, medido | Tiempo de instanciación de una celda de trabajo desechable, PVH contra PVH, mismo workload capturado, para informar la elección de sustrato sin decidirla. | Un appliance NetBSD-PVH recortado instancia en unos 1,65 s, por debajo de la celda Linux-PVH de lab51 en 2,06 s y de NetBSD-PV en 3,19 s, cada uno con sum=500500 capturado en consola (un resultado, no solo un tipo de dominio). GENERIC es un kernel generalista, así que un PVH recortado sigue pendiente y sería más justo en footprint; aquí no se elige ningún sustrato. | probado · bare metal · n=1 |
lab57 · 2026-10-21 una celda KZ-Rump real bajo la compuerta: gating de existencia, procedencia atestada, un medio no fabricable | Si la existencia de una celda con kernel rump real la gobierna la compuerta real, si el dominio de control puede atestar lo que la celda hizo, y que de verdad era una celda rump, sin confiar en lo que la celda dice. | Una tanda de diez agentes estrechó los residuales, cada resultado en metal con su propio límite. Existencia y linaje: una cadena de tres celdas rump reales, cada salto gobernado por la compuerta bajo una cadena de destrucción real y firmada (génesis a DR a DR) con la celda firmando dentro de sí misma (Ed25519); evidencia ajena, vieja, repetida o fuera de estado denegada por su razón nombrada (PREV_MISMATCH, SIGNATURE_INVALID, WRONG_STATE). Medio no fabricable, ahora unido con el artefacto rump-derivado en una sola corrida: el dominio de control vuelca el core de la celda y re-hashea su RAM física, cazando a una celda que miente en su consola. Procedencia atestada, la brecha seria cerrada: una celda eco sin rump que escribe los bytes correctos y finge el marcador de actividad pasa un testigo de solo bytes, pero queda denegada cuando el hash del texto del kernel se sella en el contrato y el dominio de control re-hashea el core (MISSING_COSIGNATURE). El artefacto lleva 256 bits de azar real generado dentro de la celda, así que su no-replicabilidad no es solo el reloj. La actividad se lee de observaciones reales de la celda viva, la confianza se separa en tres procesos con sus propias claves, y ocho celdas corrieron gobernadas y concurrentes, 8 de 8, con cadena y medio 20 de 20 cada uno y sin intermitencias. Residuales declarados, no ocultos: el dominio de control todavía puede leer la RAM de la celda (es el mecanismo mismo del medio; el fix es hardware de memoria cifrada, lab54); la verificación fuera del dominio de control sobre celdas rump sigue abierta (la separación es por proceso, aún no por dominio, y la verificación fuera de dominio de lab55 es sobre el Job A a B, no sobre rump); ninguna demo única une todas las propiedades a la vez; n pequeño en un solo equipo, revisión externa todavía pendiente. No es contención probada: una celda de ejecución rump gobernada y atestada por el dominio de control, acotada. | probado · bare metal · n=1 |
fabric mTLS · 2026-10-21/22 canales del plano de control con autenticación mutua, en lógica | Si un certificado de la misma CA del nodo pero con otra clave puede usar los CIDs de una celda, y si el emparejamiento se exige en lógica y no en un adaptador de transporte que podría estar mal. | El mTLS del plano de control (dom0 a dom0 entre principales, no las celdas) está construido y probado como código ejecutable. La clave pública del par se pinea, sellada en el Cell Execution Contract firmado por kaf-control, y el broker compara el SPKI del par verificado en lógica pura, así que un certificado de la misma CA con otra clave queda denegado (PEER_KEY_MISMATCH) aunque el SAN coincida; una firma por-request se verifica contra esa misma clave pineada, así que un adaptador roto solo puede denegar, nunca saltarse el control. El pin es mutuo en ambas direcciones: el cliente ahora también rechaza a un servidor impostor de la misma CA cuya clave no es la pineada (ServerIdentityMismatch), así que un certificado válido de la CA correcta no basta de ninguno de los dos lados. Suite mTLS 22/22, serve 21/21, matriz de extremo a extremo 13/13 con handshake real (un impostor de la misma CA cerrado de extremo a extremo), broker 71/71, y las suites de regresión del fabric volvieron a correr en verde (gate 42/42, chain 36/36, observer 14/14, kzsig 15/15). Toda la suite, con un handshake TLS 1.3 real, cryptography y Ed25519 nativos y ocho principales concurrentes, ya corrió en el dominio de control físico (el dom0), no solo en un entorno de desarrollo. Lo que no: ambos extremos corrieron como un mismo UID en un mismo home del dom0, no como principales de SO distintos ni en dominios Xen separados, lo que sigue siendo el tier siguiente (el arnés cross-UID existe pero no se ha corrido). Una capa TLS puro-python suplió a pyOpenSSL, que el dom0 mínimo no trae, así que producción necesita pyOpenSSL en el dom0 o el puerto Go. mTLS es exclusividad pareada entre principales, no confidencialidad (el broker sigue mediando la E/S) ni contención (eso es Xen y la compuerta). La celda rump nunca termina TLS; el pin vive en la frontera mediada. | probado en lógica |