Back to skill

Security audit

Questlog

Security checks across malware telemetry and agentic risk

Overview

This skill is a disclosed local commitments ledger; its main cautions are a mutable install command and a local draft queue, not hidden execution.

Install from a pinned, inspected revision when possible, use a dedicated private QUESTLOG_ROOT, do not expose the loopback port or run it as root, and treat queued instruction drafts as untrusted notes unless you separately review and authorize any automation that consumes them.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
README.md:9
Finding
Unpinned Installer and Mutable Skill Source## Vulnerability Details **File Location**: `README.md:9` **Vulnerability Type**: Unpinned third-party installer and mutable remote source **Risk Level**: Medium ### Vulnerable Code ```sh npx skills add https://github.com/AntreasAntoniou/questlog-agent-skill --skill questlog ``` ### Technical Analysis The documented installation command invokes `npx` without pinning the `skills` package to a reviewed version. Depending on the local npm configuration and cache state, `npx` may retrieve and execute the latest package version from the configured registry. The GitHub source is also referenced without a commit hash or immutable release artifact. Consequently, the code installed by this command can differ from the artifact that was audited. Compromise of the npm package, registry account, GitHub repository, maintainer account, or default branch could alter the effective installation payload. This is a supply-chain integrity weakness rather than evidence that the currently audited runtime is malicious. The reviewed runtime itself did not contain scheduler installation, SSH-key access, credential collection, or external data exfiltration. ### Attack Path 1. An attacker compromises the npm `skills` package, its publisher account, the source repository, or a maintainer account. 2. The attacker publishes a malicious installer version or modifies the repository revision selected by the unpinned URL. 3. A user follows the documented `npx skills add ...` command. 4. `npx` retrieves and executes the mutable installer, which retrieves the mutable skill source. 5. Malicious code can execute or be installed under the privileges of the user running the command. ### Impact Assessment Successful exploitation could execute commands and modify files accessible to the installing user. The potential scope includes the user's skill directory, local application state, environment-accessible credentials, and other files writable by that accou ...[truncated 171 chars]
Remediation
## Remediation Suggestions 1. Pin the npm installer to an explicitly reviewed version, for example `npx skills@<reviewed-version> ...`. 2. Pin the skill source to an immutable commit hash or signed release rather than the repository's mutable default branch. 3. Publish checksums or cryptographic signatures for release artifacts and document how users should verify them before installation. 4. Prefer downloading and inspecting the pinned source before executing any installer. 5. Use npm lockfiles, integrity metadata, and a trusted registry where applicable. 6. Explicitly warn users not to run the installation command as root or with unnecessary privileges.
Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill instructs the agent to resolve an environment variable, read and modify local files, and optionally use HTTP and host-native scheduling, but it does not declare corresponding permissions. This creates a permission-transparency gap: users and enforcement layers may not understand the real capabilities the skill expects, increasing the risk of unintended file changes, network access, or shell/scheduler actions in a sensitive local workflow tool.

Description-Behavior Mismatch

Medium
Confidence
76% confidence
Finding
The server exposes `/api/action`, which accepts arbitrary text and persists it as pending local instructions. Although this file does not execute queued items, creating a public queue of operator-like actions expands the skill beyond passive ledger maintenance and can become a confused-deputy or privilege-boundary issue if any other local component later consumes that queue. In a localhost web app, this is less severe than direct execution, but it still creates an injection point into downstream automation.

Intent-Code Divergence

Medium
Confidence
79% confidence
Finding
The module-level claims that no external actions or public execution are enabled are inconsistent with the presence of a public action-enqueue API and queue-writing logic. Security-relevant misrepresentation is dangerous because reviewers or integrators may assume the component is incapable of driving actions, while it actually accepts and stores instruction-like content for later processing by other components.

VirusTotal

62/62 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
tests/test_runtime.py:71