npm / playwright-core / 1.65.0-alpha-2026-10-19
playwright-core 1.65.0-alpha-2026-10-19
- Source
- https://github.com/microsoft/playwright
- Commit scanned
b335271cdc2b- Directory
packages/playwright-core- Compared with
b335271cdc2b(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 1 warn · 25 info
- Scan time
- 19.4 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-20 05:41
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
likely benign Loads an optional page init-script module by a configured path and calls its default export with the page.
Reasoning
The require specifier is `initPage`, which appears to be a user-supplied init-script path loaded and invoked with the page. That is a plausible configuration hook. It does execute arbitrary code, but only a path the user or config chose, and the snippet shows no obfuscation or remote source. The residual doubt is whether `initPage` can be influenced by untrusted input.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1dismissed Runs Google Chrome Beta's --version using an app path with escaped spaces.Reasoning
The backslash escapes are ordinary shell quoting for spaces in the macOS app bundle path. The command is a plain version check on a known application, so the flag is a false positive.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1dismissed Runs Microsoft Edge Beta --version using an app path with escaped spaces.Reasoning
Escaped spaces in the Edge Beta app path are normal shell quoting. The command is a version check after a temp package removal, with nothing hidden.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1dismissed Runs Microsoft Edge Dev --version using an app path with escaped spaces.Reasoning
Same pattern as the Edge Beta script: escaped spaces in a literal app path followed by a version check. No obfuscation of the command's identity.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Reads a browser reference directory's package.json to get its version.Reasoning
The require targets package.json inside a browser reference directory built with path.join. This is a common way to read a local package version and carries no sign of hidden payload loading.
-
-
-
; ; ;likely benign Loads the package's own package.json via a computed path.Reasoning
The require loads package.json from the package root computed from __dirname. This is a standard self-metadata read.
-
# 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 used to split DEFAULT_JVM_OPTS and related options into arguments.Reasoning
This eval set -- with xargs splitting of JVM options is the standard idiom in the Gradle wrapper script. It is widely distributed boilerplate, not a dropper.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper launches the resolved Java binary.Reasoning
The exec of $JAVACMD is the final launch step of the standard Gradle wrapper. The path is resolved from the JAVA_HOME setup earlier in the script.
-
-
-
likely benign Decodes base64 file payloads to build File objects for simulated drag and drop.
Reasoning
Decoding base64 buffers into File objects for a DataTransfer drop simulation is a legitimate browser-automation technique. The decoded data is only attached to a File and not executed.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Parse-checks an expression string with new Function during serialization.Reasoning
new Function here is used as a syntax probe to test whether an expression parses, falling back to function-shorthand handling. It is a parser check in a serialization utility, not execution of attacker code.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second syntax-probe Function call in the serialization fallback path.Reasoning
Same syntax-probe pattern as the earlier Function call, used as a fallback when serializing values. It is consistent with normal parser-based utility code.
-
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.Reasoning
The require path is built from a symlink target read from the local install directory to locate browsers.json. This is a legitimate lookup, though the dynamic path warrants a glance at how linkTarget is validated.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the bundled browsers.json manifest from the package root.Reasoning
The require loads browsers.json from the package root. This is a standard static resource load.
-
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 browser page context.Reasoning
eval of an expression inside the page context is the stated purpose of this browser evaluation tool. It is by-design arbitrary JavaScript execution, so it is a deliberate capability rather than obfuscation. It is risky if the input is untrusted, but the snippet shows no hidden or malicious intent.
-
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 tab-level evaluate tool.Reasoning
Same by-design in-page evaluation of a supplied expression as the locator variant. It is an intended feature of the tool, with the risk coming from the trust placed in its input.
-
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 for the CLI client through a path helper.Reasoning
The specifier is `libPath('tools','cli-client','help.json')`, a fixed relative path to a bundled JSON help file. The non-literal form comes only from a path helper. This is a standard way to load bundled assets and shows no sign of malicious intent.
-
: Promise<playwright.>likely benign Dynamically loads a Playwright library chosen by a descriptor field to connect to a browser of a given version.Reasoning
`descriptor.playwrightLib` selects which Playwright module to load so the code can connect to browsers across versions. The module is chosen from a descriptor the program constructs, not from network input or decoded data. Dynamic module selection by name is a legitimate pattern for version compatibility, though an attacker who controls the descriptor could load an arbitrary module.
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.
&&