npm / playwright-core / 1.65.0-alpha-2026-10-20
playwright-core 1.65.0-alpha-2026-10-20
- Source
- https://github.com/microsoft/playwright
- Commit scanned
27219bd2cc94- 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
- 17.0 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 Dynamically requires an init-page module and calls its default export with the page object.
Reasoning
The require specifier comes from a variable named initPage, which appears to be a configured init-script path, and the call sits inside a try block that runs the default export on the page. That fits a plugin or init-hook loader. The snippet does not show where initPage originates, so if it were attacker-controlled this would be arbitrary code loading, but nothing here indicates that.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_chrome_beta_mac.sh:13:1likely benign Runs the installed Chrome Beta binary with --version using an escaped path.Reasoning
The backslash-escaped spaces in the path to a macOS .app bundle are the normal way to write a path with spaces in bash. The command just prints the browser version.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Runs the Microsoft Edge Beta binary with --version using an escaped path.Reasoning
Escaped spaces in an application bundle path are ordinary shell quoting. The script removes a temp pkg and then queries the version.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Runs the Microsoft Edge Dev binary with --version using an escaped path.Reasoning
Same pattern as the other reinstall scripts: escaped spaces in a macOS app path, with a version check afterward.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Loads a browser reference directory's package.json to read its version.Reasoning
require of package.json at a path joined from the browser's reference directory is a plain data load for version lookup. No untrusted code is executed beyond reading a JSON file the tool itself manages.
-
-
-
; ; ;likely benign Requires the package's own package.json via a computed path.Reasoning
The path is built from __dirname and a fixed filename, so this loads the package's own package.json. This is standard packaging code.
-
# 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's standard eval to split JVM option strings into arguments.Reasoning
This eval of DEFAULT_JVM_OPTS, JAVA_OPTS and GRADLE_OPTS is the standard boilerplate of the Gradle wrapper script for splitting JVM arguments. It is generated, widely distributed code and not an obfuscated dropper.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/android/driver/gradlew:240:1exec "$JAVACMD" "$@"likely benign Gradle wrapper's final exec that launches the java binary.Reasoning
exec of $JAVACMD with $@ is the normal final step of the Gradle wrapper, launching the resolved Java binary with its arguments.
-
-
-
likely benign Decodes base64 file contents into File objects for simulated drag-and-drop.
Reasoning
atob decodes base64 payloads sent by the caller into bytes that become File objects for a DataTransfer. This is a legitimate way to simulate file drops in browser automation. The decoded data is not executed.
-
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 invoking it.Reasoning
new Function is used only to test whether an expression string parses, as a fallback for serializing function shorthands. The result is never run. This is a syntax probe, not a dropper.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second syntax-probe Function construction in the serialization fallback.Reasoning
Same syntax-probe pattern as the earlier Function construction, used in a fallback serialization path. It does not execute attacker-supplied logic.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1201:30linkTarget = .; const browsersJSON = ; const descriptors = ;likely benign Loads browsers.json through a symlink-resolved directory path.Reasoning
The require target is a path joined from a symlink target and browsers.json. This reads the project's own registry config, and the path is not attacker-controlled in an obvious way.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Requires the packaged browsers.json registry file.Reasoning
The file is joined from packageRoot and a fixed name, and loads the package's own browsers.json registry data. This is ordinary configuration loading.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates a user-provided JS expression in the page context for an evaluate tool.Reasoning
This eval runs a caller-supplied JavaScript expression inside the page for an evaluate tool. Arbitrary code execution is the tool's intended function, so it is a design risk rather than hidden obfuscation. The wrapping in parentheses is ordinary expression handling.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates a user-provided JS expression in the page context for the tab evaluate tool.Reasoning
Same as the other evaluate call: running a caller-supplied expression is the feature's purpose. It is a dynamic-execution surface but not concealed malicious 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 with fixed segments.Reasoning
The specifier is built by libPath from fixed literal segments ('tools', 'cli-client', 'help.json'), so it loads a bundled JSON help file. The non-literal flag is a false positive from the static checker, and there is no code execution.
-
: Promise<playwright.>likely benign Requires a Playwright library chosen by a browser descriptor to connect across versions.Reasoning
The module specifier is descriptor.playwrightLib, which selects a Playwright library version for connecting to a browser across versions. That is a legitimate compatibility pattern. The snippet does not show where the descriptor comes from, so a caller-controlled value could load arbitrary modules, which keeps this from being fully settled.
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.
&&