Alle Seiten
Auf dieser Seite

Was OAR offenlegt und was nicht

Diese Seite fasst an einer Stelle zusammen, was OAR offenlegt und was nicht. Jede Tatsache hat ihren eigentlichen Platz auf einer anderen Seite; jeder Abschnitt endet mit einem Link dorthin. Die Kurzfassung: Ein Relay handelt als du, das Zugriffstoken bedeutet volle Kontrolle darüber, und ein paar Links, die du erstellst, sind absichtlich öffentlich.

Das Vertrauensmodell #

Ein Relay läuft als Betriebssystembenutzer, und seine Agents laufen als dieser Benutzer mit dessen Rechten. Was immer du auf dem Rechner tun kannst, kann man einen Agent tun lassen. Nichts sperrt die Shell eines Agents ein. Ein Agent kann die Config-Datei lesen (und damit das Zugriffstoken), die Datenbank (mit den Provider-Keys und den Tokens gekoppelter Relays) und die Anmeldedateien der Provider. Das Zugriffstoken gibt die volle Kontrolle über das Relay und damit über das, was seine Agents tun können: Wer es hat, kann einen Agent Befehle auf dem Host ausführen lassen. OAR erweitert die Reichweite dieser Agents. Eine Sandbox fügt es nicht hinzu.

Die einzige Ausnahme ist Claude Cloud, dessen Agent auf einem Klon eines GitHub-Repositorys in einer Sandbox bei Anthropic arbeitet, nicht auf deinem Rechner (siehe Was deinen Rechner verlässt).

Was ein Agent anfassen darf #

Der Arbeitsordner ist der Ort, an dem ein Agent arbeitet. Er ist keine Mauer. Das erzwingt OAR und das nicht:

OAR erzwingt OAR erzwingt nicht
workspaceRootAllowList begrenzt, in welchen Ordnern eine Konversation gestartet werden kann und wohin sie mit Change CWD (Arbeitsordner ändern) wechseln kann. Ohne den Key ist jeder vorhandene Ordner erlaubt. Nichts sperrt die Shell eines Agents in den Arbeitsordner ein. Sie kann lesen und schreiben, wo immer der Benutzer des Relays das kann.
Relay-Modi sagen dem Agent, wie frei er handeln soll. Manche Provider erzwingen einen Teil davon: Die SDK-Engine von GitHub Copilot und OpenAI lehnt in plan alles ab, was nicht nur liest, und fragt in ask zuerst dich. Claude und Neu in 0.9.17 DeepSeek führen in allen Modi jedes Tool aus, ohne dich zu fragen. Die Berechtigungsanfragen von Grok werden alle genehmigt. Auf der Extension-Engine prüft OAR keine Berechtigungen. Ein Modus ist dort eine Anweisung, der der Agent folgt.
Eine statische Preview kann nur einen Ordner innerhalb des Arbeitsordners ausliefern. Die Allow-Liste prüft den Ordner Default (Standard) nicht, und sie begrenzt nicht, was du durchsuchen kannst.

Details: Begrenzen, wo Chats starten dürfen, Relay-Modi und Agents und das Token.

Ohne Anmeldung erreichbar #

Alles, was deine Konversationen, Dateien, Einstellungen oder Agents liest oder ändert, braucht das Zugriffstoken. Das sind die Ausnahmen:

Was Was es offenlegt Wie du es abschaltest
Die Anmeldeseite und die statische App Die Web-App und ihr Anmeldefeld. Sie enthält keine deiner Daten. Lässt sich nicht abschalten. Halte das Relay vom Internet fern (localhostOnly) oder stell Zugriffsregeln davor.
Ein geteilter Link (/shared/…) Der Verlauf der Konversation, nur lesend, mit dem Modell jeder Nachricht. Die Pfade des Relay-Hosts werden gefiltert (standardmäßig nur Dateinamen), und Nachrichten, die du ausgeblendet hast, werden nicht gesendet. Jedes Öffnen wird protokolliert. Stop sharing (Teilen beenden) oder Renew link (Link erneuern) unter Settings → Sharing (Einstellungen → Teilen), oder lösch die Konversation. Die alte Adresse antwortet dann mit einem einfachen 404. Ein Link läuft nie ab.
Ein Preview-Link Der Dev-Server oder Ordner in der Preview. Das zufällige Token des Links ist sein einziger Schutz. Close (Schließen) für die Preview oder /preview close. Die Lane ist aus, bis du sie einrichtest. Eine Preview übersteht einen Relay-Neustart und endet, wenn du sie schließt oder ihre Konversation löschst.

Eine Cloudflare-Access-Anwendung vor dem Relay hält auch Betrachter eines geteilten Links auf, sofern /shared/* und /api/shared/* nicht durchgelassen werden; damit sind diese beiden Pfade absichtlich öffentlich (Cloudflare Access).

Details: Deine geteilten Links, was ein Betrachter sieht, Previews und Was das Token braucht.

Was ein angemeldeter Browser erreicht #

Ein Browser mit dem Token kann jede Konversation auf dem Relay öffnen und hat den Dateibrowser. Unter Linux und macOS liefert die Laufwerkswurzel jede Datei aus, die der Benutzer des Relays lesen kann, ob im Arbeitsordner oder nicht. Umbenennen und Löschen wirken überall, wo dieser Benutzer schreiben darf, und Gelöschtes landet nicht in einem Papierkorb. Unter Windows ist der Browser auf die Laufwerke begrenzt, die das Relay auflistet. Die Medienroute, die die Bilder eines Agents zeigt, funktioniert genauso: Sie liefert jeden absoluten Pfad aus, den der Benutzer des Relays lesen kann, aber nur an eine Anfrage, die das Token trägt.

Details: Der Dateibrowser, Bilder und Medien.

Geheimnisse #

Geheimnis Wo es liegt
Das Zugriffstoken config.json, im Klartext. Das Relay hält die Datei nur für den Besitzer lesbar. Ein Browser hat es ebenfalls, als Anmelde-Cookie.
Ein Token eines Cloudflare Tunnels config.json (cloudflaredTunnel.token) oder die Umgebung.
API-Keys für OpenAI, Cursor, Neu in 0.9.17 DeepSeek und Neu in 0.9.18 Claude API Die Datenbank. Sie werden nie an Browser gesendet. Jeder erreicht nur die Worker seines eigenen Providers; der DeepSeek-Key verlässt den Rechner nur zur DeepSeek-Basis-URL, der Claude-API-Key nur zu https://api.anthropic.com.
Das Token eines gekoppelten Relays Die Datenbank. Es wird nie an Browser oder Agents gesendet.
Tokens geteilter Links, Push-Keys Die Datenbank.
Anmeldungen bei Claude, Grok und GitHub Copilot Die eigenen Ordner der Provider auf dem Rechner (~/.claude, ~/.grok, die Anmeldung der Copilot CLI). OAR speichert keine davon. DeepSeek-Chats nutzen keine davon. Neu in 0.9.18 Claude-API-Chats teilen den Claude-Ordner, laufen aber mit dem gespeicherten Key, nicht mit der Anmeldung.
Ein Claude-Anmeldetoken in der Umgebung des Relays (CLAUDE_CODE_OAUTH_TOKEN) Neu in 0.9.17 Wird auf jeder Plattform nur an Claude- und Claude-Cloud-Worker übergeben. Vorher konnten es auch andere Worker bekommen.
Ein Anthropic-Key oder -Token in der Umgebung des Relays (ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN) Neu in 0.9.17 Wird an keinen Worker übergeben. Vorher bekam ihn jeder Worker, und ein Claude-Chat lief damit statt mit der Claude-Anmeldung. Neu in 0.9.18 Ein Claude-Chat im Abo, der mit einem API-Key aus den eigenen Einstellungen von Claude Code startet, wird ebenfalls gestoppt; siehe Claude.

Agents laufen als derselbe Benutzer wie das Relay. Dateirechte, die „nur Besitzer“ sagen, halten einen Agent daher nicht draußen: Er kann config.json, die Datenbank und die Provider-Ordner lesen. Nichts in OAR verbirgt sie vor ihm. Die eigenen Worker des Relays und die Tools, mit denen Agents das Relay erreichen, lesen das Zugriffstoken aus config.json. relay_tool gibt einem Agent nie das Token eines anderen Relays: Der Aufruf läuft über dein Relay, das das Token hinzufügt. Ein Agent könnte dieses Token trotzdem aus der Datenbank lesen. Ein Backup der Datenbank enthält die Keys und Tokens oben, also halte es so privat wie den Zustandsordner.

Neu in 0.9.17 Der Agent eines DeepSeek-Chats kann den DeepSeek-Key aus seiner Umgebung lesen. Das Relay ersetzt den Key durch [redacted] in allem, was ein Session-Worker schickt, bevor es das speichert oder anzeigt; das hält ihn aus dem Verlauf heraus, hält aber keinen Agent auf, der den Key haben will. Siehe Wo der Key aufbewahrt wird.

Neu in 0.9.18 Dasselbe gilt für den Claude-API-Key in einem Claude-API-Chat. Dieser Chat teilt den Claude-Ordner, in dem deine Claude-Anmeldung liegt; deshalb setzt das Relay den gespeicherten Key fest über alle Zugangsdaten in dessen Einstellungen und stoppt einen Turn, dessen Claude Code eine andere Quelle für seinen Key meldet. Claude Code schickt seine erste Modellanfrage einen Moment nach dieser Meldung, also kann eine Modellanfrage vor dem Stopp schon mit den anderen Zugangsdaten hinausgegangen sein: Die Prüfung begrenzt falsche Zugangsdaten auf diese eine Modellanfrage, verhindert sie aber nicht. Siehe Claude API → Sicherheit.

Neu in 0.9.18 In DeepSeek- und Claude-API-Chats, die mit einem Key laufen, den das Relay hält, startet Claude Code mit allen Hooks und der Statuszeile abgeschaltet, deinen und denen des Chat-Ordners, damit sie nicht mit dem Key in ihrer Umgebung laufen können. Hooks in verwalteten Einstellungen laufen weiterhin. Chats mit deiner Claude-Anmeldung behalten ihre.

Neu in 0.9.17 Ein Relay, das aus einer Claude-Code-Session heraus gestartet wurde (etwa aus der Shell eines Agents), gibt die Variablen dieser Session, darunter ihre Session-ID, ihren Messaging-Socket und ihr Token, nicht mehr an seine Worker weiter. Siehe Ein Relay, das aus Claude Code heraus gestartet wurde.

Details: Wo Geheimnisse liegen, Welche Variablen die Worker der Agents erreichen.

Zwischen Relays #

Die Kopplung kann ein Token übergeben: Braucht das andere Relay ein anderes Token, um deins zurückzurufen, trägt die Vorstellung deins mit, und das Entfernen der Kopplung widerruft es nicht. Die Stufe Agents may (Agents dürfen) und Accept prompts from other relays' agents (Prompts von Agents anderer Relays annehmen) begrenzen, was Agents über das Tool tun, nicht, was ein Token-Inhaber direkt tut. Die Stufen sind Read only (Nur lesen), Read and prompt (Lesen und Prompts senden) und Full (Vollzugriff); neue Kopplungen beginnen mit Full. Ein gekoppeltes Relay ist in einer Konversation gesperrt, bis du es erwähnst. Ein Prompt, der zwei Relays durchlaufen hat, wird nicht an ein drittes weitergegeben, und nach 30 Prompts ohne eine Nachricht von dir fragt dich der nächste auf einer Karte.

Details: Remote-Relays und Kopplung.

Zwischen Agents auf einem Relay #

Agent-Sessions sind standardmäßig aus. Schaltest du sie ein, muss ein Agent dich fragen, bevor er seine erste Session in einer Konversation startet, höchstens 4 seiner Sessions dürfen gleichzeitig arbeiten, und eine Session, die ein Agent gestartet hat, kann selbst keine Sessions starten. In den Modi ask und plan fragt jede Schreibaktion zuerst.

Beantworte Freigabekarten mit ihren Buttons. Auf den eigenen Freigabekarten von OAR genehmigt nur das Wort Allow, in beliebiger Groß- und Kleinschreibung. Jeder andere Text, den du tippst, lehnt ab, und der Agent bekommt daraus keine Begründung.

Details: Agent-Sessions und Freigabekarten.

Netzwerk #

  • Wer sich verbinden kann. localhostOnly ist standardmäßig true und bindet das Relay an 127.0.0.1. Jeder andere Wert bindet alle Schnittstellen, und das Relay prüft nicht, woher eine Anfrage kommt. LAN-Zugriff ist einfaches http, das Token geht also unverschlüsselt durch dein Netzwerk (Wer sich verbinden kann).
  • Tunnel. Außerhalb deines Netzwerks nimm HTTPS über einen Tunnel oder Proxy: SSH-Tunnel, Cloudflare Tunnel, Reverse Proxy.
  • Anmeldung. Neu in 0.9.11 Zehn falsche Tokens von einer Adresse innerhalb einer Minute sperren diese Adresse für den Rest der Minute (429), und die Ablehnung wird protokolliert. Anfragen vom eigenen Rechner des Relays, die nichts weitergeleitet hat, werden nie gesperrt. Die Sperre bremst das Raten; der Schutz bleibt ein langes, zufälliges Token. Das Cookie ist HttpOnly und gilt 30 Tage (Schutz).
  • Ein Token in einer Adresse. ?token= funktioniert nur bei der Seitenadresse; die Seite meldet sich mit einem Header an und entfernt es. Diese erste Adresse kann trotzdem im Browserverlauf und in den Logs eines Proxys oder Tunnels landen (Wege, es vorzulegen).
  • Die Live-Verbindung. Neu in 0.9.11 Sie nimmt einen Browser nur vom eigenen Origin des Relays an, sodass eine Seite auf einer anderen Website dein Anmelde-Cookie nicht dafür nutzen kann. Hinter einem Proxy, der den Header Host umschreibt, trag den öffentlichen Origin in allowedOrigins ein.
  • Weitergeleitete Header. Neu in 0.9.11 X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto und X-Real-IP zählen nur von einem Proxy, dem das Relay über trustProxy vertraut, standardmäßig einem auf Loopback. Die Client-Adresse (Sperre, Rate-Limits, das Zugriffsprotokoll geteilter Links) sowie Host und Schema neuer geteilter Links werden darüber gelesen, sodass ein direkter Client sie nicht wählen kann.
  • Neustart und Queue leeren. Der Neustart, das Abbrechen eines Neustarts und Empty queue (Queue leeren) brauchen nur das Token, von jedem Gerät aus. Wenn Nutzer aus der Ferne sie nicht nutzen dürfen, lehne sie am Proxy ab (Endpunkte, die nur der Rechner des Relays nutzen darf).
  • Der Pfadschutz des Session-Workers. Der Pfad, den die Worker deiner Agents nutzen, und das Ausführen von Bildoperationen antworten nur einem Loopback-Peer, dessen Anfrage keinen Tunnel-Marker (cf-ray oder einen aus tunnelMarkerHeaders) und kein X-Forwarded-For, Forwarded oder X-Real-IP trägt. Ein Weiterleiter, der nichts davon hinzufügt, etwa ein SSH-Reverse-Tunnel, sieht lokal aus; dann schützt nur das Token den Pfad (Pfadschutz).
  • Das Token des Cloudflare Tunnels. Es wird cloudflared in der Befehlszeile übergeben, also können andere Benutzer des Rechners es in der Prozessliste sehen (Cloudflare Tunnel).
  • Aufräumen beim SSH-Tunnel. autoReclaimPort (standardmäßig an) beendet den Prozess deiner SSH-Anmeldung, der den Remote-Port hält; reclaimStaleSshSessions beendet dort außerdem deine untätigen SSH-Sessions (Remote-Port belegt).

Was deinen Rechner verlässt #

OAR hat keine Telemetrie. Das Relay sendet keine Nutzungsdaten an OAR oder an irgendwen sonst. Es kontaktiert diese Hosts, und nur aus diesen Gründen:

  • oar.sh, nur wenn du zustimmst. Check for updates automatically (Automatisch nach Updates suchen) unter Settings → General (Einstellungen → Allgemein) ist standardmäßig aus. Schaltest du es ein, fragt das Relay https://oar.sh/latest.json sofort ab, bei jedem Start und dann etwa alle 12 Stunden. Die Anfrage ist ein einfaches GET mit Accept: application/json und, sobald es eine Antwort gibt, If-None-Match. Sie trägt keine Version, kein Token, kein Konto und keine Informationen über den Rechner. Der Button Check for updates (Nach Updates suchen) und oar update ohne --to lesen dieselbe Datei. OAR_NO_UPDATE_CHECK=1 in der Umgebung des Relays stoppt das alles. Siehe Die Update-Prüfung.
  • npm, wenn du aktualisierst. npm install -g spricht mit der npm-Registry.
  • Jeder Provider, bei jedem Turn. Deine Nachrichten und alles, was der Agent für die Aufgabe liest, gehen an den Provider hinter der Konversation: GitHub Copilot, OpenAI (oder die Basis-URL, die du setzt), Claude, Claude API, Cursor, Grok oder DeepSeek (oder die Basis-URL, die du setzt). Es gelten deren Bedingungen, nicht die von OAR.
  • DeepSeek. Neu in 0.9.17 Das Relay sendet den DeepSeek-Key an https://api.deepseek.com oder an die Basis-URL, die unter Advanced (Erweitert) in Settings → Providers → DeepSeek (Einstellungen → Provider → DeepSeek) gesetzt ist (https oder http nur auf demselben Rechner), und an keinen anderen Host: um die Modelle aufzulisten, wenn du den Key oder die Basis-URL speicherst oder die Liste in 🤗 Select Models (Modelle auswählen) aktualisierst, und um das Guthaben zu lesen (unten). Das Claude Code eines DeepSeek-Chats schickt seine Turns an /anthropic unter dieser Adresse, mit demselben Session-Kontext wie jeder Claude-Code-Chat. OAR schaltet den eigenen Verkehr von Claude Code zu Anthropic ab (Updates, Telemetrie). Siehe DeepSeek.
  • Claude API. Neu in 0.9.18 Das Relay sendet den Claude-API-Key an https://api.anthropic.com und an keinen anderen Host: um die Modelle des Keys aufzulisten, wenn du ihn speicherst, Claude API einschaltest oder die Liste aktualisierst. Das Claude Code eines Claude-API-Chats schickt seine Turns mit dem Key dorthin. Siehe Claude API.
  • Claude Cloud. Der Agent läuft bei Anthropic, auf einem Klon deines Repositorys. Das Relay sendet das Claude-Anmeldetoken an https://api.anthropic.com und an keinen anderen Host. Siehe Claude Cloud.
  • Plan-Verbrauch, wenn du Check Usage öffnest. Das Relay liest deine Konten mit den Anmeldungen, die es auf dem Rechner findet: GitHub (api.github.com, mit GH_TOKEN, GITHUB_TOKEN oder der Anmeldung von gh), Grok (cli-chat-proxy.grok.com, mit der Anmeldung der Grok CLI), Anthropic (bei eingeschaltetem Claude Cloud), Neu in 0.9.17 DeepSeek (das Guthaben, an der DeepSeek-Basis-URL mit dem gespeicherten Key, solange DeepSeek an ist) und, nur wenn du ein Dashboard-Session-Token eingegeben hast, cursor.com. Siehe Check Usage.
  • GitHub Actions. Für die Prüfung vor dem Ruhezustand führt das Relay gh run list für die Repositorys deiner Arbeitsordner aus (Host-Ruhezustand).
  • Gekoppelte Relays. Was ein Agent über relay_tool schickt, geht an die Adresse jenes Relays, mit dessen Token (Remote-Relays).
  • Installer der Provider, wenn du bestätigst. Install (Installieren) für Claude oder Grok führt das eigene Installer-Skript des Providers (claude.ai, x.ai) als Benutzer des Relays aus (Claude, Grok).
  • Push-Benachrichtigungen. Sie laufen über den Push-Dienst des Herstellers deines Browsers, und der Text ist allgemein gehalten, sofern du nichts anderes wählst (Was eine Benachrichtigung zeigt).

Dein Browser, nicht das Relay, lädt die Bibliotheken für Markdown, Mathematik und Syntaxhervorhebung von cdn.jsdelivr.net (Markdown, Mathematik, Terminal) und cdnjs.cloudflare.com (Hervorhebung), jedes Mal, wenn er die App öffnet. Die Terminalansicht einer tmux-Session lädt ihre Terminal-Bibliothek von unpkg.com, wenn cdn.jsdelivr.net fehlschlägt. Diese Hosts sehen die Anfrage jedes Browsers, der die App öffnet. Siehe Bilder, Medien und Formeln.

Logs #

Das Relay kopiert seine Konsole nach logs/relay-console.log im Zustandsordner, mit einem Zeitstempel pro Zeile. Die Datei rotiert bei 5 MB, und drei ältere Dateien bleiben erhalten. Bevor eine Zeile geschrieben wird, ersetzt das Relay dein Zugriffstoken und jeden Wert nach ?token= oder &token= durch [token]. OAR_NO_CONSOLE_LOG=1 schaltet die Datei ab. Ein einzelnes falsches Token wird nicht protokolliert; eine gesperrte Adresse schon, mit einer Zeile, die mit [auth] beginnt. Eine Preview wird mit einem kurzen Hash benannt, nie mit ihrem Token. Ein Lesezugriff auf einen geteilten Link wird mit der Adresse des Betrachters protokolliert oder mit not stored, wenn Store viewer IP addresses (IP-Adressen der Betrachter speichern) aus ist.

Die Worker-Logs (worker-<session>.log) enthalten die Ausgabe jedes Session-Workers und werden von den Workern geschrieben, nicht über diese Maskierung. Dateien gelöschter Konversationen bleiben. Ein Reverse Proxy oder Tunnel vor dem Relay führt eigene Logs, die ?token=-Adressen enthalten können, und der verwaltete Cloudflare Tunnel zeigt sein Token als <redacted>. Behandle alle Logs als privat und lies sie, bevor du sie irgendwo postest.

Details: Logs.

Bevor du ein Relay offenlegst #

  1. Halte das Token zufällig und aus Adressen heraus, die du teilst. Ist es durchgesickert, führ oar setup --new-token aus; das meldet jedes Gerät ab und sperrt gekoppelte Relays aus.
  2. Erreiche das Relay über HTTPS: einen Tunnel oder einen Reverse Proxy. Lass localhostOnly an, wenn der Proxy oder Tunnel auf demselben Rechner läuft.
  3. Hinter einem Proxy auf einem anderen Rechner setz trustProxy auf ihn und allowedOrigins, wenn er Host umschreibt (Ein Proxy auf einem anderen Rechner). Ein Weiterleiter, der gar keinen Header hinzufügt, braucht einen Marker-Header in tunnelMarkerHeaders. Wenn Nutzer aus der Ferne das Relay nicht neu starten dürfen, lass den Proxy diese Endpunkte ablehnen.
  4. Lass das Relay als Benutzer laufen, dessen Rechte, Dateien und Anmeldungen du den Agents geben würdest. Setz workspaceRootAllowList, wenn Konversationen nur in bestimmten Ordnern starten sollen, und denk daran, dass das keine Shell einsperrt.
  5. Teile eine Konversation erst, nachdem du sie mit Preview as shared (Ansicht wie geteilt) gelesen hast, und blende aus, was nicht hinein darf. Das Filtern von Pfaden ist in freiem Text nur ein bestmöglicher Versuch. Beende Links, die du nicht mehr brauchst, unter Settings → Sharing.
  6. Veröffentliche eine Preview nur für etwas, das du jedem mit dem Link zeigen kannst, und schließ sie, wenn du fertig bist. Sie übersteht einen Relay-Neustart.
  7. Lass Agent-Sessions aus, solange du sie nicht brauchst. Wähl für gekoppelte Relays die Stufe Agents may bewusst und schalte Accept prompts from other relays' agents ab, wo du es nicht brauchst.
  8. Klick auf die Buttons der Freigabekarten.
  9. Wenn du gar keinen Kontakt zu oar.sh willst, setz OAR_NO_UPDATE_CHECK=1.