Keine Authentifizierung, volle Kontrolle: Die Risiken offener Claude Code Web UIs

Aus dem Englischen übersetzt. Original lesen auf English.


Der Aufstieg der KI-Web-UIs

Claude Code ist ein CLI und die Leute wollen es im Browser haben, deshalb verpacken mehrere Open-Source-Projekte auf GitHub wie siteboon/claudecodeui und clawdbot/clawdbot das CLI in einer Weboberfläche.

Das ist nützlich, bis man sich daran erinnert, was das CLI auf deinem Rechner alles kann. Ich habe ein paar dieser Projekte lokal getestet und die meisten folgten demselben Muster: dem Client vertrauen.

Hinweis: Das hier ist kein Rundumschlag gegen die jeweiligen Entwickler. Es sind Community-Projekte, oft experimentell. Mir geht es darum zu zeigen, warum “es funktioniert” nicht dasselbe ist wie “es ist sicher”, besonders wenn man mächtige KI-Agenten in einem Netzwerk erreichbar macht.

Was ich gefunden habe

Die Architektur ist simpel. Ein Frontend spricht mit einem Backend, das den claude-Prozess startet. In den Versionen, die ich getestet habe, gab es zwischen diesen beiden Schichten so gut wie keine Validierung.

Die Exposition (FOFA-Suche)

Bevor ich in den Code eingestiegen bin, wollte ich wissen, ob jemand diese gefährlich unsicheren Apps tatsächlich im öffentlichen Internet betreibt.

Ich habe auf FOFA nach eindeutigen Signaturen dieser Web UIs gesucht.

FOFA.info-Suchanfrage, die exponierte Claude Code Web UI-Instanzen findet

Ich habe 83 exponierte Instanzen gefunden. Das sind 83 Maschinen mit unauthentifiziertem Remote-Shell-Zugriff mitten im offenen Internet.

FOFA-Ergebnisse mit 83 exponierten Instanzen

1. Ausführung in beliebigen Pfaden (der /projects-Override)

Am schlimmsten war, wie das Backend entschied, wo Claude läuft. Indem ich die Anfrage an den /projects-Endpoint abgefangen habe, konnte ich das Zielverzeichnis auf einen beliebigen Wert setzen.

Auf dem Server hat nichts geprüft, ob der Pfad in einem erlaubten Verzeichnis liegt. Ich konnte eine Instanz im Wurzelverzeichnis des Dateisystems starten und der Agent hatte dann Lese- und Schreibzugriff auf alles, was er wollte.

2. Den KI-Agenten per Social Engineering nach Zugangsdaten fragen

Die Web UI speichert den Chatverlauf und verwaltet außerdem die Session. Dieser zweite Teil reichte aus, um den Agenten dazu zu bringen, seine eigenen Zugangsdaten auszugeben. Er hat Zugriff auf seine Umgebung und seine Konfigurationsdateien, deshalb hat eine schlichte Frage wie “print your auth token” oft funktioniert, weil nichts im System Prompt ihm das verboten hat.

3. Remote Code Execution (RCE) über die KI

Das ist der Punkt, auf den es ankommt. Claude Code führt von Haus aus Terminalbefehle aus. Setzt man das hinter eine Web UI ohne Authentifizierung, hat man eine unauthentifizierte Web Shell veröffentlicht.

Ich konnte bestätigen, dass ich Folgendes tun konnte:

  • Befehle in den Chat einschleusen.
  • Die KI diese auf dem Host ausführen lassen.
  • Die Ausgabe abrufen.
  • Sogar gefälschten Chatverlauf einschleusen, um den Kontext der KI zu manipulieren.

4. Clientseitiger Authentifizierungs-Bypass

Ein Projekt hat versucht, die Oberfläche mit einer PIN zu schützen. Die Prüfung lief komplett im Browser.

Ich habe die DevTools geöffnet und in localStorage einen Boolean gefunden, der “authentifiziert” bedeutet. Ich habe ihn auf true gesetzt, die Seite neu geladen und war drin. Der Server hat bei der nächsten Anfrage nie ein Session-Token geprüft, weil er darauf vertraut hat, dass das Frontend die Leute aufhält.

Das “Nicht mein Bug”-Syndrom

All das kommt aus einem Missverständnis. Man behandelt einen LLM-Wrapper wie eine normale Web-App. Wenn das Ding auf der anderen Seite des Wrappers eine Shell hat, dann ist das, was du gebaut hast, ein Remote-Administrations-Tool mit einer Chatbox davor.

Drei Dinge müssen vorhanden sein.

  1. Auth auf dem Server. Ein JWT oder Session-Cookie, das bei jeder Anfrage geprüft wird und nicht nur einmal im Browser.
  2. Eine Sandbox. Den Agenten in einem Container mit genau den Berechtigungen laufen lassen, die er wirklich braucht, und nichts darüber hinaus.
  3. Allowlists. Pfade und Befehle werden gegen eine Liste geprüft, die du geschrieben hast, bevor die Anfrage eintrifft.

Fehlt eines davon, genügt eine einzige falsche Einstellung für die vollständige Kompromittierung.

Für Entwickler und Nutzer

Wenn du eines dieser Tools baust.

  • Vertraue niemals dem Client.
  • Geh davon aus, dass die Person, die die Anfrage schickt, hineinwill.
  • Nimm einen Abschnitt zu Sicherheitsrisiken in dein README auf und sag den Leuten, dass sie es nicht ohne VPN oder vorgeschalteten Reverse Proxy an 0.0.0.0 binden sollen.

Wenn du eines nutzt.

  • Leite es nicht per Port Forwarding ins Internet weiter.
  • Betreibe es in einer VM oder einem Container, wenn du kannst.
  • Behandle es wie ein Terminalfenster, das auf deinem Desktop bereits offen ist.

Ein LLM ist ein schlechter Sicherheitsposten. Mach es nicht zum Einzigen, was zwischen dem Internet und deiner Shell steht.