npm / playwright-core / 1.64.1
playwright-core 1.64.1
- Source
- https://github.com/microsoft/playwright
- Tag scanned
v1.64.1- Directory
packages/playwright-core- Compared with
v1.64.0(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 1 warn · 25 info
- Scan time
- 18.5 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-15 00:08
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
likely benign Dynamically requires an init module by path and calls its default export with the current page.
Reasoning
The require specifier is a variable (initPage) rather than a literal, and the module's default export is invoked with the page. This looks like loading a project-internal init script. The risk is that initPage comes from untrusted input, but the snippet does not show that, so the pattern is most likely a legitimate plugin or init hook.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1likely benign Invokes Google Chrome Beta's binary by its spaced .app path to check its version.Reasoning
The backslash escapes are the standard way to write macOS application paths that contain spaces. The command runs the app's own binary with --version, so this is a normal shell idiom, not hidden behavior.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Runs Microsoft Edge Beta's binary by its escaped .app path to print its version.Reasoning
Escaped spaces in the Edge Beta .app path are required for the shell to resolve the name. The command only queries the version of the installed browser, which fits a reinstall helper script.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Runs Microsoft Edge Dev's binary by its escaped .app path to print its version.Reasoning
Same pattern as the Edge Beta script: escaped spaces in a macOS app path followed by a --version check. Nothing here hides a different command.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Reads a browser reference directory's package.json to record its version.Reasoning
The require target is path.join of a browser's referenceDir with 'package.json', a local package metadata file read to get a version string. The non-literal specifier is a normal dynamic load of a known filename.
-
-
-
; ; ;likely benign Loads the library's own package.json via a path joined from the package root.Reasoning
This loads the package's own package.json from the package root computed from __dirname. It is a standard self-metadata read with no external 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 boilerplate that evals a quoted-argument splitting of JVM options.Reasoning
The eval of a set -- $(...) construction over DEFAULT_JVM_OPTS, JAVA_OPTS and GRADLE_OPTS is the standard Gradle wrapper idiom for splitting quoted option strings into arguments. It is a well-known, unmodified-looking boilerplate pattern.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper's final exec of the resolved Java command with forwarded arguments.Reasoning
exec "$JAVACMD" "$@" is the standard final line of the Gradle wrapper, launching the java binary resolved earlier in the script. It is expected behavior for this file.
-
-
-
likely benign Decodes base64 file payloads into File objects for simulated drag-and-drop.
Reasoning
atob decodes base64 payloads into bytes that are wrapped in a File and added to a DataTransfer for drag-and-drop simulation. The decoded data is not executed or fetched, so the flagged step is data handling rather than a dropper.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Syntax-checks an expression string by constructing a Function, without calling it.Reasoning
new Function('(' + expression + ')') is used only to test whether a serialized expression parses, as a syntax probe before falling back to function shorthand handling. It compiles but does not invoke the code.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second parse-only Function probe in the expression serializer fallback.Reasoning
This is the same parse-only Function construction as the earlier branch, used as a fallback probe in the serializer. The code is compiled to test validity and is not executed here.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1201:30linkTarget = .; const browsersJSON = ; const descriptors = ;likely benign Loads a browsers.json through a path read from a registry link file.Reasoning
The specifier is joined from a linkTarget read from a link file, then loaded as browsers.json. This is a dynamic path, but it only parses JSON data for a registry link and does not run code. Some doubt remains because the path originates from a file on disk.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the bundled browsers.json to construct the browser registry.Reasoning
This loads browsers.json from the package root for the registry constructor. It is a fixed, expected configuration load.
-
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 inside a page locator's evaluate call.Reasoning
eval of a template-wrapped expression runs caller-supplied JavaScript in the page, which is the explicit purpose of this evaluate tool. It is a dangerous capability by design rather than concealed obfuscation, so it is not treated as malicious here.
-
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 in the page for the tab-level evaluate tool.Reasoning
Same design as the locator variant: the tool evaluates a user-supplied expression in the page context as its intended function. The eval is an unsanitized execution sink, but its presence matches the tool's stated behavior.
-
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 for CLI help output.Reasoning
The require target is built from libPath with fixed segments ('tools', 'cli-client', 'help.json') and loads a JSON help file. The AST rule fires on the non-literal call form, but the specifier is effectively constant and the target is data, not code.
-
: Promise<playwright.>likely benign Requires a Playwright library from a descriptor-specified path and connects to a browser via its BrowserType.Reasoning
The module is loaded from descriptor.playwrightLib, a configurable library path, to support connecting across Playwright versions. This is a plausible compatibility mechanism. The dynamic path is worth noting, but nothing in the snippet shows attacker-controlled input or payload handling.
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.
&&