npm / playwright-core / 1.64.1-beta-1792067398000
playwright-core 1.64.1-beta-1792067398000
- Source
- https://github.com/microsoft/playwright
- Commit scanned
0915b2e91289- Directory
packages/playwright-core- Compared with
cfe490d941f9(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 2 critical · 0 warn · 24 info
- Scan time
- 16.0 s
- LLM review
- Reviewed by claude-haiku-5-5 (Anthropic): 17 of 17 warn and critical signals; 15 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+…⟩.
-
evalResult = await locator..suspicious Evaluates a caller-provided JavaScript expression in the page context.Reasoning
eval of a caller-supplied expression inside a page evaluate context. This is a deliberate feature of an MCP browser tool that runs model/user-provided JavaScript in the browser, so it is dynamic execution by design rather than hidden malware. The risk is real for an agent-driven tool, but it is not obfuscation.
-
evalResult = await tab..suspicious Evaluates a caller-provided JavaScript expression in the page for the evaluate tool.Reasoning
Same by-design eval of user-supplied expression in tab.page.evaluate for the browser-automation evaluate tool. Expected functionality, though it is a code-execution surface worth reviewing.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1likely benign Invokes Chrome Beta binary via a path with escaped spaces.Reasoning
Backslash-escaped spaces in a macOS application path are the standard way to write paths with spaces in bash; the command is simply invoking the Chrome Beta binary with --version. Not obfuscation.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Runs Edge Beta --version using an escaped-space app path.Reasoning
Escaped spaces in the Microsoft Edge Beta app path are ordinary bash quoting for a path containing spaces. The script removes a temp pkg and checks the version; no hidden command.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Runs Edge Dev --version using an escaped-space app path.Reasoning
Same pattern as the other browser reinstall scripts: escaped spaces in an app bundle path for Microsoft Edge Dev. Legitimate quoting, not concealment.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Reads a browser's package.json version via require on a joined path.Reasoning
Requiring package.json from a computed browser reference directory is a normal way to read a version. The path is internal to the tool, not attacker-controlled input in this snippet.
-
-
-
; ; ;likely benign Loads the project's own package.json relative to package root.Reasoning
Loads the package's own package.json from a root computed from __dirname. Standard packaging code 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 eval used to split JVM options into positional args.Reasoning
This is the standard Gradle wrapper script idiom: eval of set -- with xargs-split JVM options is how the official gradlew parses DEFAULT_JVM_OPTS. Flagged by the AST pass, but it is the well-known upstream template.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper exec of the resolved Java command.Reasoning
exec of $JAVACMD with positional args is the standard final line of the Gradle wrapper, launching the resolved Java binary. Expected behavior for this script.
-
-
-
likely benign Decodes base64 payloads into File bytes for simulating file drops.
Reasoning
atob decodes base64 file payloads to build File objects for drag-and-drop/file-input simulation in a browser automation library. Decoding here produces file bytes, not executed code, so the warning's 'before eval' concern does not apply.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Uses new Function to test whether an expression string parses.Reasoning
Function constructor used only to syntax-check a serialized expression, with a fallback for function shorthand. This is a parse probe inside a Playwright-like evaluate serializer; the input is the caller's own expression to be evaluated in the page anyway.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second Function-constructor syntax probe for expression serialization.Reasoning
Same syntax-probe pattern as the previous finding, used while serializing a user-supplied evaluation expression. Expected in a browser automation evaluate path.
-
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
Requires browsers.json from a path read from a symlink (linkPath) to a browsers directory. Reads a local config JSON; it is a data load, not code execution from untrusted input. Some reliance on link target trust, but benign in context.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads bundled browsers.json to build the browser registry.Reasoning
Requires the package's own browsers.json from packageRoot to construct the registry. Standard internal config loading.
-
likely benign Dynamically requires a configured page-initialization module and calls its default export with the page.
Reasoning
The AST pass flags require() with a non-literal specifier. The specifier is an initPage value, which appears to be a user-configured init script path loaded and invoked with the page. That is a plugin or hook pattern, not obfuscation. It would only become a concern if initPage could be set by untrusted input, and the snippet does not show that. The surrounding try/catch and invocation look ordinary.
-
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 from an internal library path for the CLI client.Reasoning
The specifier is libPath('tools', 'cli-client', 'help.json'), a fixed internal path to a bundled JSON file. The non-literal form is only a build-path helper. Nothing in the snippet is encoded, hidden, or executes arbitrary code. This is a false positive from the dynamic-import signal.
-
: Promise<playwright.>likely benign Dynamically requires a Playwright library by configured path to connect to a browser of a given version.Reasoning
require(descriptor.playwrightLib) loads a Playwright library chosen by the browser descriptor, then looks up a browser type by name. This matches the stated purpose of connecting across Playwright versions. The risk is that an attacker controlling the descriptor could load an arbitrary module, but the snippet shows no obfuscation or hidden payload, and the descriptor is an internal configuration object.
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.
&&