T08 · Insecure Dependencies
- Location
SKILL.md:87- Finding
Unpinned and Inconsistently Named Runtime Dependency
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 87–96
Vulnerability Type: Supply-chain risk from remote execution of an unpinned npm package
Risk Level: HighVulnerable Code
bash # zero-config (mock provider — no API key required) AVATAR_PROVIDER=mock npx avatar-runtime # with Live2D local bridge npm run dev:live2d-cubism-bridge # terminal A — bridge on :3755 AVATAR_PROVIDER=live2d LIVE2D_ENDPOINT=http://127.0.0.1:3755 npx avatar-runtime # terminal B # with VRM 3D avatar (free models from https://hub.vroid.com — place .vrm in assets/vrm/slot/) npm run dev:vrm-bridge # terminal A — asset server on :3756 AVATAR_PROVIDER=vrm npx avatar-runtime # terminal BThe same unpinned command also appears at
SKILL.md:277andSKILL.md:310. By contrast,references/WEB-EMBEDDING.md:35identifies the package using the scoped name:js const AvatarWidget = require('@acnlabs/avatar-runtime/widget');Technical Analysis
The documented
npx avatar-runtimecommand may download and immediately execute the latest version of an unscoped npm package. Neither an exact version nor an artifact integrity value is specified. Consequently, the code reviewed by a user can differ from the code later resolved and executed by npm.The unscoped executable name is also inconsistent with the scoped package name
@acnlabs/avatar-runtimeshown in the embedding reference. This creates package-name confusion risk: users may review or intend to trust the scoped package whilenpxresolves a different unscoped package.npm package installation and runtime code can execute arbitrary code under the invoking user's account. Depending on provider configuration, the process may also inherit sensitive environment variables such as
HEYGEN_API_KEYandKUSAPICS_API_KEY. The Skill's recommendation to review the source does not cryptographically bind that reviewed source to the do ...[truncated 1637 chars]- Remediation
View remediation
Remediation Suggestions
-
Replace the unscoped package command with the verified canonical scoped package and an exact version, for example:
bash npx --yes @acnlabs/avatar-runtime@0.2.1 -
Confirm that the package version matches the Skill documentation and verified upstream release before execution.
-
Prefer a local, lockfile-controlled installation:
bash npm install --save-exact @acnlabs/avatar-runtime@0.2.1 npm ciCommit
package-lock.jsonand preserve npm integrity metadata. -
Verify package publisher identity, npm provenance, release signatures where available, and the relationship between the registry artifact and the reviewed source repository.
-
Run the package in a sandbox or container with:
- A read-only or narrowly scoped filesystem.
- No unnecessary host mounts.
- Restricted outbound network access.
- A non-privileged user.
- Only the provider credentials required for the selected operation.
-
Avoid exposing credentials globally in a shell session. Supply narrowly scoped, short-lived credentials only to a verified process, and rotate them if an untrusted package may have received them.
-
Pin all referenced asset-download scripts and external assets to reviewed versions and cryptographic digests.
-
Make the package name consistent throughout
SKILL.mdandreferences/WEB-EMBEDDING.mdso the package executed is the same package users are instructed to review.
-
