Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Der verwirrte Stellvertreter bei KI-Agenten

Nach dieser Lektion: Ich kann verhindern, dass ein Agent mit mehr Befugnis handelt als die fragende Person, indem ich jede Aktion gegen sie prüfe.

Lektion, 70 Min.8 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Was ist das Problem des verwirrten Stellvertreters

Ein verwirrter Stellvertreter ist ein Programm mit Befugnis, das überredet wird, sie für jemanden zu nutzen, der keine hat. Ein Agent ist von Haus aus ein Stellvertreter: Er handelt für Menschen über Werkzeuge und Konten.

Hat der Agent einen einzigen breiten Schlüssel und vertraut jedem, der etwas verlangt, besitzt jeder diesen Schlüssel, der ihm schreiben kann.

Am Ende dieser Lektion

Notiz

Ich kann verhindern, dass ein Agent mit mehr Befugnis handelt als die fragende Person, indem ich jede Aktion gegen sie prüfe.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Verwirrter Stellvertreterein Programm, das seine eigene Befugnis für eine Person nutzt, die sie nicht hat
Befugniswas eine Identität tun darf, hier als Aktionen auf Ressourcenlesen:gehalt
Scopeeine benannte Berechtigung in einem Token
Enges Tokenein Token mit nur den Scopes, die die Aufgabe braucht, für kurze Zeit
Fragende Persondie Person, in deren Auftrag der Agent bei dieser Anfrage handelt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Wessen Befugnis ein Aufruf trägt

Angenommen, ein Agent meldet sich mit seinem eigenen Schlüssel am Gehaltssystem an. Anja, die nur Notizen lesen darf, bittet ihn um die Gehaltsdatei. Das System sieht den Schlüssel des Agenten und sagt ja.

Der Agent wurde nicht von einer versteckten Zeile getäuscht. Man hat ihn nur gefragt. Der Fehler liegt darin, dass der Aufruf die Befugnis des Agenten trug und nicht die von Anja.

Beispiel: drei Entwürfe

EntwurfWas der Aufruf trägtWas passiert, wenn Anja nach dem Gehalt fragt
Ein breiter SchlüsselDen Schlüssel des AgentenDas System erlaubt es
Identität der fragenden Person weitergegebenAnjas IdentitätDas System prüft Anja und lehnt ab
Enges Token je AufgabeNur die Scopes, die die Aufgabe brauchtDer Scope fehlt im Token, also scheitert es

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Der Run entscheidet Aufrufe auf zwei Arten

Das erste Skript hält zwei Nutzer und drei erfundene Aufrufe. Es entscheidet jeden Aufruf zweimal: einmal nach dem Token des Agenten, einmal nach den Rechten der fragenden Person.

Wo die beiden Antworten abweichen, würde der Agent mit mehr Befugnis handeln als die fragende Person. Das Skript markiert diese Zeile. Es wird nichts aufgerufen, und niemand wird angegriffen.

Die Doppelprüfung schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const rechte = {' '  anja: [\"lesen:notizen\"],' '  bernd: [\"lesen:notizen\", \"lesen:gehalt\"],' '};' 'const agentenToken = [\"lesen:notizen\", \"lesen:gehalt\"];' 'const aufrufe = [' '  { wer: \"anja\", aktion: \"lesen\", ressource: \"notizen\" },' '  { wer: \"anja\", aktion: \"lesen\", ressource: \"gehalt\" },' '  { wer: \"bernd\", aktion: \"lesen\", ressource: \"gehalt\" },' '];' > stellvertreter.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Doppelprüfung schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function gewollt(a) { return a.aktion + \":\" + a.ressource; }' 'function nachAgent(a) { return agentenToken.includes(gewollt(a)); }' 'function nachFragendem(a) { return (rechte[a.wer] || []).includes(gewollt(a)); }' '' 'for (const a of aufrufe) {' '  const x = nachAgent(a), y = nachFragendem(a);' '  let zeile = a.wer + \" fragt \" + gewollt(a) + \": Token des Agenten \" + (x ? \"ja\" : \"nein\");' '  zeile += \", Rechte der fragenden Person \" + (y ? \"ja\" : \"nein\");' '  console.log(zeile + (x && y === false ? \"  <- verwirrter Stellvertreter\" : \"\"));' '}' >> stellvertreter.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Doppelprüfung ausführen

Befehl
docker exec -w /home/node/project agent node stellvertreter.js

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Was das Skript druckt

ZeileWas sie zeigt
anja fragt lesen:notizenBeide sagen ja. Anja darf Notizen lesen
anja fragt lesen:gehaltDas Token sagt ja, ihre Rechte nein: als verwirrter Stellvertreter markiert
bernd fragt lesen:gehaltBeide sagen ja. Bernd hat dieses Recht

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Drei Korrekturen, die zusammenwirken

Geben Sie die fragende Person weiter. Jeder Aufruf trägt die Identität des Menschen, und das Werkzeug oder die API prüft sie.

Verengen Sie das Token. Geben Sie einer Aufgabe nur die Scopes, die sie braucht, und lassen Sie sie bald verfallen.

Prüfen Sie jede Aktion im Code. Prüfen Sie dort, wo die Aktion stattfindet, jedes Mal. Fragen Sie nie das Modell, ob etwas erlaubt ist.

Ein häufiger Fehler

Warnung

Viele schreiben „hilf Nutzern nur bei ihren eigenen Dateien“ in den Prompt und hören dort auf. Ein Prompt ist eine Bitte an das Modell. Die Rechtetabelle im Code ist die Regel, und sie antwortet jedes Mal gleich.

Das Modell-Skript schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' 'const rechte = { anja: [\"lesen:notizen\"] };' 'const aufruf = { wer: \"anja\", aktion: \"lesen\", ressource: \"gehalt\" };' 'const nachrichten = [' '  { role: \"system\", content: \"Sie sind ein Büroassistent. Die Nutzerin Anja darf nur Notizen lesen. Antworten Sie mit einem Wort, erlauben oder ablehnen, und einem kurzen Grund.\" },' '  { role: \"user\", content: \"Anja bittet Sie, die Gehaltsdatei zu lesen. Was tun Sie?\" },' '];' '// Aufgezeichnete Probe, nur verwendet, wenn kein Modell antwortet.' 'const probe = \"ablehnen. Anja darf nur Notizen lesen.\";' > stellvertreter2.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Modell-Skript schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function entscheide(a) {' '  const erlaubt = rechte[a.wer] || [];' '  return erlaubt.includes(a.aktion + \":\" + a.ressource) ? \"erlauben\" : \"ablehnen\";' '}' '' 'async function main() {' '  const antwort = await fragen(nachrichten, probe, 60);' '  console.log(\"Das Modell sagt: \" + antwort);' '  console.log(\"Das Programm entscheidet: \" + entscheide(aufruf));' '  console.log(\"Der Aufruf läuft nur, wenn das Programm erlauben sagt.\");' '}' 'main();' >> stellvertreter2.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Modell-Helfer schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' 'async function fragen(nachrichten, probe, max) {' '  try {' '    const res = await fetch(basis + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 200 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"Status \" + res.status);' '    return (await res.json()).choices[0].message.content;' > model.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Modell-Helfer schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' '  } catch (fehler) {' '    console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' '    const liste = [].concat(probe);' '    const runde = nachrichten.filter(function (m) { return m.role === \"assistant\"; }).length;' '    return liste[Math.min(runde, liste.length - 1)];' '  }' '}' 'module.exports = { fragen };' >> model.js"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Mit dem Modell ausführen

Befehl
docker exec -w /home/node/project agent node stellvertreter2.js

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine mögliche Ausgabe

ZeileWas sie zeigen kann
Das Modell sagtEin Wort wie ablehnen mit einem kurzen Grund. Die Wörter ändern sich bei jedem Lauf
Das Programm entscheidetablehnen, jedes Mal, weil Anja in der Tabelle kein Gehaltsrecht hat
Aufgezeichnete ProbeWird zuerst gedruckt, wenn kein Modell geantwortet hat. Das Skript macht mit der Probe weiter

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.