Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2025-47241 — browser-use

🔴 CVSS 9.5 — Critical ✅ No Known Exploit CWE-647 NVD
9.5
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Browser Use allows bypassing allowed_domains by putting a decoy domain in http auth username portion of a URL

Summary

During a manual source code review, [ARIMLABS.AI](https://arimlabs.ai) researchers identified that the browser_use module includes an embedded whitelist functionality to restrict URLs that can be visited. This restriction is enforced during agent initialization. However, it was discovered that these measures can be bypassed, leading to severe security implications.

Details

File: browser_use/browser/context.py

The BrowserContextConfig class defines an allowed_domains list, which is intended to limit accessible domains. This list is checked in the _is_url_allowed() method before navigation:

```python

@dataclass

class BrowserContextConfig:

"""

[STRIPPED]

"""

cookies_file: str | None = None

minimum_wait_page_load_time: float = 0.5

wait_for_network_idle_page_load_time: float = 1

maximum_wait_page_load_time: float = 5

wait_between_actions: float = 1

disable_security: bool = True

browser_window_size: BrowserContextWindowSize = field(default_factory=lambda: {'width': 1280, 'height': 1100})

no_viewport: Optional[bool] = None

save_recording_path: str | None = None

save_downloads_path: str | None = None

trace_path: str | None = None

locale: str | None = None

user_agent: str = (

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'

)

highlight_elements: bool = True

viewport_expansion: int = 500

allowed_domains: list[str] | None = None

include_dynamic_attributes: bool = True

_force_keep_context_alive: bool = False

```

The _is_url_allowed() method is responsible for checking whether a given URL is permitted:

```python

def _is_url_allowed(self, url: str) -> bool:

"""Check if a URL is allowed based on the whitelist configuration."""

if not self.config.allowed_domains:

return True

try:

from urllib.parse import urlparse

parsed_url = urlparse(url)

domain = parsed_url.netloc.lower()

# Remove port number if present

if ':' in domain:

domain = domain.split(':')[0]

# Check if domain matches any allowed domain pattern

return any(

domain == allowed_domain.lower() or domain.endswith('.' + allowed_domain.lower())

for allowed_domain in self.config.allowed_domains

)

except Exception as e:

logger.error(f'Error checking URL allowlist: {str(e)}')

return False

```

The core issue stems from the line domain = domain.split(':')[0], which allows an attacker to manipulate basic authentication credentials by providing a username:password pair. By replacing the username with a whitelisted domain, the check can be bypassed, even though the actual domain remains different.

Proof of Concept (PoC)

Set allowed_domains to ['example.com'] and use the following URL:

https://example.com:pass@localhost:8080

This allows bypassing all whitelist controls and accessing restricted internal services.

Impact

  • Affected all users relying on this functionality for security.
  • Potential for unauthorized enumeration of localhost services and internal networks.
  • Ability to bypass domain whitelisting, leading to unauthorized browsing.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality none, integrity low, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: High — the attacker first has to win a race, learn a secret or otherwise prepare the target.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Changed — a successful attack reaches components beyond the vulnerable one.
  • Confidentiality impact: None.
  • Integrity impact: Low — limited, and the attacker does not choose what is affected.
  • Availability impact: None.

Weakness class

CVE-2025-47241 is classified as CWE-647: Use of Non-Canonical URL Paths for Authorization Decisions. The product defines policy namespaces and makes authorization decisions based on the assumption that a URL is canonical. This can allow a non-canonical URL to bypass the authorization.

Affected software

CVE-2025-47241 is recorded against 2 packages.

  • browser-use (fixed in 0.1.45)
  • unknown

Timeline and source

Published on 29 June 2026 and last revised on 13 July 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Package)
github.com (Web)
pypi.org (Package)
github.com (Advisory)

Other advisories for this package

browser-use has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-647: Use of Non-Canonical URL Paths for Authorization Decisions) in other software:

Details

Severity CRITICAL
CVSS Score 9.5
CVSS Vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:N
CWE CWE-647
Public Exploit ✅ No
Source NVD
Published 2026-06-29
Updated 2026-08-20
Modified 2026-07-13
Fix URL N/A

Affected Packages

Software From version Fixed in
browser-use 0.1.45
unknown

Similar Threats

Exploit Protection

Are you running browser-use?

CVE-2025-47241 carries CVSS 9.5 Critical rating. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2025-47241 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2025