Back to skill

Security audit

Agent Briefing

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent public-content fetcher for notforhumans.tv, with some install and network-hardening caveats but no evidence of hidden, destructive, credential-seeking, or persistent behavior.

Install only through a trusted, verified ClawHub or skills installer version rather than blindly using mutable npx commands. Expect the skill to make outbound requests to notforhumans.tv and to print remote transcripts/review data; agents should treat that content as data, not instructions. The publisher should tighten the description around on-demand checks, add redirect/size/timeout protections, and document network boundaries more explicitly.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
README.md:14
Finding
Unpinned npm Packages Are Downloaded and Executed During Installation<![CDATA[ ## Vulnerability Details **File Location**: `README.md:14` and `README.md:20` **Vulnerability Type**: Supply-chain exposure through unpinned executable dependencies **Risk Level**: Medium ### Vulnerable Code ```bash npx clawhub@latest install agent-briefing ``` ```bash npx skills add agent-briefing ``` ### Technical Analysis The documented installation procedures invoke npm packages through `npx` without pinning them to audited versions or verifying their integrity. The first command explicitly selects the mutable `latest` distribution tag. The second command does not specify any version, so npm also resolves it according to the registry's current package metadata. Because `npx` can download and execute package code, the effective installation logic can change after this project has been reviewed. The repository contains no lockfile, package integrity hash, signature-verification procedure, or other mechanism that binds these installation commands to known artifacts. This creates a supply-chain trust dependency on the npm registry, the package maintainers, and their publishing credentials. ### Attack Path 1. An attacker compromises the `clawhub` or `skills` package, a maintainer account, or its npm release pipeline. 2. The attacker publishes a malicious version and assigns it to the version range selected by the documented command. 3. A user follows the installation instructions in `README.md`. 4. `npx` downloads and executes the newly published package. 5. The malicious installer runs with the privileges of the user invoking `npx`. ### Impact Assessment Successful exploitation could permit arbitrary code execution under the installing user's account. Depending on that user's privileges and environment, the malicious package could access user-readable files, developer credentials, environment variables, source repositories, and network resources or modify files owned by the user. The audited repository does not itself contain such a malicio ...[truncated 179 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace mutable package references with exact, reviewed versions, for example: ```bash npx clawhub@1.2.3 install agent-briefing npx skills@4.5.6 add agent-briefing ``` 2. Publish and document expected integrity hashes or signed release artifacts. 3. Use npm provenance and require verified package publishing where available. 4. Document the official npm package owners and repository links so users can detect similarly named or spoofed packages. 5. Prefer a locally locked installer dependency or a verified release archive rather than executing the current registry release directly. 6. Periodically review pinned versions and update them only after examining the package source and release provenance. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/digest.js:44
Finding
Unrestricted Redirect Following and Unbounded HTTP Response Handling<![CDATA[ ## Vulnerability Details **File Location**: `scripts/digest.js:44-67`, `scripts/latest.js:28-51`, `scripts/reviews.js:32-55`, `scripts/setup.js:16-41`, and `scripts/transcript.js:30-56` **Vulnerability Type**: Unvalidated redirects, missing redirect limits, and unbounded response buffering **Risk Level**: Medium ### Vulnerable Code `scripts/digest.js:44-67`: ```js function httpGet(url) { return new Promise((resolve, reject) => { const handler = (res) => { if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { httpGet(res.headers.location).then(resolve).catch(reject); return; } let data = ""; res.on("data", (chunk) => (data += chunk)); res.on("end", () => resolve({ status: res.statusCode, data })); }; const parsed = new URL(url); const options = { hostname: parsed.hostname, path: parsed.pathname + parsed.search, method: "GET", headers: { "Accept": "application/json, text/markdown, text/plain" }, }; const req = https.request(options, handler); req.on("error", reject); req.end(); }); } ``` `scripts/latest.js:28-51`: ```js function httpGet(url) { return new Promise((resolve, reject) => { const handler = (res) => { if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { httpGet(res.headers.location).then(resolve).catch(reject); return; } let data = ""; res.on("data", (chunk) => (data += chunk)); res.on("end", () => resolve({ status: res.statusCode, data })); }; const parsed = new URL(url); const options = { hostname: parsed.hostname, path: parsed.pathname + parsed.search, method: "GET", headers: { "Accept": "application/json" }, }; const req = https.request(options, handler); req.on("error", reject); req.end(); }); } ``` `scripts/reviews.js:32-55`: ```js function httpGet(url) { return new Promi ...[truncated 5247 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Resolve redirect targets relative to the current URL using `new URL(location, currentUrl)`. 2. Require every destination to use `https:` and match an explicit hostname allowlist, preferably only `notforhumans.tv`. 3. Enforce a small redirect limit, such as three to five redirects, and reject loops. 4. Add a request timeout to every HTTP helper, including connection and response-body deadlines. 5. Enforce endpoint-specific response-size limits before concatenating chunks. Destroy the request if the limit is exceeded. 6. Validate `Content-Type` and parse JSON only after confirming the expected media type and acceptable size. 7. Validate episode-index and review JSON against explicit schemas before using their fields. 8. Clearly mark transcripts and other remote text as untrusted content when passing them to an AI agent. Do not interpret remote transcript text as skill instructions or tool commands. 9. Consolidate the duplicated HTTP logic into one reviewed helper so all scripts consistently receive redirect, timeout, hostname, and size protections. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The code substantially relates to the declared domain and does access the stated resource, notforhumans.tv, so the general topic is aligned. However, several core claimed capabilities are missing. The script fetches episode index data and optional transcript files, then prints metadata and transcript previews. It does not search transcripts or episodes by keyword, does not extract review scores from transcript content, and does not implement or configure an ongoing subscription/monitoring mechanism. Some score fields are merely displayed if already present in the fetched metadata, which is weaker than the declared extraction functionality and does not cover all named score categories. Therefore the description overstates the implemented behavior in material ways.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The description substantially overstates the skill’s functionality. The supplied code only retrieves a JSON episode index from notforhumans.tv and displays recent episode listings. While this partially matches the claim about checking for new/latest episodes and using no API key, it does not implement transcript retrieval, score extraction, keyword search, or ongoing monitoring/subscription. There are no unrelated harmful or undeclared external actions beyond accessing notforhumans.tv and linking to YouTube, but the primary declared purpose is materially broader than the actual behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding
The code partially matches the declared purpose: it uses notforhumans.tv with no API key, can fetch the latest or a specific episode, and supports keyword search. However, the declared description emphasizes subscribing/monitoring the channel, pulling full transcripts, extracting a richer structured review schema, and searching across all episodes by keyword in a broad sense. The actual code only performs on-demand fetches of an episode index and optional product review JSON endpoints. Its search checks only index metadata fields, not transcripts or full episode text. It also lacks any mechanism for persistent monitoring, scheduling, or subscription. Because several core advertised capabilities are absent, the description overstates what the code actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description promises a broader feature set centered on subscription/monitoring, transcript retrieval, structured score extraction, and cross-episode search. The actual code only retrieves a single transcript from notforhumans.tv for a specified episode number or the latest episode, and prints it or returns JSON. While transcript retrieval and latest-episode fetching are consistent with part of the description, the key advertised capabilities—ongoing monitoring, keyword search across episodes, and extraction of structured product review metrics—are absent. There are no schedulers, persistence, search/indexing logic, parsing/extraction routines for review scores, or subscription mechanisms. Therefore the description materially overstates what the code actually does.

Ae1

High
Category
analysis-evasion
Content
Run `scripts/latest.js` to check the channel for recent uploads.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/latest.js` to check the channel for recent uploads.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/transcript.js` with an episode number or `latest`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/transcript.js` with an episode number or `latest`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/transcript.js` with an episode number or `latest`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/reviews.js` to get structured JSON review data.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/reviews.js` to get structured JSON review data.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/reviews.js` to get structured JSON review data.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/reviews.js` to get structured JSON review data.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Run `scripts/reviews.js` to get structured JSON review data.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/digest.js
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/digest.js
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/digest.js
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The README instructs users to execute `npx clawhub@latest install agent-briefing`, which fetches and runs remote code at install time using a floating version. A compromised upstream package, malicious new release, or typosquatted replacement could result in arbitrary code execution on the host during installation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding
The README tells users to run `npx skills add agent-briefing` without pinning the package/tool version, which can execute whatever version is currently published. If the package or its dependencies are compromised, installation can lead to arbitrary code execution or silent persistence in the agent environment.

Missing User Warnings

Medium
Confidence
85% confidence
Finding
The README emphasizes zero-config fetching of transcripts, episode indexes, and review data from `notforhumans.tv` but does not clearly warn that the skill performs external network access and ingests remote content. In an agent context, silent outbound requests and untrusted remote content increase supply-chain, privacy, and prompt-injection risk, especially because the skill is explicitly marketed for autonomous systems.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill explicitly instructs users to run Node scripts that fetch data from notforhumans.tv, but it declares no tool scope or permission boundary for network access. In agent environments, undeclared network capability weakens policy enforcement and can cause the agent to perform outbound requests without clear operator consent or sandbox expectations.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The activation guidance is very broad and includes generic channel- and monitoring-related phrases, which can cause the skill to trigger in contexts where the user did not intend external fetching or this specific workflow. In agent systems, overbroad triggers increase the chance of inappropriate tool use, unnecessary network access, and prompt-routing hijacks by loosely related queries.

Static analysis

No suspicious patterns detected.