Grades are a hygiene check, not a security guarantee.

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.

Graded by PlugVetRubric v2

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:

View source

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.

Read how this letter is chosen