npm / playwright-core / 1.65.0-alpha-2026-10-14
playwright-core 1.65.0-alpha-2026-10-14
- Source
- https://github.com/microsoft/playwright
- Commit scanned
647e485f2ba5- Directory
packages/playwright-core- Compared with
a3401cfe0dcf(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 0 warn · 26 info
- Scan time
- 19.4 s
- LLM review
- Reviewed by claude-haiku-5-5 (Anthropic): 17 of 17 warn and critical signals; 17 demoted to info.
- Disclude version
- 4.0.0
- Scanned (UTC)
- 2026-10-15 00:08
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1likely benign Invokes Chrome Beta's binary by its escaped, space-containing app bundle path to check its version.Reasoning
The backslash escapes are ordinary shell escaping of spaces in the macOS app bundle path /Applications/Google Chrome Beta.app. The command just runs the browser with --version, so this is a normal coding pattern.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Removes a temporary Edge Beta installer package and runs the escaped app bundle binary with --version.Reasoning
The escaped spaces are required to reference the Microsoft Edge Beta.app bundle path. The script removes a temp .pkg file and checks the version, which is consistent with a reinstall helper.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Removes a temporary Edge Dev installer package and runs the escaped app bundle binary with --version.Reasoning
Same pattern as the Edge Beta script: escaped spaces in the app bundle path, plus cleanup of a temp installer package. No obfuscation of intent.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Loads a browser reference directory's package.json at runtime to read its version.Reasoning
The require target is path.join of a browser reference directory with 'package.json'. Reading a package manifest to get its version is routine and not code injection.
-
-
-
; ; ;likely benign Loads the package's own package.json via a computed path.Reasoning
The require resolves package.json relative to the package's own root directory. This is a standard way to read the package's own metadata.
-
# Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) -
# Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) -
# Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) -
# For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -
# For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:233:1eval "set -- $( printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | xargs -n1 |likely benign Gradle wrapper shell idiom that evals parsed JVM options into positional parameters.Reasoning
The eval of set -- with xargs-split JVM options is the standard idiom in the official Gradle wrapper script for parsing DEFAULT_JVM_OPTS and related variables. It is a known, legitimate pattern despite the critical severity.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper's final exec that launches the located Java binary with its arguments.Reasoning
The exec of $JAVACMD with "$@" is the final launch step of the standard Gradle wrapper script. It launches the java binary the wrapper located, which is expected behavior.
-
-
-
likely benign Decodes base64 file payloads to build File objects for simulated drag-and-drop.
Reasoning
The base64 payloads are decoded into bytes to construct a File for a DataTransfer, which is how drag-and-drop file emulation works. The decoded data is not executed or fetched.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Parses a wrapped expression with new Function to test whether it is valid JavaScript.Reasoning
new Function is used only to syntax-check a user expression wrapped in parentheses while serializing a value. It is a parse test, not execution of attacker-controlled logic, and matches the tool's JS evaluation purpose.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Fallback syntax check using new Function during expression serialization.Reasoning
This is the second fallback syntax check in the same serialization routine, parsing the expression with new Function. It validates syntax and does not run hidden payloads.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1201:30linkTarget = .; const browsersJSON = ; const descriptors = ;likely benign Requires a browsers.json whose directory comes from a resolved link target.Reasoning
The path is derived from a symlink target and points to browsers.json, a data file describing browsers. Loading it through require is a common but loose pattern, and the content is not attacker-controlled code in this context.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the bundled browsers.json from the package root to create the browser registry.Reasoning
The require loads browsers.json from the package root to construct the registry. This is the package's own static configuration file.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a caller-provided JavaScript expression in the page context for an evaluate tool.Reasoning
eval runs a caller-supplied expression inside the page's evaluate callback. This is the advertised purpose of an evaluate tool and matches Playwright's page.evaluate semantics. It is risky by design but is not hidden malicious logic, though the eval of unsanitized input is a real concern.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates a caller-provided JavaScript expression at page level for an evaluate tool.Reasoning
Same as the locator variant: eval of a caller-provided expression in the page for the page-level evaluate tool. It is the tool's intended function and not concealed malicious behavior.
-
likely benign Dynamically requires a user-configured init-page module and calls its default export with the page.
Reasoning
The require specifier is an init-page path, which suggests a user- or config-supplied initialization module. Loading a configured plugin is a legitimate pattern, but it is arbitrary code loading controlled by configuration, so the risk depends on where initPage comes from. The snippet shows no obfuscation or encoded payload.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/tools/cli-client/program.ts:78:16const clientInfo = ; const help = ; const argv = process.argv.;dismissed Loads a bundled help.json file through a path helper.Reasoning
The specifier is built by libPath from fixed segments ending in help.json, so it resolves to a bundled static data file. The non-literal argument triggers the rule, but there is no code execution or obfuscation here.
-
: Promise<playwright.>likely benign Dynamically loads a Playwright library named by a descriptor to connect to a browser of a matching version.Reasoning
The require specifier comes from a BrowserDescriptor's playwrightLib field. This fits a cross-version browser connection feature that selects a Playwright library by version. The source of descriptor is not shown, so a malicious descriptor could load arbitrary modules, but the snippet itself shows ordinary, purposeful code.
Reproduce This Scan
Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.
&&