npm / playwright-core / 1.65.0-alpha-2026-10-21
playwright-core 1.65.0-alpha-2026-10-21
- Source
- https://github.com/microsoft/playwright
- Commit scanned
66070a1eaa0b- Directory
packages/playwright-core- Compared with
27219bd2cc94(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 0 warn · 26 info
- Scan time
- 18.7 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-21 10:41
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 the Chrome Beta binary inside /Applications using escaped spaces in the path.Reasoning
The backslash escapes are just the standard way to write a path with spaces in the Chrome Beta app bundle. The command runs a version check on the installed browser, which is ordinary install-script behaviour.
-
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, then runs the escaped app binary with --version.Reasoning
The escaped spaces only encode the Edge Beta app path. The rm -rf targets a fixed temp .pkg file in /tmp, which is routine cleanup in a reinstall script.
-
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, then runs the escaped app binary with --version.Reasoning
Same pattern as the other reinstall scripts: escaped spaces in a fixed app path and a fixed temp-file cleanup. Nothing obfuscated about it.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Loads a browser reference directory's package.json to read its version.Reasoning
The specifier is path.join of a browser reference directory with 'package.json'. This is a plain read of a version file, not code injection.
-
-
-
; ; ;likely benign Loads the package's own package.json via a path joined from the package root.Reasoning
The path is built from __dirname and the fixed filename package.json. It 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 eval that splits DEFAULT_JVM_OPTS, JAVA_OPTS and GRADLE_OPTS into arguments.Reasoning
The eval of a set -- expansion over JVM options is the well-known boilerplate in the official Gradle wrapper script. Gradle wrapper scripts are typically flagged by scanners like this, and the eval only processes option strings.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Final exec of the resolved Java binary from the Gradle wrapper.Reasoning
exec of $JAVACMD with the forwarded arguments is the standard final line of the Gradle wrapper, launching the resolved java binary.
-
-
-
likely benign Decodes base64 file payloads to build File objects for a synthetic drop event.
Reasoning
atob decodes base64 payloads that are turned into File objects and added to a DataTransfer for simulating drag and drop. The decoded bytes become file data, not executed code.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Syntax-validity check on an expression string while serializing a function argument.Reasoning
new Function('(' + expression + ')') is only used to test whether an expression parses, as part of serializing a function-shorthand. It creates a function without calling it, which is common in tooling.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second syntax-validity fallback for expression serialization using new Function.Reasoning
Same parse-check pattern as the earlier Function call in the same serializer fallback. It validates syntax rather than running attacker-controlled logic.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1201:30linkTarget = .; const browsersJSON = ; const descriptors = ;likely benign Loads browsers.json from a symlink target path in the browser cache.Reasoning
The path is derived from a symlink target in the browsers directory and loads a browsers.json. That is a data-file load, but the link target is read from disk, so it is worth a note. Nothing suggests malice.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the packaged browsers.json to build the browser registry.Reasoning
The path is packageRoot joined with browsers.json, a fixed package data file loaded to construct the registry.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a caller-supplied JavaScript expression in the page for an evaluate tool.Reasoning
eval of a user-supplied expression inside the page's evaluate callback is the intended behaviour of a browser automation evaluate tool. It runs in the page context, not as hidden obfuscation, though it is powerful and deserves review.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates a caller-supplied JavaScript expression on the page for the tab-level evaluate tool.Reasoning
Same as the locator-based evaluate: eval of the supplied expression runs in page context as the tool's designed function. It is by design rather than covert.
-
likely benign Dynamically requires a configured init-page module and calls its default export with the page object.
Reasoning
The require specifier is `initPage`, which appears to be a user-configured init-page script path that the tool runs once per page. Loading a user-supplied script is a deliberate feature, not obfuscation, and the snippet shows no encoding or hidden payload. The residual risk is that it executes whatever path is configured, so it is a code-execution surface rather than a concealed one.
-
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 via a path helper with literal segments.Reasoning
The specifier is `libPath('tools', 'cli-client', 'help.json')`, built from literal path segments and pointing to a bundled JSON file. The flag is only a non-literal-specifier heuristic. Loading a static help file this way is ordinary code.
-
: Promise<playwright.>likely benign Requires a Playwright library module named by a descriptor field, then uses it to connect to a browser.Reasoning
The specifier comes from `descriptor.playwrightLib`, so the module loaded depends on the descriptor's contents. That is consistent with a cross-version Playwright connector that picks a library by version. The snippet shows no concealment, but whether the descriptor can be influenced by untrusted input is outside what it shows, which keeps confidence moderate.
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.
&&