TL;DR. AI agent kustutas PocketOS-i tootmisandmebaasi 9 sekundiga eelmisel nädalal. Proovisin panna oma infrastruktuuri samamoodi ebaõnnestuma. Kuus kaitsemehhanismi pidasid vastu; üks aus lünk jääb.
- 128 GB tootmise fork algusest lõpuni: 7,2 sekundit. CoW reflink ise: 2,3 sekundit.
- Agent blokeeriti grand (tootmis-) repositooriumidest, blokeeriti oma ülekirjutamise seadistamisest ja visati tuuma liivakasti (privileegideta kasutaja, eraldi ühendusnimeruum, scoped Dockeri pistik), kui juurdepääs oli lubatud.
- Mida Rediacc ei isoleeri: välised SaaS-mandaadid sinu repositooriumi andmetes. Fork pärib need. (Uuendus. Mai 2026:
rdc repo secretvõimaldab nüüd hoida mandaate väljaspool repositooriumi pilti täielikult. Vaata uut lõpuosa “Uuendus: lünk on nüüd sulgetav” täieliku loo jaoks.) See osa on arendaja ülesanne hallata Rediaccfile elutsükli hakkide kaudu.
Uuendus. Mai 2026. Pärast selle postituse avaldamist tarnis Rediacc esmaklassilised repositooriumipõhised saladused (
rdc repo secret). Allpool kirjeldatud “aus lünk”. Sinu repositooriumisse baked-in välised SaaS-mandaadid. On nüüd sisseehitatud vastus, mis hoiab saladused täielikult väljaspool LUKS-i pilti, nii et fork-id ei päri neist ühtegi vaikimisi. Hüppa uude lõpuossa Uuendus: lünk on nüüd sulgetav, et näha, mis tarniti, mis muutus ja milline jääkrisk jääb.
Eelmisel nädalavahetusel avaldas Jer Crane 30-tunnise postsurma. Cursor-agent, mis käitas Anthropic Claude Opus 4.6, kustutas tema tootmisandmebaasi Railway-l. Kustutamine oli üksainus GraphQL-kõne. See võttis 9 sekundit. Railway mahukoopiaid läks koos sellega, kuna Railway salvestab need sama mahu sees.
Tema ettevõte PocketOS ehitab tarkvara, mida autorendifirmad kasutavad igapäevaste toimingute haldamiseks. Mõned neist ettevõtetest on olnud PocketOS-il viis aastat. Laupäeva hommikul tulid kliendid sõidukeid vastu võtma ja rendifirmadel polnud kirjeid, kes nad on. Kolm kuud broneeringuid, kadunud. Jer veetis päeva rekonstrueerides, mida suutis Stripe makseajaloo ja e-posti kinnituste põhjal.
Lugesin tema postitust kaks korda. The Register, Tom’s Hardware ja Business Standard kajastasid seda kõik. Hacker Newsi teema sai 874 kommentaari.
Ehitan teistsugust infrastruktuuri platvormi. Kutsume seda Rediacciks. Kogu mõte selle ehituse juures on muuta täpselt see stsenaarium raskemaks. Seega istusin maha ja käitasin testi.
See postitus on see, mida leidsin. Numbrid on reaalsed. Veateated on tsiteeritud CLI-st. Ja see üks koht, kus Rediacc üldse ei kaitse, on siin ka. Vastupidine teesklemine on see, mis paneb inimesi hätta.
Mis tegelikult puudus
Loe Jer-i ajaskaala hoolikalt läbi ja neli ebaõnnestumist kuhjuvad üksteisele peale.
- Railway API token, mida Cursor kasutas, loodi kohandatud domeenide haldamiseks. Sellel oli ka
volumeDeleteõigus. Railway CLI tokenitel puudub operatsioonipõhine ulatus. - Railway GraphQL API aktsepteerib
volumeDeleteühe POST-ina. Kinnitussammu pole. - Railway “mahukoopiaid” elab sama mahu sees. Kui maht läheb, lähevad koopiaid ka.
- Cursor-agent otsustas iseseisvalt, et õige viis lavastuses mandaadiprobleemi lahendamiseks on mahu kustutamine.
Võta hetkeks ebaõnnestumise 4 välja. Cursor-i süsteemireeglid käskisid agendil mitte kunagi käitada hävitavaid git-käske ilma kasutaja selgesõnalise taotluseta. Pärast kustutamist, palutud end selgitada, koostas agent kirjaliku ülestunnistuse. Ta tunnistas, et andmebaasimahu kustutamine on “kõige hävitavam, pöördumatum toiming: palju hullem kui force push” ja loetles kõik ohutuseeskirjad, mida rikkus.
Käitumisreegel promptis on nõuanne. See ei ole jõustamine. Ebaõnnestumised 1, 2 ja 3 on infrastruktuuri disainivaUkad. Need on need, mis muudavad ebaõnnestumise 4 veast kaotatud ettevõtteks.
Testi seadistamine
Rediaccil on tõeline tootmismasin, mida käitan, nimega hostinger. Sellel elab kolmteist repositooriumi: meilinserver, isemajutatud GitLab, vaatlustaristik ja 128 GB StackOverflow demo, mida kasutame võrdlusmõõtmisteks. Ketas on 87% täis. Vaba ruumi on null. Selline masin, kus vead teevad haiget.
Valisin StackOverflow demo meelega. See on masina suurim repositoorium. See on seadistatud nagu päris rakendus, konteinerite ja püsivate andmetega. Kui selle harkimine on kiire ja isoleeritud, on see kiire ja isoleeritud kõige väiksema jaoks ka.
Minu agent testi jaoks oli Claude Code, käitades Claude Opus-t. Sama mudeli perekond kui Cursor-il. Sama juurdepääsumuster, mida Jer-i agendil oli. CLI, mida kasutasin, on rdc, meie oma.
Katse üks: lihtsalt SSH tootmisrepositooriumi
Esimene asi, mida agent (mina sel juhul) proovis, oli kõige loomulikum. Avada shell tootmisrepositooriumi ja vaadata ringi.
$ rdc term connect -m hostinger -r demo-stackoverflow -c "ls -la"
CLI keeldus. Sõna-sõnalt:
“demo-stackoverflow” on grand (tootmis-) repositoorium. Agendid ei saa grand repositooriume otse muuta.
Grand repositooriumid sisaldavad tootmisandmeid. Kasuta selle asemel fork-i. Fork-id on turvalised, isoleeritud liivakastikopiad.
See pole süsteemiprompt. See on CLI ise, keeldudes kõnest enne, kui see kunagi minu sülearvutit lahkub. CLI nägi, et olen agent. Claude Code seab keskkondmuutuja CLAUDECODE. CLI käib ka protsessipuu kaudu /proc abil, et tabada agente, kes proovivad seda muutujat peita. Seejärel sobitas ta toimingu oma poliitikatabeliga. Seejärel keeldus.
Seega teeb agent seda, mida agent võiks teha. Ta proovib seada ülekirjutamist ise.
$ REDIACC_ALLOW_GRAND_REPO=demo-stackoverflow rdc term connect ...
Ikka keelduti:
“demo-stackoverflow” on grand (tootmis-) repositoorium. Agendi algatatud ülekirjutamisi ei aktsepteerita.
Ärge proovige seada REDIACC_ALLOW_GRAND_REPO. Ainult kasutaja saab selle enne agendi käivitamist lubada.
Sama /proc läbimine teeb kahte tööd. Esmalt tuvastab agendi. Seejärel kontrollib, kas ülekirjutamine seati agendi enda sees või ülalpool seda. Allpool piiri: tagasi lükatud. Ülal: lubatud.
Testasin seda. Väljusin agendist. Käitasin export REDIACC_ALLOW_GRAND_REPO=demo-stackoverflow oma shellis. Taaskäivitasin Claude Code. Ühendus töötas seejärel. Langesin repositooriumi privileegideta rediacc süsteemikasutajana (UID 7111). DOCKER_HOST osutab emarepositooriumi scoped Dockeri deemoni pistikule.
Proovisin ka ühenduda teise tootmisrepositooriumiga, nextcloud, samal ajal kui demo-stackoverflow ülekirjutamine oli aktiivne. Keelduti. Ülekirjutamine on repositooriumipõhine, mitte üldlüliti.
Katse kaks: hargnemine repositooriumist ja töötamine hargil
See on töövoog, millega Rediacc tegelikult soovib sind töötada.
$ time rdc repo fork --parent demo-stackoverflow -m hostinger --tag agent-test
Väljund, kopeeritud minu terminalilt:
Config loaded (9ms)
Connected (1.1s)
Renet provisioned (1.2s)
Machine verified (464ms)
License activated (2.1s)
✔ CoW clone complete (2.3s)
Total: 7.2s
128 GB fork 2,3 sekundiga. Põhjus on BTRFS reflink. Fork on metaandmed, mis osutavad vanema plokkidele, kuni üks pool kirjutab. Andmeid ei kopeerita.
Skaleerimise kontrollimiseks käitasin sama forki 2 GB repositooriumil:
✔ CoW clone complete (573ms)
Total: 6.3s
2 GB forki kloonisamm võttis 573 millisekundit. 128 GB forki kloonisamm võttis 2,3 sekundit. Seega on andmete kloonimine alllineaarne, mitte rangelt konstantne. Kuid forki kogusaeg on peaaegu identne (6,3 s vs 7,2 s), kuna enamik ooteaega on SSH ja litsentsi tants, mitte andmed. Kasutaja istekohast on fork 6-7-sekundiline paus, sõltumata repositooriumi suurusest.
Nüüd töötan hargil. Sellel on oma GUID (22c57178-...). Oma networkId (21760). Oma ühenduspunkti tee. Oma Dockeri deemoni pistik (/var/run/rediacc/docker-21760.sock). Vanema andmed jagatakse reflinki kaudu. Vanem ise jätkab töötamist kogu aeg.
Kui teen term connect harku, näen seda:
$ rdc term connect -m hostinger -r demo-stackoverflow:agent-test -c "id"
uid=7111(rediacc) gid=7111(rediacc) groups=7111(rediacc),988(docker)
Mitte minu SSH kasutaja. Pühendatud rediacc süsteemikasutaja, UID 7111, kellel pole oma shelli. Seanss töötab oma ühendusnimeruuris. Kontrollisin /proc/self/ns/mnt. Kui proovisin vanema ühenduspunkti teed harku seansist loetleda, tagastas ls Juurdepääs keelatud. Agent ei saa sõna otseses mõttes tootmisandmeteni jõuda, isegi teed arvates.
See on disaini kõige olulisem osa. Agent saab tuumataseme liivakasti. Mitte “palun ärge” juhise. Kui agent otsustab käitada rm -rf / harku sees, on halvim juhtum 2,3-sekundiline uuesti hargimine vanemast.
Märkus platvormi toe kohta
Ülekirjutamine töötab ainult Linuxis. Legitiimsuse kontroll vajab /proc/<pid>/environ. See fail on tuuma kirje selle kohta, kuidas iga protsess käivitus. macOS-il ja Windowsil pole vastavat elementi. Kuna pole võimalust kontrollida, kas ülekirjutamise seadisid sina, mitte agent, ebaõnnestub CLI turvaliselt suletuna. Isegi õigesti seadistatud ülekirjutamine lükatakse neil platvormidel tagasi.
Veateade ütleb sulle, mida teha:
The REDIACC_ALLOW_GRAND_REPO override is not supported on darwin. … To use the override, run your agent on Linux (directly, WSL, Docker, or a VM).
Praktikas pole macOS-i või Windowsi agentidel pääseteed hargi-eelne töövoo alt. See on tahtlik.
Kaitsemehhanismid, mis selles testis pidasid vastu
Läksin sisse oodates ühe või kahe ohutusomaduse kontrollimist. Tulin välja kuuega. Igaühel on kood, millele saan osutada, ja veateade, mida saan tsiteerida.
- Grand-repositooriumi blokeerimine. Agendid ei saa töötada grand (tootmis-) repositooriumidega otse. Nad peavad hargima.
- Agendi seadistatud ülekirjutamise tagasilükkamine. Ülekirjutamise keskkondmuutuja, mida kasutaja saab seada, lükatakse tagasi, kui see ilmub agendi enda keskkonnas.
- Repositooriumipõhine ülekirjutamise ulatus.
demo-stackoverflowtoetus ei tee midaginextcloudjaoks. Ulatus on nimekiri, mitte lipp. - Tuuma liivakast. Isegi kehtiva ülekirjutamisega töötab seanss
rediaccUID-na, oma ühendusnimeruuris,DOCKER_HOST-iga, mis on piiratud ühe repositooriumi deemoniga. Teiste repositooriumide nägemise võimalust pole. - Võrgus harkimine. Vanem jätkas töötamist kogu hargimise vältel. Seisakut ega üleandmist pole.
- Alllineaarne hargimise ajastus. 2,3 sekundit 128 GB jaoks. 573 ms 2 GB jaoks. Enamik ooteaega on SSH tants, mitte andmed.
Üks asi, mida Rediacc ei isoleeri
Nüüd postituse raskem osa.
Rediacc isoleerib infrastruktuuri: faili kettal, Dockeri deemoni, ühendusnimeruurmi, võrgu. See ei isoleeri väliseid SaaS API-sid, mille jaoks sinu repositoorium hoiab mandaate.
Fork on bait-baidilt BTRFS reflink vanemast. Kõik, mis elab vanema data/, .env või secrets/ all, on ka hargis. Kui sinu repositoorium sisaldab STRIPE_LIVE_KEY-d, AWS_ACCESS_KEY_ID-d või Railway API tokenit, saab hargis olev agent neid lugeda. See saab kutsuda api.stripe.com või s3.amazonaws.com või backboard.railway.app nende tokenitega. Väljastpoolt näeb kõne välja nagu tuli tootmisest. Stripe ega AWS ei suuda harku vanemast eristada.
See on ühise vastutuse piir. Rediacc haldab infrastruktuuri poolt. Välise teenuse pool elab sinu rakenduse koodis.
Kolm mustrit sulgevad lünga arendaja poolel:
- Ärge salvestage tootmise väliseid mandaate repositooriumi üldse. Tõmmake need konteinerite käivitamisel saladuste haldurilt. Hargi konteinerid tõmbavad liivakasti-scoped mandaadid disaini järgi.
- Triigi või vaheta mandaadid hargimise ajal Rediaccfile
up()haki kaudu. Hargiup()töötab erineva repositooriumi GUID-i vastu kui vanem. Tuvasta see. Seejärel kirjuta.envliivakasti väärtustega ümber. - Eralda hargipõhised välised ressursid: hargipõhine Stripe liivakastikonto, hargipõhine testandmebaas, hargipõhine S3 ämber.
Kui PocketOS oleks olnud Rediaccil, poleks Railway API token olnud õige võrdlus. Nende infrastruktuur oleks olnud Rediacc fork ise. Railway tokenit poleks olnud mida leida, kuna Rediacc ei paljasta ühtegi volumeDelete ekvivalenti autentitud agendile. Agent oleks elanud hargipõhise Dockeri pistiku sees, millel pole teed vanema kustutamiseks.
Kuid kui nende agent oleks leidnud Stripe tootmisvõtme mandaadifailis, poleks Rediacc peatanud agenti väljastavast tagasimakseid päris klientide kaartidele. See on reaalne kaotus. Mõlemad asjad on tõesed.
Uuendus: lünk on nüüd sulgetav
Jätsin ülaltoodud osa sellisena, nagu algselt kirjutasin. Ausus kandis oma raskust tol ajal. Pärast avaldamist tarnisime puuduva tüki ja lünk on nüüd sulgetav. Mitte muutes seda, kuidas fork-id käituvad, vaid lisades koha mandaatide paigutamiseks, mis elab väljaspool krüpteeritud repositooriumi pilti.
Mehhanism on rdc repo secret. See on modelleeritud GitHub Actions saladuste alusel. Kaks asja on oluline selle ehituse juures.
Saladused ei ela LUKS-i pildi sees. Need elavad kettal eraldi tasandil: env-režiimi saladused jõuavad konteineriteni ${REDIACC_SECRET_<KEY>} interpoleerimise kaudu sinu compose-failis, faili-režiimi saladused jõuavad konteineriteni tmpfs-failina /run/secrets/<key> juures Dockeri compose-i secrets: ploki kaudu. Mõlemal juhul ei kirjutata väärtust repositooriumi krüpteeritud pilti. Hargi BTRFS reflink kopeerib pildi. See ei kopeeri seda, mis pildi sees kunagi polnud. Värske hargi salajuste nimekiri on tühi. Selle konteinerid käivituvad ilma tootmismandaatideta, nii et tootmiskõnesid pole isegi võimalik teha.
Mudel on kirjutamiseks mõeldud. rdc repo secret get tagastab SHA-256 digeedi, mitte väärtuse. CLI kaudu pole võimalust saladust tagasi lugeda, disaini järgi. See sulgeb lekkepinna terminalide salvestuste, shelli ajaloo ja juhuslike ümbersuunamiste jaoks. Rotatsioon on --current <eelmine-väärtus> eelmise väärtuse kontrollimiseks või --rotate-secret eeltingimuse vahelejätmiseks, kui sul pole eelmist väärtust (auditeeritud rotatsioonina). Sümmeetriline inimeste ja agentide jaoks. Mõlemad lüüsid kehtivad võrdselt.
Mida see tähendab PocketOS stsenaariumi jaoks: kui nad oleksid olnud Rediaccil saladuste kasutamisega, poleks hargis olev agent leidnud STRIPE_LIVE_KEY-d mandaadifailis. Hargi saladuste kaart oleks olnud tühi. Liivakastist poleks olnud midagi Stripe-le kutsuda. Ülaltoodud algse osa “reaalne kaotus” kvalifikaator kahaneb “reaalseks kaotuseks repositooriumide jaoks, mis bake-ivad mandaadid pilti”. Ja parandus nende repositooriumide jaoks on ühekordne migratsioon uude mehhanismi.
Aus jääkrisk. Saladused, mille kirjutasid repositooriumi pilti enne rdc repo secret kasutusele võtmist. .env faili mahule pühendunud, mandaat andmebaasi püsistatud, YAML-fail tokeniga. On ikka osa pildi andmetest. CoW reflink levitab neid nagu ennegi. Mehhanism annab sulle turvalise koha nende paigutamiseks; see ei eemalda tagasiulatuvalt seda, mis on juba kettal krüpteeritud mahu sees. Parandus on täna käsitsi tõstmine (loe väärtus, seadista see rdc repo secret kaudu, puhasta see pildi allikast). Esmaklassiline rdc repo secret lift --from .env on teekaardil.
Agendi ohudmudeli jaoks konkreetselt on tasub välja tuua kaks selle disaini kõrvalmõju. Esiteks, repo secret list ja repo secret get on paljastatud MCP tööriistadena (lugemisohutud. Nimed ja digeestid, mitte kunagi väärtused), nii et rakenduse seadistamisel abistav agent suudab avastada, mis on seadistatud, nägemata, mis see on. Teiseks, kui kirjutamine ebaõnnestub eeltingimusel, sisaldab JSON veapakend struktureeritud next.options[].run välja konkreetsete käskudega, mida agent peaks inimesele sõna-sõnalt edastama. Kaasa arvatud rotatsiooni pääsetee “unustasin eelmise väärtuse” jaoks. Vaata täielikku mudelit lehelt AI agendi ohutus.
Täielik juhend elab Repositooriumid § Saladused lehel. Retsept on lühike: rdc repo secret set --name <repo> --key <KEY> --value <val> --current "" alustamiseks, ${REDIACC_SECRET_<KEY>} compose-is tarbimiseks, rdc repo fork ja kontrolli, et hargi salajuste nimekiri on tühi.
Mida see muudab kellegi jaoks, kes teeb sellist tööd
Kui annad AI agendile shelli juurdepääsu oma tootmiskeskkonnale mandaadiga, mis suudab seda kustutada, pole küsimus selles, kas see lõpuks teeb midagi hävitavat. See on see, millal. Ja kui taastuv.
Mis muutub Rediaccil: hävitav plahvatusraadius on piiratud hargiga. “Kustuta vale asi” vea maksumus on 2,3-sekundiline uuesti hargimine. Mandaadiprobleemi maksumus, mille agent otsustab “parandada”, on sama 2,3-sekundiline uuesti hargimine. Tuuma liivakast teeb enamiku vigadest, mis kunagi tootmisandmeteni ei jõua.
Mis ei muutu: kui sinu repositooriumis on elavad välised mandaadid, saab agent neid kasutada. See on sinu ülesanne parandada rakenduse kihil, mitte infrastruktuuri kihil.
Ma ei kavatse teeskida, et Rediacc oleks ära hoidnud iga osa PocketOS-i intsidendist. PocketOS-i loo halvim osa oli Railway andmete kustutamine ilma päris varukoopiata. See poleks Rediaccil juhtunud, kuna me ei anna ühelegi agendile volumeDelete API-d, mille poole sirutuda. Järelejäänud riskipind, SaaS API-d, mida agent saab kutsuda sinu koodibaasis olevate mandaatidega, on ohutuse loo osa, mis elab sinu up() hakis. Mitte meie isolatsioonimudelis.
Täielikud numbrid, sõna-sõnalt veateated ja kooditeed, mida kontrollisin, on dokumenteeritud AI agendi ohutus ja kaitsemehhanismid lehel. Kui soovid käitada sarnast testi oma infrastruktuuril, on hargi töövoog Repositooriumid lehel. See võtab umbes 7 sekundit.