Sicherheit

Gebaut in der Annahme, dass sich das Modell täuschen lässt.

shift geht davon aus, dass jeder Lauf manipuliert sein kann, durch eine Log-Zeile, ein Ticket oder die Antwort eines Tools. Darum entscheidet nie das Modell, was es darf, sondern die Berechtigungen rundherum, geprüft bei jedem Aufruf und protokolliert.

shift hat keine Zertifizierung. Diese Seite zeigt stattdessen, wie es funktioniert, damit Ihr Security-Team selbst urteilen kann.

  1. server_enabled
  2. tool_approved
  3. grant_held
  4. client_allowed
  5. on_allowlist
  6. authorize_mode
  7. within_limits
  8. credential_usable

Denied. Nothing was sent.

Darstellung. Der Tool Guard hält bei der ersten Prüfung an, die scheitert, hier eine fehlende Berechtigung; die Prüfungen danach laufen nicht mehr, und der Aufruf verlässt shift nie.

01

Ein Tor für jeden Aufruf

Jeder Tool-Aufruf läuft durch ein einziges Modul, den Tool Guard: aus dem Chat, von Agenten, beim Aktualisieren eines Widgets und von externen Clients. Seine Prüfungen sind eine Liste benannter Funktionen. Die erste, die scheitert, stoppt den Aufruf. Erlaubt ist nur, was ausdrücklich erlaubt wird.

  1. server_enabled

    Der Server ist eingeschaltet.

  2. tool_approved

    Ein Admin hat das Tool freigegeben, und seine Definition ist unverändert.

  3. grant_held

    Die Person oder der Besitzer des Agenten ist jetzt berechtigt.

  4. client_allowed

    Bei einem externen Client: Installation und Admin lassen dieses Tool zu.

  5. on_allowlist

    Bei einem Agenten: Das Tool steht auf der Liste seiner Version.

  6. authorize_mode

    Die Stufe entscheidet: ausführen, Freigabe einholen oder ablehnen.

  7. within_limits

    Der Lauf hat noch Tokens und Aufrufe übrig.

  8. credential_usable

    Das Konto für den Aufruf ist vorhanden und gültig.

  9. Keine gescheitert: Der Aufruf läuft oder wartet auf eine Freigabe.

Bei einem abgelehnten Aufruf kann ein Admin nachfragen, warum. shift prüft den Aufruf wie einen Chat-Aufruf gegen die heutigen Server, Tools und Berechtigungen und zeigt, welche Prüfung ihn stoppt.

Eine Prüfung im Build lässt den Code der Anwendung MCP-Server, Modell-Anbieter und das Web nur über wenige dafür bestimmte Module erreichen. So rutscht kein neuer Weg nach aussen unbemerkt durch das Review.

02

Eine Person gibt genau diesen Aufruf frei

Ein Admin prüft jedes Tool eines Servers, bevor es jemand nutzen kann, und gibt ihm eine von vier Stufen. Read-only-Tools laufen. Sensitive Tools, die private Daten zeigen, und Tools, die etwas verändern, warten jedes Mal auf eine Freigabe. Blockierte Tools werden dem Modell nie angeboten.

Die vier Stufen: wofür jede gedacht ist und was sie tut, wenn eine Person dabei ist oder ein Agent allein läuft
Stufe Wofür Mit einer Person Agent, unbeaufsichtigt
Read only Tools, die nichts verändern können Läuft Läuft
Sensitive Tools, die private Daten zeigen Wartet auf die Freigabe genau dieses Aufrufs Läuft nur, wenn ein Admin das Tool dafür markiert hat und es in der aktivierten Version steht; sonst wartet der Agent auf eine Freigabe
Makes changes Tools, die etwas verändern Wartet auf die Freigabe genau dieses Aufrufs Läuft nur, wenn ein Admin das Tool dafür markiert hat und es in der aktivierten Version steht; sonst wartet der Agent auf eine Freigabe
Blocked Tools, die der Assistent nie bekommen soll Nie angeboten Nie angeboten

Die Freigabe zeigt die genauen Argumente, in voller Länge, versteckte Steuerzeichen ausgeschrieben. Sie geben diesen Aufruf frei, einmal. Freigeben kann nur die Person, für die der Aufruf läuft; Admins können ihn ablehnen oder abbrechen. Eine Freigabe verfällt im Chat nach einer Stunde und bei Agenten nach 24 Stunden; verfallen heisst abgelehnt.

A call waits for your approval.

pods_log Kubernetes Sensitive

Exact arguments

{
  "namespace": "shift-demo",
  "name": "podinfo-6b7f9d8c4-x2kqp",
  "previous": true
}

Asked in your chat · expires in 1 hour Only the person a call runs for can approve it.

Darstellung. Sie geben diesen einen Aufruf mit genau diesen Argumenten frei, einmal. Ein anderer Aufruf braucht seine eigene Freigabe. Freigeben kann nur die Person, für die der Aufruf läuft.

Agenten, die allein laufen, dürfen ein Sensitive- oder Makes-changes-Tool nur dann ohne Rückfrage nutzen, wenn ein Admin es für den unbeaufsichtigten Einsatz markiert hat und es in der Version steht, die der Besitzer aktiviert hat. Die Markierung ist standardmässig aus, und ein geändertes Tool verliert sie wieder.

Die Freigabe eines Tools hält seine Definition fest: Name, Beschreibung, Schemas und Annotationen. Ändert der Server etwas daran, wird das Tool gesperrt, bis ein Admin es erneut prüft, und Agenten, die es nutzen, pausieren, bis ihr Besitzer sie wieder aktiviert.

Der Reiter Tools des Servers Kubernetes im Admin-Bereich von shift, mit 16 Tools. Ein Hinweis lautet: Outside clients are offered no tool of this server, daneben die Schaltfläche Allow all (12). Eine Tabelle listet jedes Tool mit Beschreibung, seiner Stufe unter How it runs, seinem Status und einem Schalter für externe Clients: configuration_view, pods_exec und weitere sind Blocked, events_list, namespaces_list, pods_get und die Pod-Listen Read only, pods_delete Makes changes und pods_log Sensitive. Alle sind On; ein Agenten-Symbol markiert die zwei Tools, die Agenten ohne anwesende Person nutzen dürfen, und die blockierten Tools zeigen Blocked statt eines Schalters.
Abb. 1 — Die Tools eines Servers, Kubernetes, im Admin-Bereich. Jedes zeigt, wie es läuft (seine Stufe), ob es eingeschaltet ist und ob externe Clients es nutzen dürfen.

03

Keine Änderung läuft zweimal

Jeder Aufruf wird in einem Ledger festgehalten, nach Lauf und Aufruf-ID, bevor er hinausgeht. Stürzt shift ab, nachdem ein Aufruf gelaufen ist, aber bevor das Ergebnis gespeichert war, verhindert das Ledger, dass ein Aufruf, der etwas verändern kann, ein zweites Mal hinausgeht; ein Read-only-Aufruf läuft einfach noch einmal. Ist bei einem verändernden Aufruf unklar, ob er gelaufen ist, erfährt das Modell «outcome unknown, do not retry», und das Audit-Log markiert den Fall.

Jeder Lauf hat ein Token-Budget und eine Obergrenze für Tool-Aufrufe. Abgelehnte Aufrufe zählen mit.

04

Jeder Schritt festgehalten

Jeder Tool-Aufruf, auch jeder abgelehnte, jede Freigabe und jede Admin-Änderung landet in einem Log, das sich nur ergänzen lässt. Der Eintrag eines Aufrufs nennt, wer ihn freigegeben hat, unter welcher Identität er lief, den Hash der Tool-Definition und die Argumente, mit Geheimnissen nach Schlüsselnamen geschwärzt.

Admin-Änderungen wie Berechtigungen, Stufen, Rollen, Server, Schlüssel und Shortcuts werden in derselben Datenbank-Transaktion wie die Änderung selbst erfasst. Eine Änderung ist protokolliert, oder sie hat nicht stattgefunden.

Ein Datenbank-Trigger verweigert UPDATE, DELETE und TRUNCATE auf dem Log. Export als JSON Lines für Ihr SIEM oder Ihre Revision.

Wie ein Aufruf enden kann

  • Succeeded Der Server hat geantwortet.
  • Failed Der Aufruf ging hinaus, und der Server meldete einen Fehler.
  • Denied Der Tool Guard hat den Aufruf abgelehnt. Nichts wurde gesendet.
  • Simulated Eine Vorschau hat den Aufruf nur nachgestellt. Nichts wurde gesendet.
  • Unknown Das Ergebnis ist unbekannt: Der Aufruf ist vielleicht gelaufen.
Die Seite Audit im Admin-Bereich von shift, gefiltert auf Kind: Tool calls. Ihre Beschreibung lautet: Every tool call, also the refused ones, and every change to who may do what. Nothing here can be changed. Die Tabelle hat die Spalten When, Who, Key or client, What und Outcome. Die neusten Zeilen sind Aufrufe von admin@example.com über den Agenten podinfo restart guard an die Kubernetes-Tools events_list und pods_list_in_namespace, alle Succeeded. Darunter: jonas.widmer@example.com, pods_delete, Denied, Approval denied; andrea.zanetti@example.com über den Schlüssel Claude Code ws-azanetti, Client claude-code/2.1.4, die Metrik-Tools query und labels, Succeeded; nina.hofer@example.com, pods_exec, Denied, Blocked; lukas.brunner@example.com, pods_list_in_namespace, Denied, No grant.
Abb. 2 — Das Audit-Log im Admin-Bereich, gefiltert auf Tool-Aufrufe: Aufrufe eines Agenten, Aufrufe über den API-Schlüssel einer Person und drei Ablehnungen mit ihrem Grund. Nur ergänzbar: Ein Datenbank-Trigger verweigert Änderungen und Löschungen.

05

Ihr Identity Provider entscheidet, wer hineinkommt

shift meldet Personen mit OpenID Connect an (nur Claims aus dem ID-Token, PKCE, State und Nonce, bei jeder Anmeldung eine bestätigte E-Mail-Adresse) oder mit Magic Links. Ein Modus nur mit SSO schaltet Magic Links ab. SCIM-2.0-Provisioning überträgt Personen und Gruppen: Wer im Identity Provider entfernt wird, verliert den Zugang innert Minuten.

Es gibt zwei Rollen: Admins verwalten Server, Tools, Gruppen und Personen; Benutzer chatten, verbinden ihre Konten und besitzen Agenten. Eine Rolle allein gibt kein Tool frei: Auch ein Admin braucht eine Berechtigung. Gespräche sind privat, auch gegenüber Admins. Admins haben das Audit-Log.

Live getestet mit pocket-id und Dex. Mit Microsoft Entra funktioniert SCIM teilweise.

06

Ihr eigener KI-Client, nach denselben Regeln

shift ist auch ein MCP-Server unter /mcp, für den eigenen Client einer Person, etwa Claude Code. Er ist aus, bis ein Admin ihn einschaltet, und dann ist jedes Tool aus, bis ein Admin es zulässt. Angeboten werden nur Read-only-Tools; ein Aufruf, der eine Freigabe bräuchte, wird abgelehnt. Clients melden sich per OAuth an, mit Tokens, die zehn Minuten gelten, oder mit einem persönlichen Schlüssel für den Betrieb ohne Browser. Jeder Aufruf wird mit Name und Adresse des Clients protokolliert.

07

Geheimnisse bleiben, wo sie hingehören

Schlüssel für Modell-Anbieter und gemeinsame Server-Zugangsdaten liegen mit AES-GCM verschlüsselt in der Datenbank. Optionen mit einem Schlüssel werden nie mit einem Job gespeichert. Log-Zeilen enthalten IDs, Zähler, Dauern und Fehlerklassen, nie Geheimnisse oder Personendaten.

Im Browser gelten eine strikte Content Security Policy mit neuem Nonce pro Anfrage, keine Bilder aus Modell-Antworten und Links nur zu shift und den genutzten Servern. So kann eine präparierte Antwort keine Daten über ein Bild hinausschleusen.

08

Private Adressen nur mit Namen

Ein MCP-Server an einer privaten Adresse braucht einen Admin, der den genauen Host und seine Adressbereiche nennt: nicht grösser als /8, kein Link-Local, keine Metadaten-Adressen von Clouds. Die Adresse eines Servers lässt sich später nicht ändern, damit gespeicherte Zugangsdaten nie an eine neue Adresse gehen. Jeder MCP-Tool-Aufruf landet im Audit-Log, und Anfragen an Ihren Identity Provider werden protokolliert, Werte, die nach Zugangsdaten aussehen, gefiltert.

09

Ein Image, auf Ihrer Infrastruktur

shift kommt als ein Container-Image mit Helm-Chart, eine Installation pro Kunde, nur für diesen Kunden. Es läuft ohne Root-Rechte auf einem schreibgeschützten Root-Dateisystem. Das Chart aktiviert standardmässig eine NetworkPolicy, und Geheimnisse kommen aus einem bestehenden Kubernetes Secret oder aus External Secrets, nie aus den Chart-Werten.

Antworten und Agenten-Läufe sind Jobs in der Datenbank. Sie überstehen einen Neustart.

Wir haben Job, Tool-Schleife, Tool Guard, Ledger und Audit gegen einen geskripteten Angreifer getestet: ein Fake-Modell, das eine vorbereitete Reihe verbotener Aufrufe machte. Der Tool Guard lehnte jeden davon ab.

10

Ein Problem gefunden?

Schreiben Sie uns. Wir antworten aus Bern. hello@zebbra.ch

Schwachstelle melden