npm / playwright-core / 1.65.0-alpha-2026-10-21
playwright-core 1.65.0-alpha-2026-10-21
- Source
- https://github.com/microsoft/playwright
- Commit scanned
66070a1eaa0b- Directory
packages/playwright-core- Compared with
27219bd2cc94(0 signals introduced since)- Files
- 370 scanned, 49 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 0 warn · 26 info
- Scan time
- 18.4 s
- LLM review
- Reviewed by claude-haiku-5-5 (Anthropic): 17 of 17 warn and critical signals; 17 demoted to info.
- Disclude version
- 4.1.0
- Scanned (UTC)
- 2026-10-22 20:42
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 Chrome Beta's bundled binary by its escaped .app path to check its version.Reasoning
Backslash-escaped spaces in a macOS application bundle path are the normal way to write such a path in bash. The command runs the app's own --version flag. Nothing is hidden.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_beta_mac.sh:11:1likely benign Removes a temporary Edge Beta installer and runs the Edge Beta binary with --version.Reasoning
Same pattern as the Chrome script: escaped spaces in a legitimate /Applications path, followed by a version check. The preceding rm of a temp .pkg is a routine cleanup step.
-
info
warn→ info by reviewobfuscated-command-namepackages/playwright-core/bin/reinstall_msedge_dev_mac.sh:11:1likely benign Removes a temporary Edge Dev installer and runs the Edge Dev binary with --version.Reasoning
Identical structure to the Edge Beta script, with escaped spaces in a normal application path. This is ordinary scripting for macOS app paths.
-
continue; const packageJSON = ; const version = packageJSON.; dirToVersion.;likely benign Loads a browser reference directory's package.json to read its version.Reasoning
The specifier is path.join of a browser reference directory and the literal 'package.json'. It reads a local package manifest for its version, which is a common and benign pattern.
-
-
-
; ; ;likely benign Loads the package's own package.json via a path joined from __dirname.Reasoning
The path is built from __dirname and the literal 'package.json', so this loads the package's own manifest. This is standard in Node packages.
-
# 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 script that splits DEFAULT_JVM_OPTS and JAVA_OPTS into positional arguments via eval.Reasoning
This is the standard Gradle wrapper idiom: eval set -- over xargs-split JVM options. The eval is on locally configured options, not remote input. Gradle's generated wrapper script does this routinely, though the eval is a real injection surface if the env vars are attacker-controlled.
-
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 with user arguments.Reasoning
Standard Gradle wrapper final exec of the resolved java binary with forwarded arguments. This is the expected launch step, not a dropper.
-
-
-
likely benign Decodes base64 file contents into a File object to attach to a synthetic drop event.
Reasoning
atob decodes base64 file payloads into bytes that become a File object for drag-and-drop emulation in the browser DOM. No fetch or eval follows. This is data handling for a browser automation feature.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:315:7likely benign Syntax-checks a user expression by constructing a Function without calling it.Reasoning
new Function is used only to test whether an expression parses, as a syntax check before trying other serialization paths. The function is never invoked. This is a known idiom in JS tooling and is not obfuscated.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/server/javascript.ts:324:9likely benign Second parse-only Function check in the expression serialization fallback.Reasoning
Same parse-only use of new Function as the earlier branch, in a fallback serialization path. It is not executed and there is no evasion.
-
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 symlinked browsers directory target.Reasoning
The path is joined from a symlink target and the literal 'browsers.json', so this loads the registry manifest for installed browsers. This is ordinary configuration loading.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/server/registry/index.ts:1396:38; ;likely benign Loads the package's bundled browsers.json to construct the registry.Reasoning
The path is packageRoot joined with the literal 'browsers.json', which is the package's own bundled registry file. Loading it is routine.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:50:25evalResult = await locator..likely benign Evaluates an agent-supplied JavaScript expression inside the page for a browser evaluate tool.Reasoning
eval runs a caller-supplied expression, but inside the browser page context through locator.evaluate, as the tool's stated purpose. The wrapper is a plain template that is not hidden. This is a powerful capability and a risk surface, not obfuscation or a dropper.
-
info
critical→ info by reviewdynamic-executionpackages/playwright-core/src/tools/backend/evaluate.ts:57:25evalResult = await tab..likely benign Evaluates an agent-supplied JavaScript expression in the page for a page-level evaluate tool.Reasoning
Same design as the locator variant: eval of a caller-supplied expression in the page context via page.evaluate, consistent with the tool's documented function. It is a capability to note, not evidence of malicious intent.
-
likely benign Loads a user-configured init page module via require() with a variable path and calls its default export on the page.
Reasoning
The require() specifier comes from initPage, which appears to be a user- or config-supplied init script path. That is a plugin-style feature, not an obfuscated payload. The risk is that an attacker controlling that config could load arbitrary code, but nothing in the snippet shows the value is attacker-controlled or hidden.
-
info
warn→ info by reviewdynamic-importpackages/playwright-core/src/tools/cli-client/program.ts:78:16const clientInfo = ; const help = ; const argv = process.argv.;dismissed Requires a bundled help.json resource through a path helper.Reasoning
The specifier is libPath('tools','cli-client','help.json'), a fixed internal JSON resource built from literal path segments. The non-literal flag comes from the helper call, not from untrusted input. This is a routine static data load.
-
: Promise<playwright.>likely benign Dynamically requires a version-specific Playwright library to connect to a browser.Reasoning
The require() loads a Playwright library chosen by descriptor.playwrightLib so the tool can connect to browsers across Playwright versions. The lookup is a plain property access on a typed descriptor, with no encoding or hiding. It matches a known compatibility pattern.
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.
&&