MCP, MCP server
com.browser-use/browser-use
Control a real Chrome browser to complete any task: fill forms, extract data, book flights.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit aa093a843da5.
INSTALL_REMOTE_SCRIPT NETWORK_HOST_FROM_INPUT
Why this grade
- INSTALL_REMOTE_SCRIPT Medium
Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).
bin/setup.sh, line 31
curl -LsSf https://astral.sh/uv/install.sh | sh - NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
browser_use/browser/watchdogs/downloads_watchdog.py, line 807
const response = await fetch({escaped_url}, {{
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
browser_use/cli.py, line 101
result = subprocess.run(cmd)
browser_use/utils.py, line 772
subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=package_root, stderr=subprocess.DEVNULL).decode().strip()
browser_use/utils.py, line 777
subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], cwd=package_root, stderr=subprocess.DEVNULL)
Show more
browser_use/utils.py, line 784
subprocess.check_output(['git', 'config', '--get', 'remote.origin.url'], cwd=package_root, stderr=subprocess.DEVNULL)
browser_use/utils.py, line 791
subprocess.check_output(['git', 'show', '-s', '--format=%ci', 'HEAD'], cwd=package_root, stderr=subprocess.DEVNULL)
browser_use/browser/chrome.py, line 54
result = subprocess.run(['which', cmd], capture_output=True, text=True)
browser_use/browser/profile.py, line 887
shutil.rmtree(temp_dir, ignore_errors=True)
browser_use/browser/profile.py, line 1202
shutil.rmtree(extract_dir)
browser_use/browser/watchdogs/local_browser_watchdog.py, line 168
shutil.rmtree(tmp_dir, ignore_errors=True)
browser_use/browser/watchdogs/local_browser_watchdog.py, line 208
shutil.rmtree(tmp_dir, ignore_errors=True)
browser_use/browser/watchdogs/local_browser_watchdog.py, line 505
shutil.rmtree(temp_path, ignore_errors=True)
browser_use/filesystem/file_system.py, line 515
shutil.rmtree(self.data_dir)
browser_use/filesystem/file_system.py, line 1062
shutil.rmtree(self.data_dir)
browser_use/skills/install.py, line 71
result = subprocess.run([uv, 'tool', 'install', '--python', '3.12', '--upgrade', '--force', 'browser-use'])
browser_use/skills/install.py, line 81
result = subprocess.run([exe, 'skill'], capture_output=True, text=True)
browser_use/tokens/service.py, line 107
os.remove(cache_file)
Install and update
Serious
install fetches a script from the network. The docs document an installer that pipes a download into a shell.
INSTALL_REMOTE_SCRIPT INSTALL_DOCUMENTED_INSTALLER
bin/setup.sh, line 31
curl -LsSf https://astral.sh/uv/install.sh | sh
skills/cloud/references/quickstart.md, line 162
- Profile sync (easiest): `curl -fsSL https://browser-use.com/profile.sh | sh`
skills/cloud/references/sessions.md, line 92
curl -fsSL https://browser-use.com/profile.sh | sh
Show more
skills/cloud/references/sessions.md, line 103
curl -fsSL https://browser-use.com/profile.sh | sh
skills/open-source/references/quickstart.md, line 147
export BROWSER_USE_API_KEY=your_key && curl -fsSL https://browser-use.com/profile.sh | sh
skills/qa/SKILL.md, line 52
command -v uv || curl -LsSf https://astral.sh/uv/install.sh | sh # the uv installer, only if missing
.github/workflows/install-script.yml, line 57
run: curl -LsSf https://astral.sh/uv/install.sh | sh
.github/workflows/install-script.yml, line 91
run: curl -LsSf https://astral.sh/uv/install.sh | sh
.github/workflows/install-script.yml, line 116
run: curl -LsSf https://astral.sh/uv/install.sh | sh
browser_use/beta/service.py, line 91
TERMINAL_INSTALL_COMMAND = 'curl -fsSL https://browser-use.com/terminal/install.sh | sh'
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
browser_use/browser/watchdogs/downloads_watchdog.py, line 807
const response = await fetch({escaped_url}, {{
browser_use/browser/watchdogs/downloads_watchdog.py, line 1372
const response = await fetch({escaped_pdf_url}, {{
browser_use/integrations/openai/browser_use.py, line 705
const response = await fetch(url, {redirect: 'error', signal: AbortSignal.timeout(30000)});
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
browser_use/config.py, line 135
return os.getenv('OPENAI_API_KEY', '')
browser_use/config.py, line 139
return os.getenv('ANTHROPIC_API_KEY', '')
browser_use/config.py, line 143
return os.getenv('GOOGLE_API_KEY', '')
Show more
browser_use/config.py, line 147
return os.getenv('DEEPSEEK_API_KEY', '')
browser_use/config.py, line 151
return os.getenv('GROK_API_KEY', '')
browser_use/config.py, line 155
return os.getenv('NOVITA_API_KEY', '')
browser_use/config.py, line 163
return os.getenv('AZURE_OPENAI_KEY', '')
browser_use/config.py, line 167
return os.getenv('SKIP_LLM_API_KEY_VERIFICATION', 'false').lower()[:1] in 'ty1'
AGENTS.md, line 68
touch .env
AGENTS.md, line 77
# add your key to .env file
AGENTS.md, line 83
# add your key to .env file
AGENTS.md, line 89
# add your key to .env file
AGENTS.md, line 94
# add your key to .env file
AGENTS.md, line 991
cp .env.example .env
bin/setup.sh, line 41
echo "[i] Tip: make sure to set BROWSER_USE_LOGGING_LEVEL=debug and your LLM API keys in your .env file"
browser_use/config.py, line 198
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', case_sensitive=True, extra='allow')
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read. the file cap was reached before every file was read.
OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED
browser_use/beta/service.py, line 1
from __future__ import annotations
static/readme/README.md, line 1
# README artwork, diagram, and demo sources
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit aa093a843da5. can delete files. install fetches a script from the network. accepts a host from input, with no fixed list in this file. reads a credential or environment file. a file was over the read cap and was not fully read. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: aa093a843da5edbf323c0b4145c9b6a0db3ecde8
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.