runtime-trust — Runtime je bezpečné oslovit z jiného stroje a připojení k meshi nikomu nedůvěřuje omylem
Objevení není důvěra, důvěra není autorizace a volající smí cokoli měnit jen klíčem, který pojmenovává politika důvěry. Host, který runtime dosáhne, ho čte a nemění nic, co nedokáže autentizovat; každá událost v žurnálu byla ověřena proti politice důvěry, která platí nyní, ať dorazila linkou, nebo z disku; a limity, které dokumenty uvádějí, jsou limity, které kód vynucuje.
AKTIVNÍ 6 of 10 issues done
- připraveno
- 4
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 6
- zrušeno
- 0
Problém
Základní audit runtime balíčku (2026-10-09, M01) četl server a mesh proti jejich dokumentům a zjistil, že bezpečnostní model držel jen na síťovém hopu. Server navázaný mimo loopback přijímal každý stav měnící požadavek od jakéhokoli hosta, který neposlal hlavičku Origin: přechody plánu, zápisy continuity, jakoukoli schopnost přes executions.start a relace, nároky, předávky a revize meshe, které uzel pak podepsal vlastním důvěryhodným klíčem. Tři servery na stroji vlastníka byly tehdy takto navázány. Vedle toho: opětovné načtení žurnálu přeskakuje kontrolu důvěry, takže události odvolaného klíče se po restartu vracejí; Lamportova razítka nejsou omezena, takže důvěryhodný klíč může zpětně datovat nárok, aby vyhrál každý konflikt; prošlý nárok po rozdělení sítě ožije a vyhraje; zprávy hello nepojmenovávají příjemce; důvěra se čte z pracovního stromu větve; vstupy discovery mají neomezené kanály a čtení odpovědí.
Výsledek
Objevení není důvěra, důvěra není autorizace a volající smí cokoli měnit jen klíčem, který pojmenovává politika důvěry. Host, který runtime dosáhne, ho čte a nemění nic, co nedokáže autentizovat; každá událost v žurnálu byla ověřena proti politice důvěry, která platí nyní, ať dorazila linkou, nebo z disku; a limity, které dokumenty uvádějí, jsou limity, které kód vynucuje.
Aktuální stav
Vzdálené požadavky měnící stav byly připouštěny jen podle adresy (opraveno I2123). Zjištění o opětovném načtení žurnálu, mezích Lamport, oživení nároku, příjemci hello, kořeni důvěry a neomezeném vstupu platí tak, jak jsou zaznamenána v auditu.
Cílový stav
Každá hrozba v bezpečnostním modelu docs/MESH.md jmenuje test, který ji brání, a každé zjištění ze seznamu hrozeb výchozího auditu je buď bráněno testem, nebo zaznamenáno jako omezení, které dokumenty uvádějí.
Rozsah
- apps/majordomus-cli/src/http
- apps/majordomus-cli/src/mcp
- apps/majordomus-cli/src/mesh
- apps/majordomus-cli/src/capability
- docs/MESH.md
- docs/MCP.md
- test/cases
Mimo rozsah
- Šifrování přenosu. ADR 0032 rozhodlo o žádné závislosti na TLS; důvěrnost zůstává věcí sítě.
- Účty ani přihlášení. Vzdálený zapisovatel, když je potřeba, je připuštěn klíčem, který jmenuje politika důvěry.
Kritéria přijetí
- Požadavek z adresy, která není loopback, spustí jen schopnost, která čte nebo jejíž vstup je podepsaná zpráva, na každém transportu, který zná adresu volajícího
- Každá událost, kterou žurnál drží, prošla platnou politikou důvěry, ať dorazila spojením, nebo byla znovu načtena z disku
- Důvěryhodný klíč nemůže seřadit své tvrzení před již přijatá tvrzení a prošlé tvrzení se nevrací jako živé
- Každá hranice, kterou bezpečnostní model jmenuje, se vynucuje na vstupu, který jmenuje, s testem, který pošle o jeden víc
Validace
- bin/majordomus plan validate
- cargo test --test remote_callers --test mesh_cooperation
Požadované důkazy
- remote_write_refused
- reload_is_trust_checked
Rizika
- Vzdálený klient MCP ztrácí zápisy, které míval (announce, relace meshe). Zbývající cesta je tunel, který končí na loopbacku.
Úkoly
Každý z nich je prováděcí kontrakt s vlastními kritérii přijetí, validačním příkazem a požadovanými důkazy. Sloupec wave je vrstva grafu závislostí, v níž úkol leží.
| issue | status | vlna | závisí na | název |
|---|---|---|---|---|
| I2123 | HOTOVO | 0 | — | Volající mimo loopback čte a nemění nic, co nedokáže ověřit |
| I2124 | HOTOVO | 0 | — | Událost znovu načtená z disku se setká s platnou politikou důvěry a žádné razítko nepředběhne hodiny |
| I2132 | HOTOVO | 0 | — | Hello jmenuje runtime, pro který je určeno, a žádný jiný runtime ho nepřijme |
| I2133 | HOTOVO | 0 | — | Každý vstup i odpověď meshe má hranici a odmítnutá registrace se nic nedozví |
| I2134 | HOTOVO | 0 | — | Klíč odebraný ze seznamu důvěry ztratí své odkazy bez restartu a klíč uzlu lze rotovat |
| I2135 | HOTOVO | 0 | — | Kořen důvěry se čte z výchozí větve, ne z toho, co drží checkout |
| I2703 | PŘIPRAVENO | 1 | I2132 | Pravidlo spolupráce v meshi uvádí kontroly hello v pořadí, v jakém je kód spouští, a test toto pořadí jmenuje |
| I2704 | PŘIPRAVENO | 1 | I2133 | Dialer nečte odpověď za hranicí odkazu ani víc kandidátů, než je hranice, a odmítající peer se zkouší znovu měřenou, rozptýlenou rychlostí |
| I2705 | PŘIPRAVENO | 1 | I2134 | Klíč uzlu lze rotovat, peery následují nový klíč a starý klíč se odmítne |
| I3175 | PŘIPRAVENO | 0 | — | Two hosts presenting one node key are named as a duplicate, never folded into one flapping node |
Graf
flowchart LR
I2123["I2123<br/>A caller beyond loopback reads, and changes nothing it cannot authenticate"]:::done
I2124["I2124<br/>An event reloaded from disk meets the trust policy in force, and no stamp outruns the clock"]:::done
I2132["I2132<br/>A hello names the runtime it is meant for, and no other runtime accepts it"]:::done
I2133["I2133<br/>Every mesh input and answer has a bound, and a refused registration learns nothing"]:::done
I2134["I2134<br/>A key removed from the trust list loses its links without a restart, and a node key can be rotated"]:::done
I2135["I2135<br/>The trust root is read from the default branch, not from whatever the checkout holds"]:::done
I2703["I2703<br/>The mesh cooperation rule lists the hello checks in the order the code runs them, and a test names that order"]:::ready
I2704["I2704<br/>A dialer reads no reply beyond the link bound and no more candidates than the bound, and a refusing peer is retried at a measured, jittered rate"]:::ready
I2705["I2705<br/>A node key can be rotated, peers follow the new key, and the old key is refused"]:::ready
I3175["I3175<br/>Two hosts presenting one node key are named as a duplicate, never folded into one flapping node"]:::ready
I2132 --> I2703
I2133 --> I2704
I2134 --> I2705
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxOdkazováno z tohoto diagramu (10)
- I2123 Volající mimo loopback čte a nic nemění, co nedokáže ověřit
- I2124 Událost znovu načtená z disku narazí na politiku důvěry, která platí, a žádné razítko nepředběhne hodiny
- I2132 Hello jmenuje runtime, pro který je určeno, a žádný jiný runtime ho nepřijme
- I2133 Každý vstup i odpověď meshe má mez a odmítnutá registrace se nic nedozví
- I2134 Klíč odebraný ze seznamu důvěry ztratí své linky bez restartu a klíč uzlu lze rotovat
- I2135 Kořen důvěry se čte z výchozí větve, ne z toho, co drží checkout
- I2703 Pravidlo spolupráce na meshi uvádí kontroly hello v pořadí, v jakém je kód spouští, a test toto pořadí jmenuje
- I2704 Dialer nečte žádnou odpověď nad mez linku ani víc kandidátů, než dovoluje mez, a odmítající peer se zkouší znovu v měřeném, rozptýleném tempu
- I2705 Klíč uzlu lze rotovat, peery následují nový klíč a starý klíč se odmítne
- I3175 Two hosts presenting one node key are named as a duplicate, never folded into one flapping node
Kanonický záznam: .ai/repo/project/milestones/runtime-trust.yaml. Přečtěte jej zpět pomocí majordomus plan show runtime-trust.