[{"data":1,"prerenderedAt":886},["ShallowReactive",2],{"blog-de-heute-soll-der-agent-tun-was-er-nicht-darf":3,"header-blog-translations-/de/blog/heute-soll-der-agent-tun-was-er-nicht-darf":883},{"id":4,"title":5,"author":6,"body":7,"date":865,"description":866,"draft":867,"extension":868,"image":869,"meta":870,"navigation":871,"path":872,"seo":873,"stem":874,"tags":875,"translationKey":881,"__hash__":882},"blog_de/blog/de/heute-soll-der-agent-tun-was-er-nicht-darf.md","Heute soll der Agent tun, was er eigentlich nicht darf","Patrick Hofmann",{"type":8,"value":9,"toc":853},"minimark",[10,14,26,29,34,53,56,65,75,93,104,108,115,152,155,159,166,176,182,197,201,208,211,221,236,350,353,361,367,372,447,468,471,475,488,494,504,508,515,638,641,645,652,666,673,677,684,690,696,700,706,709,715,718,724,731,753,762,768,773,776,782,788,795,799,806,809,811,818,821,849],[11,12,13],"p",{},"Heute soll mein Agent etwas tun, was er eigentlich nicht darf.",[11,15,16,17,21,22,25],{},"Das ist nicht metaphorisch gemeint. openclaw läuft auf einem Mini-PC zuhause als eigener OS-User namens ",[18,19,20],"code",{},"openclaw",". Dieser User hat keinen sudo-Eintrag. Kein Passwort. Nichts in ",[18,23,24],{},"/etc/sudoers",". Kein NOPASSWD. Das ist Absicht — der ganze Sinn davon, den Agent als eigenen unprivilegierten User laufen zu lassen, ist dass ich seinem Handeln niemals implizit vertrauen muss.",[11,27,28],{},"Heute braucht er einen Befehl als root.",[30,31,33],"h2",{"id":32},"der-standard-reflex","Der Standard-Reflex",[11,35,36,37,41,42,45,46,49,50],{},"Wenn man im Internet nach ",[38,39,40],"em",{},"\"how to give an AI agent sudo\""," sucht, bekommt man bei so ziemlich jedem Tutorial denselben Vorschlag: trage den Agent-User in ",[18,43,44],{},"/etc/sudoers.d/"," ein, setz ein ",[18,47,48],{},"NOPASSWD: ALL",", und fertig. Manchmal wird die Zeile etwas eingeschränkt auf bestimmte Binaries, aber die Grundhaltung ist dieselbe: ",[38,51,52],{},"einmal vertraut, immer vertraut, keine Rückfragen.",[11,54,55],{},"Ich habe das nie gemacht und werde es nie machen. Die Gründe sind nicht Paranoia, sondern Architektur.",[11,57,58,64],{},[59,60,61,63],"strong",{},[18,62,48],{}," ist keine Sicherheitsaussage. Es ist der Verzicht auf Sicherheit."," Der sudo-Mechanismus existiert, um einen Nachweis der Authorisierung einzufordern. Wenn dieser Nachweis entfällt, ist der verbliebene Effekt von sudo nur noch das Umschalten der Effective UID. Der gesamte Audit- und Policy-Anteil ist weg.",[11,66,67,70,71,74],{},[59,68,69],{},"Der Agent wird zum ewig-privilegierten User."," Wer Zugriff auf den laufenden Agent-Prozess bekommt — ein kompromittiertes npm-Package in einem Tool, eine Prompt-Injection in einem Remote-Dokument, ein fehlerhafter Hook — hat ab diesem Moment Root auf der Maschine. Nicht eine Stunde, nicht ",[38,72,73],{},"\"wenn der Agent aktiv arbeitet\"",", sondern strukturell und permanent.",[11,76,77,88,89,92],{},[59,78,79,80,83,84,87],{},"Cache macht aus ",[38,81,82],{},"einmal approved"," automatisch ",[38,85,86],{},"immer approved","."," Standard-sudo hat ein ",[18,90,91],{},"timestamp_timeout"," von 5 bis 15 Minuten. Für interaktive Menschen ist das bequem. Für einen Agent, der theoretisch im Sekundentakt Commands absetzen könnte, bedeutet es: ein einziges approved Kommando genügt, und der komplette Zeitraum danach ist offen.",[11,94,95,96,99,100,103],{},"Zusammen ergibt das: ",[18,97,98],{},"NOPASSWD"," ist nicht eine ",[38,101,102],{},"etwas schwächere"," Variante von richtigem sudo. Es ist kategorial etwas anderes. Es gibt den User auf als Sicherheitsgrenze.",[30,105,107],{"id":106},"was-sudo-annimmt-und-warum-diese-annahmen-bei-agents-brechen","Was sudo annimmt, und warum diese Annahmen bei Agents brechen",[11,109,110,111,114],{},"sudo ist aus einer Welt gewachsen, in der ",[38,112,113],{},"der User"," vor dem Terminal sitzt und tippt. Drei Annahmen sind in dieses Design eingeschrieben:",[116,117,118,133,143],"ul",{},[119,120,121,124,125,128,129,132],"li",{},[59,122,123],{},"Der Invoker ist die authorisierte Person."," Das Passwort ist die Brücke zwischen ",[38,126,127],{},"Körper vor Tastatur"," und ",[38,130,131],{},"Eintrag in /etc/passwd",". Wenn der Invoker ein Prozess ohne Gedächtnis ist, gibt es keine solche Brücke. Ein Prozess kann ein Passwort halten, aber das Halten ist keine Authentifizierung — es ist nur Speicherung.",[119,134,135,138,139,142],{},[59,136,137],{},"Cache-Optimierung ist gut."," Stimmt für interaktive Menschen, die im Laufe einer Admin-Session mehrere Kommandos absetzen und nicht jedes Mal ihr Passwort wiederholen wollen. Ist katastrophal für Agents, für die ",[38,140,141],{},"\"mehrere Kommandos hintereinander\""," der Normalfall ist und genau die Situation, die nicht-pauschal approved werden sollte.",[119,144,145,148,149,151],{},[59,146,147],{},"Policy ist zur Konfigurationszeit entscheidbar."," Stimmt für Admin-Workflows mit bekannter Rollen-Matrix. Stimmt nicht für Agent-Workflows, die per Definition unvorhersehbar sind — niemand weiß um 14:32, welches Kommando um 14:37 nötig sein wird, also kann niemand es um 14:00 vorab in ",[18,150,44],{}," schreiben.",[11,153,154],{},"Die drei Annahmen sind nicht falsch — sie sind für eine andere Welt gebaut. Die Welt der Menschen. Wenn man sie unverändert für Agents übernimmt, übernimmt man implizit das Vertrauensmodell der Menschen-Welt, ohne die Feedback-Schleifen, die es in der Menschen-Welt tragfähig machen (Sozialdruck, Auditierbarkeit auf Person, Gedächtnis).",[30,156,158],{"id":157},"die-inversion","Die Inversion",[11,160,161,162,165],{},"Ich brauchte also einen Mechanismus, der die Frage ",[38,163,164],{},"\"darf dieser Prozess jetzt gerade diesen einen Befehl als root ausführen?\""," live beantwortet — nicht vorab, nicht gecacht, sondern einmalig pro Kommando, und nicht vom Agent selbst, sondern von einem Menschen.",[11,167,168,169,172,173],{},"Das Ding, das ich dafür gebaut habe, heißt ",[18,170,171],{},"escapes",". Es ist ein setuid-root Binary, geschrieben in Rust, liegt öffentlich auf GitHub und hat genau eine Aufgabe: ",[38,174,175],{},"Einen Command mit elevated privileges ausführen, aber nur, wenn ein signierter Grant-Token aus einem OpenApe-IdP vorliegt, der für genau dieses Kommando, auf genau dieser Maschine, genau einmal gültig ist.",[177,178,179],"blockquote",{},[11,180,181],{},"Die harte Grenze bleibt hart. Nur der Übertritt wird protokolliert.",[11,183,184,185,188,189,192,193,196],{},"Der Agent-User bekommt ",[59,186,187],{},"nichts"," dazu. Er ist weiter unprivilegiert. Er hat weiter keinen Eintrag in ",[18,190,191],{},"sudoers",". Was er bekommt, ist die Möglichkeit, einen Grant zu ",[38,194,195],{},"requesten"," — und wenn ich als Approver zustimme, dann ist für genau einen Bruchteil der Zeit, für genau einen Command, die Grenze offen. Nicht der User wird approved, sondern der Crossing.",[30,198,200],{"id":199},"der-konkrete-flow","Der konkrete Flow",[11,202,203,204,207],{},"Hier ist, was passiert, wenn openclaw heute ",[18,205,206],{},"whoami"," als root ausführen will.",[11,209,210],{},"Der Agent ruft:",[212,213,218],"pre",{"className":214,"code":216,"language":217},[215],"language-text","apes run --as root -- whoami\n","text",[18,219,216],{"__ignoreMap":220},"",[11,222,223,224,227,228,231,232,235],{},"Ein einziger Command. Kein ",[18,225,226],{},"sudo",". Kein Passwort-Prompt. Keine bestehende Session. Die CLI ",[18,229,230],{},"apes"," sieht das ",[18,233,234],{},"--as root"," Flag und schaltet auf den escapes-Audience-Flow um. Sie erstellt einen Grant-Request am IdP mit einer Payload in dieser Form:",[212,237,241],{"className":238,"code":239,"language":240,"meta":220,"style":220},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"audience\": \"escapes\",\n  \"target_host\": \"mini.local\",\n  \"command\": [\"whoami\"],\n  \"decided_by\": \"patrick@hofmann.eco\"\n}\n","json",[18,242,243,252,279,300,324,344],{"__ignoreMap":220},[244,245,248],"span",{"class":246,"line":247},"line",1,[244,249,251],{"class":250},"sMK4o","{\n",[244,253,255,258,262,265,268,271,274,276],{"class":246,"line":254},2,[244,256,257],{"class":250},"  \"",[244,259,261],{"class":260},"spNyl","audience",[244,263,264],{"class":250},"\"",[244,266,267],{"class":250},":",[244,269,270],{"class":250}," \"",[244,272,171],{"class":273},"sfazB",[244,275,264],{"class":250},[244,277,278],{"class":250},",\n",[244,280,282,284,287,289,291,293,296,298],{"class":246,"line":281},3,[244,283,257],{"class":250},[244,285,286],{"class":260},"target_host",[244,288,264],{"class":250},[244,290,267],{"class":250},[244,292,270],{"class":250},[244,294,295],{"class":273},"mini.local",[244,297,264],{"class":250},[244,299,278],{"class":250},[244,301,303,305,308,310,312,315,317,319,321],{"class":246,"line":302},4,[244,304,257],{"class":250},[244,306,307],{"class":260},"command",[244,309,264],{"class":250},[244,311,267],{"class":250},[244,313,314],{"class":250}," [",[244,316,264],{"class":250},[244,318,206],{"class":273},[244,320,264],{"class":250},[244,322,323],{"class":250},"],\n",[244,325,327,329,332,334,336,338,341],{"class":246,"line":326},5,[244,328,257],{"class":250},[244,330,331],{"class":260},"decided_by",[244,333,264],{"class":250},[244,335,267],{"class":250},[244,337,270],{"class":250},[244,339,340],{"class":273},"patrick@hofmann.eco",[244,342,343],{"class":250},"\"\n",[244,345,347],{"class":246,"line":346},6,[244,348,349],{"class":250},"}\n",[11,351,352],{},"Der IdP schickt diesen Request an mich zur Approval. In der Browser-UI sehe ich den vollständigen Command, den Ziel-Host, den Agent, und die Approve/Deny-Buttons. Ich entscheide.",[11,354,355,360],{},[356,357],"img",{"alt":358,"src":359},"Browser-Approval-Screen: Permission Request mit Command whoami, Target MinivonPatrick.fritz.box, Run as root, Approval Type Once — Approve und Deny Buttons","https://sos-at-vie-2.exo.io/dm-public/blog/2026-04-21/escapes-approval-screen.png"," Wenn ich approve, signiert mein Passkey den Grant, der IdP gibt ein JWT zurück, die CLI nimmt das JWT und ruft:",[212,362,365],{"className":363,"code":364,"language":217},[215],"escapes --grant \u003Cjwt> -- whoami\n",[18,366,364],{"__ignoreMap":220},[11,368,369,371],{},[18,370,171],{}," läuft mit Effective UID 0 (setuid-Bit), verifiziert sieben Eigenschaften des Grants bevor es überhaupt daran denkt, irgendetwas auszuführen:",[373,374,375,385,391,403,416,429,438],"ol",{},[119,376,377,380,381,384],{},[59,378,379],{},"Issuer"," ist in ",[18,382,383],{},"allowed_issuers"," — nur JWKS dieser IdPs werden gefetcht",[119,386,387,390],{},[59,388,389],{},"JWT-Signatur"," ist gültig gegen die JWKS",[119,392,393,380,396,399,400,402],{},[59,394,395],{},"Approver",[18,397,398],{},"allowed_approvers"," (das ist die Entsprechung zu ",[18,401,191],{}," — aber für Menschen, nicht für Prozesse)",[119,404,405,380,408,411,412,415],{},[59,406,407],{},"Audience",[18,409,410],{},"allowed_audiences"," (Default: ",[18,413,414],{},"[\"escapes\"]",")",[119,417,418,422,423,425,426],{},[59,419,420],{},[18,421,286],{}," matched den tatsächlichen Hostnamen dieser Maschine — ein Grant für ",[18,424,295],{}," funktioniert nicht auf ",[18,427,428],{},"server01",[119,430,431,437],{},[59,432,433,434],{},"Command / ",[18,435,436],{},"cmd_hash"," matched exakt den tatsächlich übergebenen Command",[119,439,440,446],{},[59,441,442,443],{},"IdP ",[18,444,445],{},"/consume"," bestätigt: dieses Grant-Token wurde noch nie eingelöst — Replay-Schutz",[11,448,449,450,452,453,456,457,460,461,464,465,87],{},"Erst wenn alle sieben Checks grün sind, sanitized ",[18,451,171],{}," das Environment (weg mit ",[18,454,455],{},"LD_PRELOAD",", ",[18,458,459],{},"PATH"," auf Default, etc.) und ruft ",[18,462,463],{},"execvp(\"whoami\", [])",". Der Command läuft als root, genau einmal, sieht genau die argv, die ich approved habe, auf der Maschine, auf der ich approved habe, und schreibt einen vollständigen Audit-Log-Eintrag in ",[18,466,467],{},"/var/log/openape/audit.log",[11,469,470],{},"Nach dem Exit ist die Sache vorbei. Der Grant ist consumed. Wenn der Agent zwei Minuten später ein weiteres root-Kommando braucht, fängt der ganze Tanz wieder von vorne an. Keine Cache. Kein Timestamp. Kein Rest-Vertrauen.",[30,472,474],{"id":473},"sudoers-ist-leer-geblieben","sudoers ist leer geblieben",[11,476,477,478,480,481,484,485,487],{},"Während ich diese Serie schreibe, habe ich mir die ",[18,479,226],{},"-History angeschaut, um zu sehen wann und wofür ich auf meinem Mini-PC in den letzten Wochen ",[38,482,483],{},"manuell"," sudo verwendet habe. Und um zu prüfen, dass der ",[18,486,20],{},"-User tatsächlich leer durch jede Zeile geht.",[11,489,490],{},[356,491],{"alt":492,"src":493},"Terminal-Screenshot: Überprüfung von /etc/sudoers und /etc/sudoers.d/ — der openclaw-Benutzer taucht nirgendwo auf; gleichzeitig sieht man zwei kürzlich ausgeführte escapes-Kommandos mit verschiedenen Grant-IDs, die beide regulär approved und audited wurden","https://sos-at-vie-2.exo.io/dm-public/blog/TBD-escapes/sudoers-two-grants.png",[11,495,496,497,499,500,503],{},"Das ist der Punkt, auf den es ankommt. Die ",[18,498,191],{},"-Konfiguration dieser Maschine hat sich durch den gesamten Prozess ",[59,501,502],{},"nicht verändert",". Kein neuer Eintrag. Kein NOPASSWD. Kein privilegierter User. Was sich geändert hat, ist dass es einen zweiten Pfad gibt — nicht durch sudo, sondern neben sudo — auf dem Commands per Grant statt per Passwort elevated werden können. sudo bleibt wofür es gedacht war: interaktive Menschen, die am Terminal sitzen und tippen. escapes übernimmt den Agent-Fall, den sudo nie modelliert hat.",[30,505,507],{"id":506},"der-kategorische-unterschied","Der kategorische Unterschied",[11,509,510,511,514],{},"Die Frage, die unter meinem ape-shell-Post kam: ",[38,512,513],{},"\"Geht das nicht auch einfacher? Sudoers mit Command-Whitelisting?\""," Die Antwort ist nein, und der Unterschied ist nicht graduell. Er ist strukturell:",[516,517,518,533],"table",{},[519,520,521],"thead",{},[522,523,524,528,531],"tr",{},[525,526,527],"th",{},"Achse",[525,529,530],{},"sudo (mit NOPASSWD)",[525,532,171],{},[534,535,536,552,565,581,596,612],"tbody",{},[522,537,538,544,549],{},[539,540,541],"td",{},[59,542,543],{},"Wann ist die Policy entschieden?",[539,545,546,547],{},"Zur Konfigurationszeit, statisch in ",[18,548,24],{},[539,550,551],{},"Zur Laufzeit, pro Kommando, fresh",[522,553,554,559,562],{},[539,555,556],{},[59,557,558],{},"Wer entscheidet?",[539,560,561],{},"Der Invoker — also der Agent selbst",[539,563,564],{},"Ein separater Approver, vom Invoker getrennt",[522,566,567,572,575],{},[539,568,569],{},[59,570,571],{},"Credential-Lifetime",[539,573,574],{},"Cache, 5-15 Minuten Standard",[539,576,577,578,580],{},"Single-use JWT, ",[18,579,445],{}," sperrt Replay",[522,582,583,588,591],{},[539,584,585],{},[59,586,587],{},"Command-Binding",[539,589,590],{},"Path-Prefix Matching (notorisch leaky)",[539,592,593,595],{},[18,594,436],{}," im signierten JWT",[522,597,598,603,609],{},[539,599,600],{},[59,601,602],{},"Host-Binding",[539,604,605,606],{},"Statisch in ",[18,607,608],{},"Host_Alias",[539,610,611],{},"Kryptographisch im JWT verankert",[522,613,614,619,622],{},[539,615,616],{},[59,617,618],{},"Audit",[539,620,621],{},"Lokal, oft nicht aggregiert",[539,623,624,625,456,628,456,631,456,633,456,636],{},"JSONL mit ",[18,626,627],{},"grant_id",[18,629,630],{},"approver",[18,632,436],{},[18,634,635],{},"issuer",[18,637,286],{},[11,639,640],{},"Jede einzelne Zeile ist ein Vertrauens-Delegations-Punkt, den sudo an die Konfigurationszeit verlagert und escapes an die Laufzeit. Diese Verlagerung ist der eigentliche Inhalt. Alles andere — das Rust-Binary, das JWT, die sieben Checks — sind die Mechanismen, mit denen die Verlagerung technisch umgesetzt wird.",[30,642,644],{"id":643},"mensch-und-agent-sind-auf-protokoll-ebene-gleich","Mensch und Agent sind auf Protokoll-Ebene gleich",[11,646,647,648,651],{},"Ein Nebeneffekt, der mir erst im Bauen klar wurde: ich benutze ",[18,649,650],{},"apes run --as root --"," jetzt auch für mich selbst. Wenn ich auf einem der Hosts, die meinem Team gehören, ein privilegiertes Kommando brauche, tippe ich denselben Command, den mein Agent tippen würde. Derselbe Flow. Dieselbe Grant-Anfrage. Derselbe Approval-Schritt.",[11,653,654,655,658,659,662,663,665],{},"Der einzige Unterschied: wenn ",[38,656,657],{},"ich"," das Kommando anstoße, ist der Approver ein Team-Kollege. Wenn der ",[38,660,661],{},"Agent"," es anstößt, bin ich der Approver. Gleiche Infrastruktur, andere Rolle. Das ist nicht zufällig so. Es ist das Prinzip ",[38,664,644],{},", aus dem die ganze OpenApe-Story herkommt, konkret angewandt auf den Privilegien-Layer.",[11,667,668,669,672],{},"Die Konsequenz ist, dass escapes kein Agent-Spezial-Tool ist. Es ist allgemeine Infrastruktur, die nebenbei auch von Agents benutzt werden kann. Dieselbe Gleichbehandlung, die OpenApe beim Login-Flow in den Vordergrund gestellt hat (",[38,670,671],{},"\"der Mensch hat eine Session, der Agent hat eine Session — die Infrastruktur weiß nicht, welcher ist welcher\"","), wiederholt sich hier beim Elevation-Flow.",[30,674,676],{"id":675},"was-das-kostet","Was das kostet",[11,678,679,680,683],{},"Wer im Grant-System arbeitet, wartet auf Menschen. Wenn openclaw um 3 Uhr nachts entscheidet, dass er ein privilegiertes Kommando braucht, dann wartet er. Er weckt mich nicht auf. Er fährt nicht fort ohne mich. Das gilt nicht nur für escapes, das gilt für jeden Grant im gesamten OpenApe-Stack, solange sich der Agent am Rand von dem bewegt was er darf. ",[38,681,682],{},"Ask first"," ist der ganze Punkt. Aber es ist Reibung, und wer diese Reibung nicht will, ist hier falsch.",[11,685,686,687,689],{},"Es braucht Infrastruktur. Ohne einen laufenden OpenApe-kompatiblen Identity Provider funktioniert nichts — jemand muss die Signatur-Keys halten, die JWKS veröffentlichen, ",[18,688,445],{}," als Replay-Schutz fahren. Kein IdP, kein escapes.",[11,691,692,693,695],{},"Und escapes ist Vibe-Coded Software. Das Sicherheits-Konzept dahinter ist das, was zählt — nicht ob mein Rust-Code fehlerfrei ist. ",[18,694,226],{}," hat über 40 Jahre Open-Source-Audit-Zeit hinter sich. escapes hat wahrscheinlich Bugs, und Linus Torvalds würde mir da vermutlich recht geben. Der Code ist klein, MIT-lizenziert, und auf GitHub — wer es produktiv einsetzen will, soll es sich vorher ansehen.",[30,697,699],{"id":698},"wie-man-anfängt","Wie man anfängt",[212,701,704],{"className":702,"code":703,"language":217},[215],"cargo install openape-escapes\n",[18,705,703],{"__ignoreMap":220},[11,707,708],{},"Dann das Binary privilegieren — entweder via Linux Capabilities:",[212,710,713],{"className":711,"code":712,"language":217},[215],"sudo setcap cap_setuid+ep $(which escapes)\n",[18,714,712],{"__ignoreMap":220},[11,716,717],{},"Oder klassisch via setuid-Bit:",[212,719,722],{"className":720,"code":721,"language":217},[215],"sudo chown root:root $(which escapes) && sudo chmod u+s $(which escapes)\n",[18,723,721],{"__ignoreMap":220},[11,725,726,727,730],{},"Dann die Trust-Beziehung einrichten — ",[18,728,729],{},"/etc/openape/config.toml"," definiert, welchem IdP escapes vertraut und wer Grants approven darf:",[212,732,736],{"className":733,"code":734,"language":735,"meta":220,"style":220},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[security]\nallowed_issuers = [\"https://id.openape.at\"]\nallowed_approvers = [\"patrick@hofmann.eco\"]\n","toml",[18,737,738,743,748],{"__ignoreMap":220},[244,739,740],{"class":246,"line":247},[244,741,742],{},"[security]\n",[244,744,745],{"class":246,"line":254},[244,746,747],{},"allowed_issuers = [\"https://id.openape.at\"]\n",[244,749,750],{"class":246,"line":281},[244,751,752],{},"allowed_approvers = [\"patrick@hofmann.eco\"]\n",[11,754,755,756,758,759,761],{},"Zwei Zeilen. ",[18,757,383],{}," ist die Liste der IdPs deren JWKS akzeptiert werden. ",[18,760,398],{}," ist das Äquivalent zu sudoers — aber für Menschen, nicht für Prozesse. Alles andere hat sinnvolle Defaults.",[11,763,764,765,767],{},"Dann ",[18,766,230],{}," installieren, einen IdP konfigurieren, und als erstes Kommando:",[212,769,771],{"className":770,"code":216,"language":217},[215],[18,772,216],{"__ignoreMap":220},[11,774,775],{},"Wenn alles richtig aufgesetzt ist, bekommst du einen Approval-Request im Browser, approvst, und siehst:",[212,777,780],{"className":778,"code":779,"language":217},[215],"root\n",[18,781,779],{"__ignoreMap":220},[11,783,784],{},[356,785],{"alt":786,"src":787},"Telegram-Chat: der Agent führt whoami als root aus — ein Grant wird angefordert, nach Approval kommt die Antwort: root","https://sos-at-vie-2.exo.io/dm-public/blog/2026-04-21/escapes-whoami-root.png",[11,789,790,791,794],{},"Das ist alles. Ein Wort. Und dahinter stehen sieben Verifikations-Schritte, ein signierter JWT, ein Audit-Log-Eintrag, und ein ausdrücklich zustimmender Mensch. Derselbe Output wie bei ",[18,792,793],{},"sudo whoami",", aber ein fundamental anderes Vertrauensmodell.",[30,796,798],{"id":797},"warum-das-für-mich-das-richtige-muster-ist","Warum das für mich das richtige Muster ist",[11,800,801,802,805],{},"Ich habe in den letzten Wochen mehrere Layer von OpenApe öffentlich gebaut — Identity, ape-shell, Claude Grant Gate, jetzt escapes. Jeder einzelne Layer ist eine Variation auf dieselbe These: ",[38,803,804],{},"Infrastructure over Instructions",". Nicht der Agent wird gebeten, sich an Regeln zu halten. Die Umgebung lässt Regelverletzungen strukturell nicht zu.",[11,807,808],{},"escapes ist der Layer, auf dem das am deutlichsten wird, weil er am meisten wehtut, wenn man es falsch macht. Wer einem Agent root gibt, hat effektiv die Maschine abgegeben. Wer einem Agent einen Single-Use-Grant gibt, hat nur diese eine Operation abgegeben. Der Unterschied ist alles.",[11,810,181],{},[11,812,813,814,817],{},"Und ja — ",[18,815,816],{},"cat /etc/shadow"," geht auch. Audit. Denied.",[819,820],"hr",{},[11,822,823],{},[38,824,825,828,829,836,837,842,843,848],{},[18,826,827],{},"openape-escapes@0.4.0"," ist auf ",[830,831,835],"a",{"href":832,"rel":833},"https://crates.io/crates/openape-escapes",[834],"nofollow","crates.io"," und auf ",[830,838,841],{"href":839,"rel":840},"https://github.com/openape-ai/escapes",[834],"GitHub"," verfügbar, MIT-lizenziert. Die ",[830,844,847],{"href":845,"rel":846},"https://www.delta-mind.at/de/blog",[834],"vorigen Artikel dieser Serie"," erzählen wie OpenApe, ape-shell, und die Grant-Integration dahinter entstanden sind.",[850,851,852],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":220,"searchDepth":254,"depth":254,"links":854},[855,856,857,858,859,860,861,862,863,864],{"id":32,"depth":254,"text":33},{"id":106,"depth":254,"text":107},{"id":157,"depth":254,"text":158},{"id":199,"depth":254,"text":200},{"id":473,"depth":254,"text":474},{"id":506,"depth":254,"text":507},{"id":643,"depth":254,"text":644},{"id":675,"depth":254,"text":676},{"id":698,"depth":254,"text":699},{"id":797,"depth":254,"text":798},"2026-04-17","Mein Agent will einen Befehl als root ausführen. Er hat keinen sudo-Eintrag, kein Passwort, nichts in /etc/sudoers. Das ist Absicht. Hier ist der Weg, den ich gebaut habe, damit er trotzdem genau ein Kommando ausführen kann — approved von einem Menschen, auditiert, nicht cachebar, nicht wiederverwendbar.",false,"md",null,{},true,"/blog/de/heute-soll-der-agent-tun-was-er-nicht-darf",{"title":5,"description":866},"blog/de/heute-soll-der-agent-tun-was-er-nicht-darf",[876,171,877,878,879,880],"OpenApe","AI Agents","Infrastructure","Security","Building in Public","todays-agent-forbidden-action","cb6HTOESsmBv88HaA4izXlPnS6dJ8jeMlhn8wS66otw",{"de":884,"en":885},"/de/blog/heute-soll-der-agent-tun-was-er-nicht-darf","/en/blog/today-the-agent-does-what-he-isnt-allowed-to",1776970806600]