Workban Guard

Alles, was Workban Guard prüft.

Jede Regel und jeder Detektor, direkt aus dem Code. Regeln prüfen jeden Befehl und Dateizugriff, bevor er läuft. Detektoren prüfen jede neue Zeile, nachdem sie geschrieben ist. Dazu kommt, was der Agent liest.

  • 39 Regeln
  • 33 Detektoren
  • 7 Regeln fürs Lesen
  • Läuft lokal

Vor der Ausführung

Prüft jeden Befehl und Dateizugriff. Sperrt heißt, die Aktion läuft nicht. Fragt nach heißt, du entscheidest.

Dateisystem

  • fs.rm-catastrophicSperrtLöschen oder Verschieben von /, Home, Systemverzeichnissen, dem Projekt selbst oder .git; Datenträger formatieren (mkfs, dd of=/dev/…, diskutil erase)
  • fs.rm-outsideFragt nachLöschen, Leeren oder Überschreiben außerhalb des Projekts (Temp-Verzeichnisse ausgenommen)
  • fs.rm-trackedFragt nachRekursives Löschen von Verzeichnissen mit versionierten Dateien oder unbekannten Zielen (rm -r, rsync --delete, tar --remove-files)
  • fs.find-deleteFragt nachfind -delete / find -exec rm außerhalb von Artefakt-Verzeichnissen

Git

  • git.discard-changesFragt nachreset --hard/--merge, checkout/restore von Dateien, clean -f, rm -f, stash drop/clear, branch -D/-f/-M
  • git.force-pushSperrtForce-Push oder --mirror auf geschützte Branches, Löschen geschützter Branches
  • git.force-push-branchFragt nachForce-Push (auch --force-with-lease) auf andere Branches
  • git.push-deleteFragt nachLöschen eines Remote-Branches, git push --prune
  • git.push-protectedSperrtDirekter Push auf main/master
  • git.no-verifySperrtHooks oder Signatur umgehen (--no-verify, -n, --no-gpg-sign, HUSKY=0, core.hooksPath)
  • git.amendFragt nachcommit --amend
  • git.history-rewriteFragt nachfilter-branch, filter-repo, reflog expire/delete, update-ref -d, gc --prune=now
  • git.add-envSperrtgit add von .env-, Schlüssel- oder Zugangsdaten-Dateien
  • git.commit-secretsSperrtgit commit, wenn die Änderungen Secrets enthalten

Datenbank

  • db.destructiveFragt nachsupabase db reset/migration down/storage rm, DROP/TRUNCATE/DROP COLUMN, DELETE/UPDATE ohne WHERE (auch per Datei, Umleitung oder Pipe), prisma migrate reset, drizzle-kit push --force, dropdb, flushall
  • db.remote-destructiveSperrtEntfernte Datenbank zurücksetzen oder löschen (supabase db reset/migration down --linked, projects delete, backups restore)
  • db.volume-wipeFragt nachdocker volume rm/prune, compose down -v, compose rm -v, podman system reset, supabase stop --no-backup
  • migration.edit-appliedFragt nachÄndern oder Löschen bestehender Migrationsdateien, supabase migration squash

Secrets

  • secrets.read-envSperrtLesen oder Hochladen von .env, Schlüsseln, ~/.ssh, ~/.aws/credentials (Read-Tool, Shell, Inline-Code, curl -F/-T, scp)
  • secrets.env-writeFragt nachSchreiben oder Leeren von .env-Dateien
  • secrets.write-literalSperrtEdit, der ein Secret-Literal (API-Key, Token, Private Key) in Code schreibt
  • secrets.printSperrtSecrets ausgeben: env/printenv ohne Namen, echo $TOKEN, gh auth token, supabase projects api-keys, op read, aws secretsmanager, security -w, kubectl get secret -o yaml …

Pakete

  • deps.not-foundSperrtPaket existiert nicht in npm/PyPI (halluziniert, „Slopsquatting“)
  • deps.typosquatFragt nachName liegt 1 bis 2 Zeichen neben einem der 5000 populärsten Pakete
  • deps.too-newFragt nachErste Version jünger als supplyChain.minAgeDays (14 Tage)
  • deps.low-adoptionFragt nachWeniger als supplyChain.minWeeklyDownloads (500) Downloads pro Woche (npm)
  • deps.install-scriptsHinweisPaket führt bei der Installation Skripte aus (preinstall/install/postinstall)
  • deps.deprecatedHinweisPaket bzw. Version ist als deprecated markiert

Deploys und Cloud

  • deploy.anyFragt nachDeploys und Releases: vercel --prod/env add, supabase db push/functions deploy/functions delete/config push, gh pr merge/repo edit --visibility, terraform apply, kubectl apply, npm publish …
  • remote.deleteFragt nachLöschen in Cloud-Diensten: aws s3 rm/rb/sync --delete, gsutil/gcloud storage rm, rclone purge/sync/delete, gh secret delete/api -X DELETE, vercel rm/env rm/domains rm, fly apps destroy …
  • container.destructiveFragt nachdocker/podman system/image/container prune, rm/rmi mit $(…)-Liste, compose down --rmi

System und Shell

  • net.pipe-to-shellFragt nachcurl/wget direkt in eine Shell oder einen Interpreter
  • sys.privilegedFragt nachsudo/doas, chmod 777, chown -R außerhalb des Projekts
  • sys.persistenceFragt nachSchreiben in Shell-Startdateien, ~/.ssh, LaunchAgents, /etc/sudoers; crontab, launchctl load
  • shell.unverifiedFragt nachNicht prüfbar: eval/source mit erst zur Laufzeit erzeugtem Code, unbekannte Ausgabe in eine Shell oder einen Interpreter gepipt, zu tief verschachtelt

Selbstschutz und Modi

  • self.protectSperrtÄnderungen an Workban-Guard-Config, -Zustand und installierten Plugins; wbg mode/approve/allow/trust/pause durch den Agenten
  • self.agent-configFragt nachÄnderungen an Claude-/Codex-Einstellungen (Hooks, Rechte), an .git/hooks und .git/config, git config core.fsmonitor/sshCommand
  • mode.plan-readonlySperrtIm Plan-Modus: Edits und verändernde Befehle (Plandateien ausgenommen)
  • mode.autopilot-outsideSperrtIm Autopilot: Schreiben außerhalb des Projekts (Temp ausgenommen)

Nach jedem Edit

Prüft nur neue Zeilen, nicht den Altbestand. Einen Fehler behebt der Agent, bevor er weitermacht. Ein Hinweis bleibt deine Entscheidung.

Sicherheit

  • sec.secret-literalFehlerSecret-Literal im Code (API-Keys, Tokens, Private Keys, Service-Role-JWT, DB-URL mit Passwort)
  • sec.evalFehlereval, new Function, vm.runIn… (JS) bzw. eval/exec (Python)
  • sec.shell-injectionFehlerShell-Befehle aus Template-Strings/Konkatenation, shell: true, shell=True, os.system(f"…")
  • sec.sql-concatFehlerSQL aus Template-Strings oder Konkatenation statt Parametern
  • sec.xssHinweisdangerouslySetInnerHTML, innerHTML =, v-html, document.write
  • sec.tls-offFehlerTLS-Prüfung abgeschaltet (rejectUnauthorized: false, verify=False …)
  • sec.cors-wildcardHinweisCORS für alle Origins (*)
  • sec.weak-randomHinweisMath.random() für Tokens, Passwörter, IDs
  • sec.weak-hashFehlerMD5/SHA-1 für Passwörter
  • sec.cookie-flagsHinweisCookie ohne httpOnly/secure
  • sec.debug-prodHinweisDebug-Modus in Produktions-Konfiguration
  • sec.open-ingressHinweis0.0.0.0/0 bzw. ::/0 in Infrastruktur-Konfiguration

Supabase

  • supa.service-role-clientFehlerService-Role-Key in Client-Code
  • supa.rls-missingFehlerMigration legt Tabelle ohne ENABLE ROW LEVEL SECURITY an
  • supa.get-session-authHinweisgetSession() für Autorisierung in Server-/Edge-Code statt getUser()
  • supa.public-bucketHinweisÖffentlicher Storage-Bucket

Personendaten

  • pii.emailHinweisE-Mail-Adresse, die einer echten Person gehören kann, in Code oder Testdaten
  • pii.ibanHinweisIBAN mit gültiger Prüfziffer; bekannte Musternummern bleiben außen vor
  • pii.cardHinweisKartennummer mit gültiger Prüfziffer; bekannte Testnummern bleiben außen vor

Code-Qualität

  • slop.ts-anyFehlerany in TypeScript (Annotation, as any, <any>, any[])
  • slop.ts-suppressFehler@ts-ignore, @ts-nocheck, @ts-expect-error ohne Begründung
  • slop.lint-disableFehlereslint-disable, # noqa, # type: ignore, swiftlint:disable, //nolint, @Suppress
  • slop.todo-no-issueHinweisTODO/FIXME ohne Issue-Referenz (#123)
  • slop.placeholderFehlerPlatzhalter statt Implementierung („implementation here“, „not implemented“, todo!())
  • slop.empty-catchFehlerLeerer catch, .catch(() => {}), except: pass
  • slop.console-logHinweisconsole.log/console.debug in Produktionscode
  • slop.commented-codeHinweisDrei oder mehr auskommentierte Code-Zeilen am Stück
  • slop.test-focusFehler.only, .skip, fit, xit, @pytest.mark.skip, @Disabled in Tests
  • slop.test-tautologyFehlerAssertions, die immer bestehen (expect(true).toBe(true))
  • slop.test-no-assertHinweisTestdatei mit Tests, aber ohne Assertion
  • slop.file-sizeHinweisCode-Datei wächst über 300 Zeilen
  • slop.kotlin-bangHinweis!! in Kotlin-Produktionscode
  • wbg.suppression-addedHinweisNeue wbg-ignore-Unterdrückung (wird im Review sichtbar)

Nach dem Lesen

Prüft Dateien, Befehlsausgaben, Webseiten und MCP-Antworten. Gelesen ist der Text dann schon, darum sperrt hier nichts: Agent und Nutzer bekommen einen Hinweis.

Prompt Injection

  • inject.overrideHinweisFordert auf, frühere Anweisungen zu ignorieren
  • inject.personaHinweisVergibt dem Agenten eine neue Rolle oder neue Systemanweisungen
  • inject.agent-addressHinweisSpricht KI-Agenten direkt an und gibt ihnen einen Auftrag
  • inject.concealHinweisFordert auf, dem Nutzer etwas zu verschweigen
  • inject.exfiltrateHinweisEnthält einen Auftrag, Secrets nach außen zu senden
  • inject.role-markerHinweisGibt sich mit Steuerzeichen eines Chat-Protokolls als System oder Werkzeug aus
  • inject.hidden-textHinweisVersteckt Text in unsichtbaren Zeichen oder dreht die Leserichtung um

Probier es mit deiner nächsten Aufgabe.

Workban ist kostenlos. Dein Workspace steht in einer Minute, und die erste Aufgabe erscheint, sobald dein Agent loslegt.