npm / playwright-core / 1.65.0-alpha-2026-10-16
playwright-core 1.65.0-alpha-2026-10-16
- Source
- https://github.com/microsoft/playwright
- Commit scanned
034f230cc68b- Directory
packages/playwright-core- Compared with
a038fe7e0eb9(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 1 warn · 25 info
- Scan time
- 16.8 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-16 23:26
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
likely benign Dynamic require of an init-page module that is then invoked with the browser page.
Reasoning
The require uses a variable initPage, so the module path is not literal. The snippet shows it is an init hook called with the page, which fits a configurable setup script in a browser automation tool. Nothing shown is encoded or hidden. Loading a path from configuration is still a code-execution surface, so this is not fully settled from the snippet alone.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1likely benign Invokes the Chrome Beta binary on macOS with --version, with spaces in the path escaped.Reasoning
The backslash escapes are ordinary bash quoting for spaces in the macOS application bundle path. The command is a plain version check on Chrome Beta, so nothing is hidden.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Removes a temp package and runs the Microsoft Edge Beta binary with --version.Reasoning
The escapes are standard shell quoting for spaces in the Edge Beta app path. The script removes a temporary package and then runs a version check, which is routine for a reinstall helper.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Removes a temp package and runs the Microsoft Edge Dev binary with --version.Reasoning
Same pattern as the Edge Beta script: escaped spaces in the app path for a version check, with no obfuscation of the command itself.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Reads a package.json from a browser reference directory to get its version.Reasoning
The require argument is path.join of a browser reference directory and the literal 'package.json'. The target is a fixed file name inside a known directory, so this is a normal dynamic JSON load.
-
-
-
; ; ;likely benign Loads the package's own package.json via a path-joined require.Reasoning
The path is built from the package root and the literal 'package.json', which is the standard way to load a package's own manifest.
-
# 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 and related options into arguments.Reasoning
This is the standard Gradle wrapper idiom for splitting JVM options safely with eval set --. It is upstream boilerplate, not attacker-controlled code.
-
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
The exec of $JAVACMD is the final launch step of the standard Gradle wrapper, where JAVACMD is resolved from JAVA_HOME or the PATH.
-
-
-
likely benign Decodes base64 file payloads to construct File objects for a simulated drop.
Reasoning
The atob decodes base64 file payloads and builds File objects for a DataTransfer drop simulation. The decoded bytes are not fetched or evaluated, so this is ordinary data handling in a browser automation library.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Syntax-check probe for an expression string while serializing JavaScript values.Reasoning
new Function is used only to test whether a serialized expression parses, as a syntax probe for shorthand handling. It does not run untrusted content, which is a common pattern in serializers.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Fallback syntax-check of an expression string in the JavaScript serializer.Reasoning
This is a second syntax-check fallback using new Function in the same serializer, with the same benign purpose of validating expression syntax.
-
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-resolved directory in the registry.Reasoning
The path is the symlink target joined with the fixed name 'browsers.json', which is a normal config load for the browser registry. The input is local tool configuration.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the package's browsers.json manifest to construct the registry.Reasoning
The require loads browsers.json from the package root via path.join, which is the package's own registry manifest. Nothing here is attacker-controlled.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a caller-supplied expression inside a page context for an evaluate tool.Reasoning
This is a browser-automation evaluate tool that intentionally runs caller-supplied JavaScript expressions in the page. The eval is the tool's purpose, not hidden obfuscation, but it is real arbitrary code execution, so it is worth noting rather than dismissing.
-
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 a page-level evaluate tool.Reasoning
Same design as the locator variant: a page-evaluate tool that executes the caller's expression by design. Intentional code execution in an automation tool, not a hidden 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 via a path helper with fixed segments.Reasoning
The require argument is libPath('tools','cli-client','help.json') with literal segments, so it loads a bundled JSON help file. The AST rule flags any non-literal specifier, but this one is effectively fixed. No execution of fetched or decoded content appears.
-
: Promise<playwright.>likely benign Dynamically requires a Playwright library chosen by a descriptor to connect to a browser of a matching version.Reasoning
The require target comes from descriptor.playwrightLib and the selected browser type is then used to connect. This matches a cross-version Playwright connection utility. The module path is taken from a descriptor, so if that descriptor could be attacker-controlled it would be a code-loading risk, but the snippet shows only a legitimate connect pattern.
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.
&&