CodeVetter · Repo Unpack · Risk map
puppeteer/puppeteer
These are security-sensitive source observations and explicitly labeled hypotheses, not confirmed vulnerabilities. The largest trust boundaries involve browser executables, downloaded archives, remote debugging endpoints, host callbacks, and filesystem paths. Platform utilities and protocol differences add compatibility and failure-path uncertainty. The bounded inspection also identified a likely extension-launch synchronization issue requiring runtime reproduction.
- BrowserLauncher inherits process.env by default and spawns a configured executable with consumer arguments; Chrome additionally honors PUPPETEER_DANGEROUS_NO_SANDBOX=true by adding --no-sandbox.
- BrowserURL connection performs a caller-directed fetch and trusts webSocketDebuggerUrl; Node channel connection reads DevToolsActivePort from the browser profile, making endpoint and profile provenance relevant trust boundaries.
- HTTP authentication sends username/password through CDP, while Connection's optional send logger records serialized protocol messages; enabling that logger can expose authentication payloads.
- exposeFunction installs browser-visible bindings backed by caller-provided host functions and new-document scripts; screenshot file output forwards caller paths directly to environment.writeFile.
- Archive integrity verification is optional through expectedHash; installUrl reuses an existing archive without calling downloadFile, and archive-only mode returns an existing file before the verification branch.
- Extraction crosses subprocess boundaries through native ZIP utilities, bzip2/xz, DMG mounting/copying, and Windows installers; escaping-symlink validation is explicit in the yauzl implementation, so that test does not establish equivalent native-tool behavior.
- Optional dependency installation runs root-only apt-get satisfy using downloaded deb.deps; experimental bisect downloads an upstream main-branch Python script into the home directory and executes python3.
- Hypothesis: extension-enabled launch can complete before extension installation settles because Promise.all receives one nested array of installation promises rather than the promises themselves; rejection propagation may also be lost. (inferred)