npm / playwright-core / 1.65.0-alpha-1792021904000
playwright-core 1.65.0-alpha-1792021904000
- Source
- https://github.com/microsoft/playwright
- Commit scanned
d96199f58b23- Directory
packages/playwright-core- Compared with
cfe490d941f9(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 0 warn · 26 info
- Scan time
- 18.9 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-15 00:09
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 at its macOS app-bundle path with --version.Reasoning
The backslash escapes are ordinary shell quoting for an application bundle path containing spaces. The command is a plain version check on the installed Chrome Beta binary, so nothing is hidden.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Runs the Microsoft Edge Beta binary at its app-bundle path with --version after cleaning up a temp package.Reasoning
The escaped spaces are needed to reference the Microsoft Edge Beta app bundle path. The script removes a temporary package and then runs the browser's --version, which is routine install-script behaviour.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Runs the Microsoft Edge Dev binary at its app-bundle path with --version after removing a temp package.Reasoning
Same pattern as the Edge Beta script: escaped spaces in an app-bundle path, followed by a version check. No obfuscation of the command's intent is evident.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Loads a browser reference directory's package.json to read its version.Reasoning
The require specifier is path.join of a browser's reference directory with 'package.json', which is a local, fixed-name metadata file. The flag is only the non-literal specifier, and the file is read to get a version string.
-
-
-
; ; ;likely benign Requires the package's own package.json via a path computed from the package root.Reasoning
This loads the project's own package.json from a root computed from __dirname. This is a standard way to read package metadata and has no sign of malicious loading.
-
# 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 idiom that uses eval to word-split DEFAULT_JVM_OPTS and related options into positional arguments.Reasoning
The eval "set -- $(...)" construct is the well-known idiom in the official Gradle wrapper script for splitting JVM options safely. It is standard upstream boilerplate, not an encoded dropper.
-
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 binary with its arguments.Reasoning
exec "$JAVACMD" "$@" is the final launch line in the standard Gradle wrapper, running java with the wrapper's arguments. It is expected behaviour for this file.
-
-
-
likely benign Decodes base64 file contents to build File objects for simulated drag-and-drop.
Reasoning
atob decodes base64 file payloads that are used to construct File objects for a DataTransfer, which is how file drops are simulated in the DOM. The decoded bytes are not executed or fetched.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Parses an expression string via the Function constructor to test whether it is a valid expression, without running it.Reasoning
new Function('(' + expression + ')') is used only as a syntax probe to decide whether a serialized expression parses, and it is never invoked. The pattern is common in browser automation serializers, though it compiles caller-supplied text.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second Function-constructor syntax probe in the expression serializer's fallback path.Reasoning
This is the second fallback syntax probe in the same serializer, again compiling but not executing the expression. It has the same benign purpose and the same caveat about compiling input text.
-
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 link target directory found in the local browser registry.Reasoning
The require target is path.join of a symlink target read from the local registry, with a fixed browsers.json filename. Loading a JSON file through a symlink is unusual but supports the browser registry logic, and the code only parses descriptors.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Requires the package's browsers.json from the package root to create the registry.Reasoning
This requires the package's own browsers.json from the package root to construct the registry. It is the standard way the module loads its static configuration.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a user-supplied JavaScript expression inside a locator's element context as the evaluate tool's core function.Reasoning
eval(`(${expr})`) runs a caller-supplied JavaScript expression in the page context. That is the stated purpose of this evaluate tool, so the eval is intentional. The risk is real for an automation tool but comes from its designed function rather than hidden code.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates a user-supplied JavaScript expression at page level as the evaluate tool's core function.Reasoning
This is the same design as the locator variant: an intentional eval of a supplied expression in the page for the page-level evaluate tool. It is a feature with inherent injection risk, not concealed malicious code.
-
likely benign Dynamic require of a configured init-page module inside a browser tab helper.
Reasoning
The require specifier is the initPage variable, which appears to be a user-configured init-script path. Loading a user-supplied init module is a documented extension point in a browser automation tool, not an obfuscation technique. The risk is that the path could come from untrusted input, but the snippet shows no sign of that, and the surrounding try/catch is ordinary error handling.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/tools/cli-client/program.ts:78:16const clientInfo = ; const help = ; const argv = process.argv.;likely benign Require of a bundled help.json resource via a path helper in the CLI client.Reasoning
The specifier is libPath('tools','cli-client','help.json'), a fixed internal path to a bundled JSON help file. It only looks dynamic because it goes through a path helper. Loading a local JSON resource this way is routine.
-
: Promise<playwright.>likely benign Runtime require of a playwright library selected from a browser descriptor for cross-version connect.Reasoning
The specifier is descriptor.playwrightLib, so the playwright module is chosen at runtime by the caller. This fits a cross-version connection utility that picks the matching library for a browser descriptor. The snippet shows no encoding or hidden behaviour. The residual doubt is whether the descriptor could carry attacker-chosen module paths, which would make the require an arbitrary code load.
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.
&&