CVE-2026-63175 Overview
CVE-2026-63175 affects PlaywrightCapture, a Python library used by the Lookyloo project to perform browser-based captures. The library stored capture-specific configuration and runtime data as mutable class-level variables instead of instance-level variables. Multiple Capture objects running within the same Python process shared state, including HTTP headers, cookies, browser storage, HTTP credentials, proxy configuration, user-agent settings, geolocation data, and captured request data. In concurrent or multi-user deployments, information from one capture could leak into another. The issue is categorized under [CWE-613] (Insufficient Session Expiration).
Critical Impact
Concurrent capture operations can leak authentication cookies, credentials, and captured request data across users, and can cause requests to execute under another capture's authentication or proxy context.
Affected Products
- Lookyloo PlaywrightCapture (versions prior to commit 1e354b9)
- Python applications instantiating multiple Capture objects in a shared process
- Multi-user deployments of Lookyloo relying on PlaywrightCapture
Discovery Timeline
- 2026-07-15 - CVE-2026-63175 published to NVD
- 2026-07-16 - Last updated in NVD database
Technical Details for CVE-2026-63175
Vulnerability Analysis
The Capture class in playwrightcapture/capture.py declared per-capture settings as class attributes rather than initializing them in __init__. In Python, mutable class attributes are shared across every instance of the class. When one Capture instance assigned values such as headers, cookies, storage, or credentials, the changes were visible to all other instances within the same interpreter process.
This broke isolation between capture jobs. A parallel capture running on behalf of a different user could observe or reuse authentication material set by another job. Requests could also be issued using a proxy or user-agent belonging to a different capture context, potentially reaching resources the requesting user was not authorized to access.
Root Cause
The root cause is improper scope of state variables. Fields such as _requests, _headers, _cookies, _storage, _http_credentials, _proxy, _user_agent, and _geolocation were defined at class scope with mutable default values ({}, []). All Capture instances therefore referenced the same underlying dictionaries and lists, causing cross-instance state contamination.
Attack Vector
Exploitation requires low-privilege authenticated access to a multi-tenant PlaywrightCapture deployment and the ability to submit a capture job concurrently with another user. No user interaction from the victim is needed. The attacker submits a capture that writes attacker-controlled configuration or reads state left behind by a prior capture, exposing session cookies, HTTP credentials, or captured request payloads.
_default_timeout: int = 90 # set to 90s by default
_minimal_timeout: int = 15 # set to 15s - It makes little sense to attempt a capture below that limit.
- _requests: dict[str, bytes] = {}
-
- # Initialize the values with getter/setter
- _headers: Headers = {}
- _cookies: list[Cookie] = []
- _storage: StorageState = {}
- _viewport: ViewportSize | None = None
- _user_agent: str = ''
- _http_credentials: HttpCredentials = {}
- _geolocation: Geolocation = {}
- _timezone_id: str = ''
- _locale: str = 'en-US'
- _color_scheme: Literal['dark', 'light', 'no-preference', 'null'] | None = None
- _java_script_enabled: bool = True
- _capture_timeout: int = _default_timeout
- _proxy: ProxySettings = {}
-
# Do not wait for webfonts before taking screenshots.
_env: dict[str, str | float | bool] = {'PW_TEST_SCREENSHOT_NO_FONTS_READY': '1'}
Source: GitHub Commit for PlaywrightCapture — the patch removes class-level declarations and moves initialization into the Capture constructor so each instance holds its own state.
Detection Methods for CVE-2026-63175
Indicators of Compromise
- Capture results containing cookies, credentials, or headers that do not correspond to the requesting user's submission.
- Log entries showing outbound requests using a proxy or user-agent not configured for the initiating capture job.
- Unexpected reuse of HttpCredentials or Authorization headers across captures started by different users in the same time window.
Detection Strategies
- Inspect the installed PlaywrightCapture version and confirm whether the deployed commit predates 1e354b9.
- Audit application logs for concurrent Capture instantiations within a single Python process.
- Correlate captured request metadata with the submitting user identity to detect mismatches indicative of state bleed.
Monitoring Recommendations
- Alert when capture jobs emit HTTP requests carrying Authorization, Cookie, or Proxy-Authorization headers that were not supplied by the requesting user.
- Track process-level concurrency of the Lookyloo worker and flag environments running multiple captures per interpreter.
- Monitor egress traffic for proxy endpoints not associated with the active capture configuration.
How to Mitigate CVE-2026-63175
Immediate Actions Required
- Upgrade PlaywrightCapture to a version including commit 1e354b9d8566f49dbb331410be24c7c295645d43 or later.
- Rotate any credentials, cookies, or API tokens that were supplied to PlaywrightCapture during the vulnerable window.
- Review captured artifacts for cross-tenant data exposure and purge sensitive material as required.
Patch Information
The fix removes the class-level attribute declarations for capture state and initializes them as instance variables in the Capture constructor. Details are available in the GitHub Commit for PlaywrightCapture.
Workarounds
- Run each capture in a dedicated Python process to prevent shared class state across jobs.
- Serialize capture execution so only one Capture instance exists in a process at a time.
- Restrict PlaywrightCapture access to a single trusted user until the patch is applied.
# Upgrade to a patched revision from source
pip install --upgrade \
"git+https://github.com/Lookyloo/PlaywrightCapture@1e354b9d8566f49dbb331410be24c7c295645d43"
# Verify installed version
python -c "import playwrightcapture; print(playwrightcapture.__file__)"
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

