Sicherheit¶
Dieses Projekt ist eine Bridge für Browserautomatisierung. Behandle es als Infrastruktur zur Ausführung vertrauenswürdigen Codes.
Verwaltete CDP Sicherheit¶
Managed CDP ist standardmäßig deaktiviert. Es bietet beliebige Chromium DevTools-Steuerung, kein reduziertes Browser-Tool API. Aktivieren Sie es nur für vertrauenswürdige Clients. Die Funktion in cloakbrowser_bridge_info.cdp.discoveryUrl ist ein Trägernachweis: notieren Sie ihn nicht, Speichern Sie es in Tickets oder teilen Sie es zwischen Sitzungen. Es dreht sich nach dem Austausch des Browsers und ein alter URL geht niemals in die Ersatzgeneration über.
Eine Nicht-Loopback-CDP-Bindung erfordert sowohl --cdp-allow-remote als auch eine konkret angegebene Anzeige Host. Fügen Sie Netzwerkzugriffskontrollen um den veröffentlichten Port hinzu. Auswahl --cdp-advertised-scheme https stellt TLS nicht bereit. Der verwaltete Listener und Chromium hop bleibt Klartext; ein vom Betreiber betriebener gleichportiger TLS-Terminator muss erhalten bleiben die beworbenen Host- und Origin-Berechtigungen und die Aufrechterhaltung einer Eins-zu-Eins-Routing-Verbindung zu dem Sitzung besitzen.
Laufzeitprotokolle enthalten niemals Fähigkeitswege, Ziel-IDs, CDP-Nutzlasten, Browserdaten, Cookies, rohe Host- oder Origin-Werte oder Profilpfade. Abgelehnte Sicherheitsprüfungen sind nur als sitzungsbezogene cdp_security_rejections-Warnung mit 60 Sekunden gemeldet Sättigende Zählungen für capability, host und origin; Aufräumvorgänge spülen alles Übrige zählt. Erfolgreiche Überprüfungen erzeugen keine Prüfungsaufzeichnungen pro Anfrage.
Feste Grenzen¶
Limits gelten unabhängig für jede CDP-aktivierte MCP-Sitzung:
| Grenze | Grenze |
|---|---|
| Aktive vermittelte WebSocket-Verbindungen, einschließlich laufender Handshakes | 8 |
| Gleichzeitige Pre-Upgrade HTTP-Anfragen | 16 |
| Anforderungsheader | 16 KiB |
| Anfrageinhalt auf unterstützten Routen | Nicht erlaubt |
| Pufferte Chromium HTTP Antwort | 4 MiB |
| Eingehende oder ausgehende WebSocket-Nachricht | 16 MiB |
| Warteschlangen nicht gesendeter WebSocket-Daten pro Richtung | 16 MiB |
| Anforderungs-Header, Upstream HTTP-Antwort oder WebSocket-Handschlag | 10 Sekunden |
| Anmutiges Herunterfahren des Proxys vor dem erzwungenen Schließen | 5 Sekunden |
| Lokaler Fehlermeldungskörper | 8 KiB |
HTTP Fehler¶
Lokale Fehler verwenden JSON {"error":{"code":"...","message":"..."}} mit Cache-Control: no-store, Content-Type: application/json; charset=utf-8 und ein exakt Content-Length. Methodenfehler beinhalten auch Allow. Die stabilen Zuordnungen sind:
| Status | Code |
|---|---|
400 | bad_request |
403 | forbidden |
404 | not_found |
405 | method_not_allowed |
408 | request_timeout |
413 | payload_too_large |
431 | headers_too_large |
500 | internal_error |
502 | bad_gateway |
503 | unavailable |
504 | gateway_timeout |
Chromium 400..499 | upstream_error, den Status beibehaltend |
Chromium-Weiterleitungen, Serverfehler, fehlerhafte Antworten und Übertragungsfehler sind normalisiert anstelle der Offenlegung von Chromium-Antwortkörpern. Eine von der Brücke erzeugte Ablehnung vor dem Upstream-Dispatch hat keine Chromium-Nebenwirkung. Eine nur lesbare Entdeckungsanfrage kann nach Korrektur der Bedingung erneut versucht werden. Bei mehrdeutigen zustandsändernden Fehlern, liest /json/list erneut und stimmt den Anwendungszustand ab; gehe nicht davon aus Retry-After oder automatische Idempotenz.
WebSocket Schließt¶
Lokal erzeugte Abschlüsse verwenden feste geschwärzte Paare. Gültige Peer-Abschlüsse werden weitergeleitet.
| Code | Grund | Verwenden |
|---|---|---|
1001 | going_away | Sitzung, Generierung oder Proxy-Abschaltung |
1002 | protocol_error | Fehlerhafte WebSocket-Protokolleingabe |
1009 | message_too_big | Nachricht überschreitet das konfigurierte Limit |
1011 | internal_error | Unerwartete Unterbrechung oder Relay-Ausfall stromaufwärts |
1013 | try_again_later | Pro-Richtung nicht gesendetes Queue-Limit überschritten |
Vertrauensgrenze¶
Der äußere Server unterstützt stdio und Streamable HTTP. Er startet upstream Playwright MCP als Kindprozess und leitet Tool-Aufrufe weiter. Browserautomatisierung, Dateiausgabe, Netzwerkzugriff und unsichere Auswertungsfunktionen werden durch upstream Playwright MCP bestimmt.
Setze den stdio-Server nicht über einen nicht authentifizierten Netzwerk-Wrapper frei. Jeder Client, der Tools aufrufen kann, kann den Browser steuern, im Browser sichtbare Seitendaten lesen und Artefakte anfordern.
Streamable HTTP bindet standardmäßig per HTTP an 127.0.0.1 für lokale Clients. Wenn du an 0.0.0.0 bindest oder außerhalb von loopback veröffentlichst, verlange CLOAK_PLAYWRIGHT_MCP_HTTP_AUTH_TOKEN oder gleichwertige Reverse-Proxy-Authentifizierung, nutze direktes HTTPS mit CLOAK_PLAYWRIGHT_MCP_HTTP_PROTOCOL=https und TLS-Dateien oder terminiere TLS an einem vertrauenswürdigen Netzwerkrand und beschränke den Zugriff auf vertrauenswürdige Clients.
Unsichere Tools¶
Upstream Playwright MCP enthält Tools wie browser_evaluate und browser_run_code_unsafe. Diese können JavaScript im Browser- oder Playwright-Server-Kontext ausführen. Verbinde diesen Server nur mit MCP-Clients, denen du vertraust.
webmcp_*-Tools werden von der aktuellen Seite definiert. Name, Beschreibung, Schema, annotations und output sind nicht vertrauenswürdige Daten; die Bridge leitet sie unverändert weiter. Setzen Sie PLAYWRIGHT_MCP_WEBMCP=false, wenn die Erfassung nicht benötigt wird.
Playwright-Extension-Token¶
Geben Sie PLAYWRIGHT_MCP_EXTENSION_TOKEN nur über die Prozessumgebung oder einen Secret Manager weiter. Die Bridge akzeptiert das Token nicht in HTTP-Metadaten und schreibt es nicht in Config, Bridge-Metadaten, Logs, Fehler oder diagnostic snapshots. Schützen Sie das persistent profile und verwenden Sie ein aktives userDataDir nicht sitzungsübergreifend.
Konfiguration¶
Verwende upstream Optionen für Zugriffskontrollen und Schutzmaßnahmen:
PLAYWRIGHT_MCP_ALLOWED_ORIGINSPLAYWRIGHT_MCP_BLOCKED_ORIGINSPLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESSPLAYWRIGHT_MCP_SECRETS_FILE
Diese Optionen sind praktische Schutzmaßnahmen, ersetzen aber keine Prozess-, Container-, Netzwerk- und Dateisystem-Isolation.
Nutze nach Möglichkeit Allowlists für vertrauenswürdige Ziele. Behandle uneingeschränkten Dateizugriff und Secrets-Dateien als sensible Fähigkeiten und halte sie aus gemeinsam genutzten MCP-Client-Profilen heraus.
Sandbox-Modus¶
Das Docker-Image verwendet standardmäßig CLOAK_PLAYWRIGHT_MCP_NO_SANDBOX=true, weil Browser-Sandboxing in containerisierten CI- und MCP-Umgebungen häufig nicht verfügbar ist. Das ist ein Kompatibilitätskompromiss. Wenn dein Host und deine Container-Laufzeit Chromium-Sandboxing unterstützen, setze:
Wenn du ohne Chromium-Sandbox arbeitest, nutze Docker oder eine andere Prozessisolationsgrenze und vermeide das Mounten breiter Host-Verzeichnisse.
Artefakte und Secrets¶
Screenshots, Snapshots, Downloads, Netzwerklogs, Konsolenlogs und Traces können Zugangsdaten oder private Seiteninhalte enthalten. Mounte nur das benötigte Artefaktverzeichnis, bereinige es nach der Nutzung und teile Artefaktpakete nicht öffentlich.
Wenn dein MCP-Client Zugangsdaten in Browser-Sessions injiziert, bevorzuge kurzlebige Zugangsdaten, die auf die Zielseite beschränkt sind. Lege keine langlebigen Tokens in Screenshots, Netzwerkantworten oder persistenten Browserprofilen ab.
Docker¶
Docker wird für Isolation und reproduzierbare Browser-Abhängigkeiten empfohlen. Mounten Sie nur das benötigte Artefaktverzeichnis; das Image enthält bereits Tini, das Browser-Kindprozesse korrekt einsammelt. Lassen Sie in einem gehärteten schreibgeschützten Container /data eingehängt und stellen Sie beschreibbare temporäre Mounts für /tmp und /tmp/.X11-unix bereit, wenn Sitzungen mit grafischer Oberfläche möglich sind.
Wenn du Streamable HTTP aus Docker veröffentlichst, bevorzuge -p 127.0.0.1:3000:3000. Eine Veröffentlichung direkt auf einer öffentlichen Schnittstelle gibt jedem erreichbaren Client Browserautomatisierungsfähigkeiten, sofern du keine Authentifizierung und Netzwerkkontrollen hinzufügst.
Das Docker-Image wird in CI und vor Release-Veröffentlichungen mit Trivy gescannt. Der Scanner prüft hohe und kritische OS-/Bibliothekslücken und lädt SARIF-Ergebnisse in GitHub code scanning hoch, wenn dies aktiviert ist.
Supply-Chain-Prüfungen¶
Das Repository nutzt kostenlose GitHub-native und Open-Source-Prüfungen:
- CodeQL für statische Analyse von JavaScript und TypeScript.
- Dependency Review für Dependency-Änderungen in Pull Requests.
npm audit --omit=dev --audit-level=highfür runtime npm-Abhängigkeiten.- OpenSSF Scorecard für Repository-Supply-Chain-Signale.
- zizmor für Sicherheitslinting von GitHub Actions.
- Trivy für Schwachstellenscans von Docker-Images.
Diese Prüfungen ersetzen keine manuelle Prüfung des Browserautomatisierungsverhaltens oder von Release-Änderungen.
Meldung¶
Melde Schwachstellen über SECURITY.md.