T08 · Insecure Dependencies
- Location
SKILL.md:12- Finding
Unpinned Executable Dependency and Remotely Resolved Skill
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:12-17,SKILL.md:65-66, andSKILL.md:75-77
Vulnerability Type: Unpinned third-party executable dependency and mutable remote Skill retrieval
Risk Level: MediumVulnerable Code
yaml requires: anyBins: - selat - npm install: - kind: node package: "@selat-ai/selat-cli" bins: - selatbash selat --version || npm install -g @selat-ai/selat-clibash selat skill install twitter-research SELAT_ROUTER_URL=https://router.selat.ai \ selat skill verify ~/.config/selat/skills/twitter-researchTechnical Analysis
The npm dependency
@selat-ai/selat-cliis installed without an exact version, lockfile, or integrity digest. The command therefore resolves whatever package version the registry serves at execution time. Because npm packages and their transitive dependencies contain executable code, the effective behavior can change after this Skill has been reviewed.The global installation expands the exposure: package lifecycle scripts and subsequent CLI execution run with the permissions of the invoking user. The separately executed
selat skill install twitter-researchcommand also retrieves a remote Skill whose resolved manifest is not included in the audited project. Consequently, the local artifact cannot independently verify the document's claims that the installed Skill is declarative, read-only, HTTPS-only, vetted, or constrained by appropriate spending limits.This finding identifies a supply-chain weakness rather than evidence that the current SELAT package or service is malicious.
Attack Path
- An attacker compromises the npm publisher account, registry distribution path, a transitive dependency, or the remote Skill distribution channel.
- The attacker publishes a modified package version or replaces the remotely resolved
twitter-researchSkill. - A user follows the d ...[truncated 1702 chars]
- Remediation
View remediation
Remediation Suggestions
- Pin
@selat-ai/selat-clito an exact, reviewed version rather than allowing npm to resolve the latest release. - Publish and verify an integrity hash or signed provenance record for the expected package artifact and its dependency graph.
- Use a committed lockfile and a deterministic installation mechanism such as
npm ci. - Avoid global installation. Run the CLI in an isolated, least-privileged environment, such as a dedicated project directory, container, or restricted user account.
- Review npm lifecycle scripts and consider disabling them during installation when they are not required.
- Include the resolved
twitter-researchmanifest in this project so its endpoints, parameters, spending controls, and read-only guarantees can be audited. - Pin the remote Skill to an immutable version and checksum, and reject any downloaded content whose digest does not match.
- Enforce a local allowlist for network destinations and validate that all endpoints use HTTPS with expected hostnames.
- Require explicit user confirmation for each paid operation, displaying the exact endpoint, amount, and transaction destination independently of remote Skill output.
- Apply wallet-side per-call and cumulative spending limits that cannot be weakened by the downloaded Skill or CLI.
- Pin
