T08 · Insecure Dependencies
- Location
SKILL.md:10- Finding
Unpinned Puppeteer Dependency Creates a Mutable Supply-Chain Risk
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:10
Vulnerability Type: Unpinned third-party dependency installation
Risk Level: MediumVulnerable code snippet:
bash npm install puppeteerTechnical Analysis
The installation instruction does not specify an exact Puppeteer version. The project also has no declared dependencies or lockfile, making dependency resolution non-reproducible. Each execution of this command can install a different release from the configured npm registry.
This does not demonstrate that Puppeteer itself is malicious. However, it creates a supply-chain exposure because the code installed in the future may differ from the version reviewed during the audit. Package installation can also execute lifecycle scripts with the privileges of the user running npm.
Attack Path
- An attacker compromises the relevant package publication channel, registry response, maintainer account, or dependency chain.
- A malicious or compromised release becomes the version selected by npm.
- A user follows the skill documentation and runs
npm install puppeteer. - npm downloads the mutable dependency tree and may execute package lifecycle scripts.
- The compromised package executes under the installing user's account or is loaded when the screenshot workflow runs.
Impact Assessment
Successful exploitation could allow arbitrary code execution with the privileges of the user performing installation or running the skill. Depending on that user's permissions, the affected scope could include project files, accessible credentials and environment variables, browser data, network-accessible resources, and other files writable by the account. No privilege escalation, persistence, or active malicious package was identified in the audited project.
- Remediation
View remediation
Remediation Suggestions
- Declare Puppeteer in
package.jsonusing an exact, reviewed version rather than an unbounded installation command. - Generate and commit
package-lock.jsonso the complete transitive dependency graph and integrity hashes are fixed. - Replace the documented installation procedure with
npm ci, which installs from the lockfile and rejects dependency manifest inconsistencies. - Review dependency updates before changing the pinned version or lockfile.
- Run package installation and browser automation with a dedicated, least-privileged account or isolated container.
- Where operationally practical, disable unnecessary npm lifecycle scripts during installation and explicitly approve packages that require them.
- Configure npm to use a trusted registry and apply dependency vulnerability and provenance checks in continuous integration.
- Declare Puppeteer in
