Nur, was auf der Liste steht
Eine Positivliste nennt genau die Befehle und Pfade, die ein Agent benutzen darf. Alles, was nicht auf der Liste steht, wird abgelehnt.
Das ist wichtig, weil ein Agent, der Befehle ausführen kann, auch den falschen ausführen kann. Eine Liste des Erlaubten ist kurz und prüfbar. Eine Liste des Verbotenen wird nie fertig.
Am Ende dieser Lektion
Notiz
Ich kann genau festlegen, welche Befehle und Pfade ein Agent benutzen darf.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Positivliste | eine Liste dessen, was erlaubt ist, und sonst nichts | |
| Richtlinie | die schriftlichen Regeln für einen Agenten | |
| Argument | ein Wort, das einem Befehl mitgegeben wird | quellen/app.js |
| Option | ein Argument, das mit einem Bindestrich beginnt | -l |
| Ablehnung | eine Antwort, die Nein sagt und den Grund nennt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Richtlinie sagt, was erlaubt ist
Die Richtlinie nennt für jeden Befehl die Pfade und Optionen, die er benutzen darf. Eine Anfrage besteht aus einem Befehl und einigen Argumenten.
Prüfen Sie der Reihe nach. Steht der Befehl auf der Liste? Steht jede Option auf ihrer Liste? Beginnt jeder Pfad mit einem erlaubten Ordner? Der erste Fehler ist die Antwort.
Durchgerechnetes Beispiel: fünf Anfragen
| Anfrage | Antwort | Grund |
|---|---|---|
| ls -l quellen/ | Erlaubt | Befehl, Option und Pfad stehen auf der Liste |
| rm -rf quellen/ | Abgelehnt | rm steht nicht auf der Liste |
| cat /etc/passwd | Abgelehnt | Der Pfad beginnt mit keinem der Ordner |
| grep -r quellen/app.js | Abgelehnt | Die Option -r ist für grep nicht erlaubt |
| cat quellen/notizen.txt | Erlaubt | Der Pfad beginnt mit quellen/ |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Pfad, der mit quellen/ beginnt, sei sicher. Das stimmt nicht. Der Pfad quellen/../.env beginnt mit quellen/ und zeigt doch nach draußen. Ein Anfangstest prüft nur, womit ein Pfad beginnt, und ist darum nur ein erster Schritt. Lektion 2 prüft, wohin ein Pfad wirklich führt.
Eine Ablehnung nennt den Grund
Eine Ablehnung, die nur Nein sagt, lässt den Agenten raten. Vielleicht versucht er es dann mit einer noch schlechteren Idee.
Sagen Sie, welcher Teil gescheitert ist: der Befehl, die Option oder der Pfad. Der Agent kann dann einen erlaubten Befehl versuchen, und wer das Protokoll liest, sieht, was schiefging.
Die Modellhilfe schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > 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.
Die Modellhilfe schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '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 || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' '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.
Die Positivliste schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const richtlinie = {' ' ls: { pfade: [\"quellen/\", \"doku/\"], optionen: [\"-l\"] },' ' cat: { pfade: [\"quellen/\", \"doku/\"], optionen: [] },' ' grep: { pfade: [\"quellen/\"], optionen: [\"-n\", \"-i\"] },' '};' > liste.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 Positivliste schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function entscheiden(anfrage) {' ' const regel = richtlinie[anfrage.befehl];' ' if (regel === undefined) return \"abgelehnt: Befehl nicht auf der Liste\";' ' for (const a of anfrage.args) {' ' if (a.startsWith(\"-\")) {' ' if (regel.optionen.indexOf(a) < 0) return \"abgelehnt: Option \" + a + \" nicht erlaubt\";' ' } else if (regel.pfade.some(function (p) { return a.startsWith(p); }) === false) {' ' return \"abgelehnt: Pfad \" + a + \" nicht erlaubt\";' ' }' ' }' ' return \"erlaubt\";' '}' >> liste.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 Positivliste schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const anfragen = [' ' { befehl: \"ls\", args: [\"-l\", \"quellen/\"] },' ' { befehl: \"rm\", args: [\"-rf\", \"quellen/\"] },' ' { befehl: \"cat\", args: [\"/etc/passwd\"] },' ' { befehl: \"grep\", args: [\"-r\", \"quellen/app.js\"] },' ' { befehl: \"cat\", args: [\"quellen/../.env\"] },' '];' 'async function main() {' ' anfragen.forEach(function (a) { console.log(a.befehl + \" \" + a.args.join(\" \") + \" -> \" + entscheiden(a)); });' ' const q = \"Schreiben Sie in einem kurzen Satz, warum eine Liste erlaubter Befehle sicherer ist als eine Liste verbotener.\";' ' const probe = \"Man kann nicht jeden schlechten Befehl vorhersehen, aber die wenigen guten lassen sich aufzählen.\";' ' const antwort = await fragen([{ role: \"user\", content: q }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> liste.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 Positivliste ausführen
docker exec -w /home/node/project agent node liste.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 der Run ausgibt
| Zeile | Was sie zeigt |
|---|---|
| ls -l quellen/ -> erlaubt | Befehl, Option und Pfad stehen auf der Liste |
| rm -rf quellen/ -> abgelehnt: Befehl nicht auf der Liste | Die erste Prüfung scheiterte |
| cat /etc/passwd -> abgelehnt: Pfad ... | Der Pfad liegt außerhalb der Ordner |
| grep -r quellen/app.js -> abgelehnt: Option -r ... | Die Option steht nicht auf der Liste |
| cat quellen/../.env -> erlaubt | Die Lücke: ein Anfangstest lässt sich täuschen |
| Das Modell sagte: ... | Ein Satz. Die Worte ändern sich bei jedem Lauf oder zeigen Aufgezeichnete Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.