npm / playwright-core / 1.65.0-alpha-2026-10-18
playwright-core 1.65.0-alpha-2026-10-18
- Source
- https://github.com/microsoft/playwright
- Commit scanned
b335271cdc2b- Directory
packages/playwright-core- Compared with
6bbe2475ba79(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 1 warn · 25 info
- Scan time
- 17.7 s
- LLM review
- Reviewed by claude-haiku-5-5 (Anthropic): 17 of 17 warn and critical signals; 16 demoted to info.
- Disclude version
- 4.0.0
- Scanned (UTC)
- 2026-10-19 04:56
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
likely benign Dynamically requires a configured init-page module and calls its default export with the page object.
Reasoning
The require path comes from an initPage variable, which appears to be a user- or config-supplied init script that is loaded and invoked with the page. This is a plugin-style hook, a legitimate pattern, though a configurable executable path does widen the attack surface. The snippet does not show where initPage originates, so the verdict rests on the plausible reading.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1dismissed Runs Chrome Beta's --version from its app bundle path, with spaces escaped.Reasoning
The backslash escapes are just shell quoting for spaces in the macOS app bundle path. The command is a plain version check on the installed browser, with no hidden command.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1dismissed Runs Microsoft Edge Beta --version from its app bundle path, with spaces escaped.Reasoning
The escapes are ordinary spaces in the Edge Beta app path, and the same script removes a local pkg file and then checks the version. Nothing is obscured.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1dismissed Runs Microsoft Edge Dev --version from its app bundle path, with spaces escaped.Reasoning
Same pattern as the Edge Beta script: backslash-escaped spaces in the app path for a version check. This is ordinary shell quoting.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;dismissed Reads a package.json via require to obtain a browser's version.Reasoning
The require reads package.json from a browser reference directory to get a version string. Loading JSON this way is routine, and the path comes from the tool's own configuration.
-
-
-
; ; ;dismissed Loads the project's own package.json through a computed path.Reasoning
This loads the package's own package.json relative to __dirname. It is a standard self-reference with a fixed filename and no untrusted input.
-
# 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 eval that word-splits JVM options into positional arguments.Reasoning
This is the standard Gradle wrapper idiom for splitting JVM options with eval set --. The input comes from the local DEFAULT_JVM_OPTS and environment variables, not from the network. It is expected in a vendored gradlew.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper exec that launches the resolved Java binary.Reasoning
This is the standard final exec of the Java binary in the Gradle wrapper, passing the resolved JAVACMD and arguments. It is the expected launcher behavior.
-
-
-
likely benign Decodes base64 payloads into File objects for a synthetic DataTransfer.
Reasoning
The base64 decode rebuilds File objects for a DataTransfer when setting input files or dropping data. This is a normal browser-automation feature, and the decoded data is only wrapped in File objects, not executed.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Syntax-checks an expression string by constructing a Function from it.Reasoning
new Function is used only as a syntax check on a serialized expression to decide whether it parses. It does not run the code, and this is a common pattern in evaluation utilities.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second syntax-check Function construction in the expression serializer fallback.Reasoning
Same as the other Function check: a parse-only attempt on a serialized expression within an error-handling fallback. It does not execute the expression.
-
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 symlink target.Reasoning
The path is built from a symlink target read from the browsers directory, then loads browsers.json through require. Loading a JSON file is data-only, but the path is derived from a filesystem link, so it is worth a note, not a concern.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;dismissed Loads the bundled browsers.json to construct the browser registry.Reasoning
This loads the bundled browsers.json from the package root to build the registry. It is a fixed, expected data file.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a caller-supplied expression in the page for the evaluate tool.Reasoning
This evaluates an expression supplied to a browser-automation evaluate tool inside the page context. Running caller-supplied JavaScript in the page is the tool's stated purpose, not hidden obfuscation. The risk is by design, not concealed.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates a caller-supplied expression in the page for the page-level evaluate tool.Reasoning
Same as the locator variant: eval of a caller-provided expression in the page, which is the intended behavior of this automation tool. It is a dangerous capability that is expected here.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/tools/cli-client/program.ts:78:16const clientInfo = ; const help = ; const argv = process.argv.;likely benign Loads a bundled help.json file via a path helper.Reasoning
The require target is built with libPath from fixed segments ('tools', 'cli-client', 'help.json') pointing at a bundled JSON help file. The non-literal flag is a false positive from the helper call, and there is no sign of obfuscation or code execution.
-
: Promise<playwright.>likely benign Requires a configured Playwright library build and connects to a browser via its browser type.Reasoning
The module is loaded from descriptor.playwrightLib, which lets the tool select a Playwright build matching the browser version, and the result is used only to look up a browser type and call connect. This matches the function's stated purpose. The risk depends on whether the descriptor can be attacker-controlled, which the snippet does not show.
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.
&&