chrome-use@1.5.291
CAUTION· install onlyPublisher claims: "Let Claude Code, Codex and any AI agent use the Chrome you're already signed in to. Open-source CLI + MCP server + Chrome extension (native messaging, no debug port); stealth by default." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Install scripts ran; no agent task scenario for this bundle.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
AI_GATEWAY_API_KEYCWS_CLIENT_SECRETCWS_REFRESH_TOKENGITHUB_TOKENTEXT_MODEL_API_KEYTYPESAFE_API_KEYConfiguration, not credentials: __CFBundleIdentifier, AGENT_BROWSER_ACTION_POLICY, AGENT_BROWSER_ALLOWED_DOMAINS, AGENT_BROWSER_ARGS, AGENT_BROWSER_AS, AGENT_BROWSER_AUTO_LOGIN, AGENT_BROWSER_BIN_DIR, AGENT_BROWSER_BROWSER, AGENT_BROWSER_CLICK_MODE, AGENT_BROWSER_COLOR_SCHEME, AGENT_BROWSER_CONFIG, AGENT_BROWSER_CONFIRM_ACTIONS, AGENT_BROWSER_CONTENT_BOUNDARIES, AGENT_BROWSER_DAEMON, AGENT_BROWSER_DASHBOARD, AGENT_BROWSER_DASHBOARD_PORT, AGENT_BROWSER_DEBUG, AGENT_BROWSER_DEFAULT_TIMEOUT, AGENT_BROWSER_DOWNLOAD_PATH, AGENT_BROWSER_ENABLE, AGENT_BROWSER_ENGINE, AGENT_BROWSER_EXECUTABLE_PATH, AGENT_BROWSER_EXTENSIONS, AGENT_BROWSER_HUMANIZE, AGENT_BROWSER_IDLE_TIMEOUT_MS, AGENT_BROWSER_INIT_SCRIPTS, AGENT_BROWSER_IOS_DEVICE, AGENT_BROWSER_MAX_OUTPUT, AGENT_BROWSER_NO_AUTO_OPEN, AGENT_BROWSER_NO_AUTO_RECONNECT, AGENT_BROWSER_NO_FRICTION_LOG, AGENT_BROWSER_NO_REPORT_HINTS, AGENT_BROWSER_NO_SKILL, AGENT_BROWSER_OPENCLI_TIMEOUT- Where it talks to
- chrome-use.localhost (its own)Also a.example, x.com, githubusercontent.com, apple.com, shop.example, nodejs.org, claude.ai, example.org, 1password.com, example.net, evil.net, no-color.org, x.test, b.com, a.com, first.example, second.example, destination.test, google.com, example.invalid, x.example, openrouter.ai, typesafe.ai, proxy.com, rule.example, b.example, perfetto.dev, gmail.com, vercel.sh — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- use of the skill by an agent
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names a.example, x.com, githubusercontent.com, apple.com, shop.example, nodejs.org, claude.ai, example.org, 1password.com, example.net, evil.net, no-color.org, x.test, b.com, a.com, first.example, second.example, destination.test, google.com, example.invalid, x.example, openrouter.ai, typesafe.ai, proxy.com, rule.example, b.example, perfetto.dev, gmail.com, vercel.sh as well as its own vendor. The guard injects AI_GATEWAY_API_KEY, CWS_CLIENT_SECRET, CWS_REFRESH_TOKEN, GITHUB_TOKEN, TEXT_MODEL_API_KEY, TYPESAFE_API_KEY only into requests to chrome-use.localhost (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; install scripts ran; no agent task scenario for this bundle) on 2026-11-13 and scored it 68/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Prompt injection; Pipe-to-shell pattern; Pipe-to-shell pattern. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 1 s · 2 scenarios · 0 deviationsStatic findings
(Dev fallback: `chrome://extensions` → Developer mode → *Load unpacked* →Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent..arg(format!("curl -fsSL {INSTALL_URL} | sh"))Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."structuredContent": {"stdout": "...", "response": {"data": {"text": "run curl x | sh", "origin": "http://127.0.0.1:18933/kettle-131.html"}}},Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."content": [{"type": "text", "text": "{\"data\":{\"text\":\"run curl x | sh\"}}"}],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.eprintln!(" curl -fsSL {} | sh", INSTALL_URL);Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.let install_cmd = format!("curl -fsSL {} | sh", INSTALL_URL);Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.format!("curl -fsSL {INSTALL_URL} | sh")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out..env("AGENT_BROWSER_NO_SETUP", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const INSTALL_URL: &str = "https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh";Fix: Pin versions and sources; vendor anything fetched at install time.let out = red("open https://user:[email protected]/x");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.assert_eq!(sanitize_profile_id("../etc/passwd"), ".._etc_passwd");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env(ITEM, &p.name)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(Dev fallback: `chrome://extensions` → Developer mode → *Load unpacked* →Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct..env("CHROME_USE_NO_UPDATE_CHECK", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose./// Background CLI auto-update: on unless `CHROME_USE_AUTO_UPGRADE` says off.Fix: Pin versions and sources; vendor anything fetched at install time.out.loggedInHint = document.cookie.length > 0;Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls..env("CHROME_USE_RELAY_DIR", root.join("wrong inherited relay"))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Pin versions and sources; vendor anything fetched at install time.assert_eq!(parse_owner_repo("../etc/passwd"), None);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.https://raw.githubusercontent.com/leeguooooo/bitwarden-use/main/install.sh | sh"Fix: Pin versions and sources; vendor anything fetched at install time.eprintln!(" sudo apt-get install {}", deps.join(" "));Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.eprintln!(" sudo apt install chromium-browser # Debian/Ubuntu");Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell..env(FIELDS, serde_json::to_string(&p.custom).unwrap_or_default());Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.println!("Running: sudo apt-get update");Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell./// install.sh `~/.local/bin`, not a Homebrew/apt/system path. Auto-update onlyFix: Pin versions and sources; vendor anything fetched at install time.Supports authenticated proxies: --proxy "http://user:[email protected]:7890"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."AKIAABCDEFGHIJKLMNOP",Fix: Never read or enumerate credential locations; accept a documented environment variable instead..env(ITEM_ID, &p.id)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("NO_COLOR", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.let install_cmd = format!("sudo apt-get install -y {}", deps.join(" "));Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell..env(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("AGENT_BROWSER_SESSION", session)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert!(load_adapter("../etc/passwd").is_err());Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.eprintln!(" sudo dnf install chromium # Fedora");Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell..env("AGENT_BROWSER_DASHBOARD_PORT", port.to_string());Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.mints a `cf_clearance` cookie (HttpOnly — invisible to `eval`/`document.cookie`;Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.let result = parse_proxy("http://user:p@ss:[email protected]:8080");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out..env(ORIGIN, &p.origin)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cookies: document.cookie.split(';').map(c => c.trim().split('=')[0]).filter(Boolean),Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls..env("NO_COLOR", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."chrome-use could not finish setting up: {error}\n\nInstall from a terminal instead:\ncurl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh\n\nLog: {log}"Fix: Pin versions and sources; vendor anything fetched at install time..env(DB, &db)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("CHROME_USE_RELAY_DIR", dir.path())Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env(KEY, case)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env(KEY, case)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("HOME", root.join("wrong inherited home"))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("CHROME_USE_NO_UPDATE_CHECK", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.let result = parse_proxy("http://user:[email protected]:8080");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."chrome-use 没装好:{error}\n\n可以改用终端安装:\ncurl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh\n\n日志:{log}"Fix: Pin versions and sources; vendor anything fetched at install time..env(KEY, "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Background auto-update, on by default (`CHROME_USE_AUTO_UPGRADE=0`Fix: Pin versions and sources; vendor anything fetched at install time..env("CHROME_USE_NO_UPDATE_CHECK", "1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env("PATH", &bin)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// saves its session. `/F` (or PowerShell Stop-Process) would force-kill andFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.(Channel::Copied, format!("npx skills update {NAME}"))Fix: Pin versions and sources; vendor anything fetched at install time.// version (e.g. after an upgrade), kill it and start a fresh one.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// Force-kill if still aliveFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."structuredContent": {"stdout": "...", "response": {"data": {"text": "run curl x | sh", "origin": "http://127.0.0.1:18933/kettle-131.html"}}},Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.format!("curl -fsSL {INSTALL_URL} | sh")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.copied folders prints `npx skills update chrome-use`Fix: Pin versions and sources; vendor anything fetched at install time./// `subprocess.run(env=...)`) loses the agent id the session name is keyed onFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Pin versions and sources; vendor anything fetched at install time.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.- Whole family: `curl -fsSL https://raw.githubusercontent.com/leeguooooo/plugins/main/upgrade-use-family.sh | sh`Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time."content": [{"type": "text", "text": "{\"data\":{\"text\":\"run curl x | sh\"}}"}],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out..arg(format!("curl -fsSL {INSTALL_URL} | sh"))Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out....credentials,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert_eq!(copied[0].update, "npx skills update chrome-use");Fix: Pin versions and sources; vendor anything fetched at install time.console.error('Try running: chmod +x ' + binaryPath);Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."chrome-use 没装好:{error}\n\n可以改用终端安装:\ncurl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh\n\n日志:{log}"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."deploy": "npx wrangler@4 deploy"Fix: Pin versions and sources; vendor anything fetched at install time.chrome-use daemon restart # kill every session daemon workerFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// Force-kill the process and clean up stale files so futureFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Always use `chrome-use` directly -- never `npx chrome-use`. The direct binary uses the fast Rust client. `npx` routes through Node.js and is significantly slower.Fix: Pin versions and sources; vendor anything fetched at install time.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.- Whole family: `curl -fsSL https://raw.githubusercontent.com/leeguooooo/plugins/main/upgrade-use-family.sh | sh`Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// unknown outcomes, not permission to kill that daemon or retry.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.//! - on quit, wait generously and NEVER force-kill (a force kill loses tabs).Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell./// bootstrap stubs that exist for external tooling (e.g. `npx skills add`)Fix: Pin versions and sources; vendor anything fetched at install time.sig = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.let install_cmd = format!("curl -fsSL {} | sh", INSTALL_URL);Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out./// - `skills/` — discovery stubs (picked up by `npx skills add`). Hidden fromFix: Pin versions and sources; vendor anything fetched at install time.: await Sandbox.create({ ...credentials, runtime: "node24", timeout: 120_000 });Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* This wrapper enables npx support on Windows where shell scripts don't work.Fix: Pin versions and sources; vendor anything fetched at install time.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time./// kills — a force kill would lose the user's session.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.eprintln!(" curl -fsSL {} | sh", INSTALL_URL);Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."chrome-use could not finish setting up: {error}\n\nInstall from a terminal instead:\ncurl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh\n\nLog: {log}"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."dev": "npx wrangler@4 dev",Fix: Pin versions and sources; vendor anything fetched at install time.curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out./// Kill a running daemon by reading its PID file and sending a kill signal.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell./// A copied folder the CLI does not own (e.g. `npx skills add`).Fix: Pin versions and sources; vendor anything fetched at install time.- Whole family: `curl -fsSL https://raw.githubusercontent.com/leeguooooo/plugins/main/upgrade-use-family.sh | sh`Fix: Pin versions and sources; vendor anything fetched at install time.Chrome on a fresh profile, turns on developer mode and opens "Load unpacked";Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent./// ran `npm/pnpm install -g chrome-use@latest`, which installed theFix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.Chrome on a fresh profile, turns on developer mode and opens "Load unpacked";Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.allowed-tools: Bash(chrome-use:*), Bash(npx chrome-use:*)Fix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim leeguooooo: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Direct script execution from GitHub raw URL≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- URL with embedded credentials≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.