Back to skill

Security audit

Sentinel Mood

Security checks for vulnerabilities and agentic risk

Overview

This skill is a small sentiment analyzer whose behavior matches its stated purpose, with a disclosed but imperfectly controlled NLTK/VADER dependency download.

Install this only if you are comfortable with NLTK being installed from your Python package source and the VADER lexicon being downloaded if it is missing. For locked-down or offline environments, preinstall and verify the NLTK package and vader_lexicon resource before using the skill.

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
analyze.py:6
Finding
Unpinned NLTK Dependency and Unverified Runtime Lexicon Download## Vulnerability Details **File Location**: `analyze.py:6-10` **Additional Location**: `SKILL.md:27-30` **Vulnerability Type**: Supply-chain risk from an unpinned dependency and runtime resource retrieval without application-level integrity verification **Risk Level**: Medium ### Vulnerable Code `analyze.py:6-10`: ```python def ensure_vader(): try: nltk.data.find('sentiment/vader_lexicon.zip') except LookupError: # Download quietly nltk.download('vader_lexicon', quiet=True) ``` `SKILL.md:27-30`: ```markdown - Python 3 - `nltk` library (`pip install nltk`) - `vader_lexicon` (downloaded via `nltk.downloader`) ``` ### Technical Analysis The documented installation command installs `nltk` without a pinned version, lockfile, or package hash. Consequently, the exact code installed depends on the package version resolved when installation occurs. In addition, `ensure_vader()` automatically invokes NLTK's downloader if the VADER resource is unavailable. The application does not pin a specific lexicon artifact or independently validate its checksum before use. This means the effective runtime data can depend on externally mutable package repositories, downloader metadata, and upstream resources after the skill has been reviewed. The download is documented, and the reviewed project does not itself fetch or execute arbitrary source code. This finding is therefore a supply-chain hardening issue rather than evidence of an embedded malicious payload. ### Attack Path 1. An attacker compromises or successfully substitutes an NLTK package release, package distribution source, downloader index, or upstream VADER resource. 2. A user installs the unpinned `nltk` dependency, or invokes the skill in an environment where `vader_lexicon` is absent. 3. The environment resolves attacker-influenced package content or `ensure_vader()` silently initiates retrieval through `nltk.download()`. ...[truncated 952 chars]
Remediation
## Remediation Suggestions 1. Pin NLTK to a reviewed exact version in a requirements file, such as `nltk==<reviewed-version>`. 2. Generate and enforce a lockfile containing cryptographic hashes, for example with `pip-compile --generate-hashes`, and install using `pip install --require-hashes`. 3. Retrieve the VADER lexicon during a controlled build or installation phase rather than automatically during normal execution. 4. Pin the expected lexicon artifact and verify its cryptographic checksum before making it available to the application. 5. Replace the implicit runtime download with a clear error explaining how to install the verified resource when it is absent. 6. Use trusted package indexes over TLS, restrict alternate indexes, and periodically review dependency and artifact updates before changing pinned versions. 7. Run the skill under a least-privileged account with limited filesystem and network access to reduce the effect of any future supply-chain compromise.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
Findings (3)

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The skill performs a runtime download of the VADER lexicon if it is not already present, which introduces undeclared network behavior into a tool described as local sentiment analysis. This expands the trust boundary to external infrastructure, can fail unpredictably in restricted environments, and may violate expectations around offline operation or supply-chain control.

Context-Inappropriate Capability

Low
Confidence
84% confidence
Finding
Automatic network download is not necessary for the core advertised function once dependencies are packaged correctly, so the code grants extra capability beyond the stated purpose. While not obviously malicious, this unnecessary egress increases attack surface and can surprise users operating under strict security or privacy assumptions.

Missing User Warnings

Low
Confidence
92% confidence
Finding
The code silently downloads NLTK data without any user-facing disclosure, consent, or warning, which undermines transparency and can trigger unexpected outbound connections. In locked-down or audited environments, silent network activity can create compliance, monitoring, or trust issues even if the downloaded content is legitimate.

Static analysis

No suspicious patterns detected.