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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Verwirrter Stellvertreter | ein Programm, das seine eigene Befugnis für eine Person nutzt, die sie nicht hat | |
| Befugnis | was eine Identität tun darf, hier als Aktionen auf Ressourcen | lesen:gehalt |
| Scope | eine benannte Berechtigung in einem Token | |
| Enges Token | ein Token mit nur den Scopes, die die Aufgabe braucht, für kurze Zeit | |
| Fragende Person | die 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
| Entwurf | Was der Aufruf trägt | Was passiert, wenn Anja nach dem Gehalt fragt |
|---|---|---|
| Ein breiter Schlüssel | Den Schlüssel des Agenten | Das System erlaubt es |
| Identität der fragenden Person weitergegeben | Anjas Identität | Das System prüft Anja und lehnt ab |
| Enges Token je Aufgabe | Nur die Scopes, die die Aufgabe braucht | Der 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
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
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
docker exec -w /home/node/project agent node stellvertreter.jsHier 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
| Zeile | Was sie zeigt |
|---|---|
| anja fragt lesen:notizen | Beide sagen ja. Anja darf Notizen lesen |
| anja fragt lesen:gehalt | Das Token sagt ja, ihre Rechte nein: als verwirrter Stellvertreter markiert |
| bernd fragt lesen:gehalt | Beide 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
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
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
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
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
docker exec -w /home/node/project agent node stellvertreter2.jsHier 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
| Zeile | Was sie zeigen kann |
|---|---|
| Das Modell sagt | Ein Wort wie ablehnen mit einem kurzen Grund. Die Wörter ändern sich bei jedem Lauf |
| Das Programm entscheidet | ablehnen, jedes Mal, weil Anja in der Tabelle kein Gehaltsrecht hat |
| Aufgezeichnete Probe | Wird 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.