Back to skill

Security audit

Latte News Fetcher

Security checks for vulnerabilities and agentic risk

Overview

This news skill openly focuses on bypassing paywalls and can send article URLs to third parties or use a logged-in browser session, so it should be reviewed carefully before installation.

Install only if you intentionally want a tool that attempts paywall bypass. Avoid giving it private, signed, internal, or account-specific URLs; do not let it use your logged-in Chrome profile unless you are comfortable with the agent accessing that session; and consider whether the workflows comply with the publishers' terms and your local rules.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/fetch_news.mjs:79
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
!a.startsWith('--')); ``` ```javascript const tools = { smry: (url) => `https://smry.ai/${url}`, jina: (url) => `https://r.jina.ai/http://${url}`, '12ft': (url) => `https://12ft.io/${url}`, removepaywalls: (url) => `https://removepaywalls.com/${url}`, direct: (url) => url }; ``` ```javascript async function fetchDirect(targetUrl) { const response = await fetch(targetUrl, { headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } }); if (!response.ok) { throw new Error(`HTTP ${response.status}`); } const text = await response.text(); return { raw_content: text }; } ``` ```javascript async function tryMethod(originalUrl, methodName) { const targetUrl = tools[methodName](originalUrl); console.log(` 尝试 ${methodName}: ${targetUrl.substring(0, 60)}...`); try { let result; if (methodName === 'direct') { result = await fetchDirect(targetUrl); } else if (methodName === 'jina') { const response = await fetch(targetUrl); if (!response.ok) throw new Error(`HTTP ${response.status}`); const text = await response.text(); result = { raw_content: text }; } else { result = await extractWithTavily(targetUrl); } ``` ### Technical Analysis The first non-option command-line argument is treated as a URL and can be passed directly to `node-fetch`. The implementation does not validate: - The URL scheme. - Destination hostnames or resolved IP addresses. - Loopback, private, link-local, multicast, or reserved address ranges. - Cloud instance metadata add ...[truncated 1827 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_news.mjs:43
Finding

Full User-Supplied URLs Are Disclosed to External Extraction Services

Content
View full analysis
`https://smry.ai/${url}`, jina: (url) => `https://r.jina.ai/http://${url}`, '12ft': (url) => `https://12ft.io/${url}`, removepaywalls: (url) => `https://removepaywalls.com/${url}`, direct: (url) => url }; ``` ```javascript async function extractWithTavily(targetUrl) { if (!TAVILY_API_KEY) { throw new Error('需要设置 TAVILY_API_KEY 环境变量'); } const response = await fetch('https://api.tavily.com/extract', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${TAVILY_API_KEY}` }, body: JSON.stringify({ urls: [targetUrl], extract_depth: 'advanced' }) }); const data = await response.json(); if (data.results && data.results.length > 0) { return data.results[0]; } throw new Error(data.error || '提取失败'); } ``` ```javascript async function tryMethod(originalUrl, methodName) { const targetUrl = tools[methodName](originalUrl); console.log(` 尝试 ${methodName}: ${targetUrl.substring(0, 60)}...`); try { let result; if (methodName === 'direct') { result = await fetchDirect(targetUrl); } else if (methodName === 'jina') { const response = await fetch(targetUrl); if (!response.ok) throw new Error(`HTTP ${response.status}`); const text = await response.text(); result = { raw_content: text }; } else { result = await extractWithTavily(targetUrl); } ``` ### Technical Analysis The script incorporates the complete caller-supplied URL into URLs for `smry.ai`, `r.jina.ai`, `12ft.io`, and `removepaywalls.com`. For the `smry` and `12ft` methods, the resulting proxy URL is also submitted to Tavily's extraction API. A ...[truncated 2066 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:17
Finding

Runtime Dependency Is Installed Without Version or Integrity Pinning

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (33)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill sends article URLs and search queries to third-party services such as archive.today, smry.ai, 12ft.io, RemovePaywall, and Tavily without a clear privacy warning. Those requests can expose what the user is reading or investigating, and may disclose sensitive links or interests to external operators.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger words are extremely broad and overlap with normal conversation about news, articles, or reading. This can cause unintended activation, leading the skill to fetch remote content, store preferences, or invoke third-party services when the user did not clearly intend to use this specific skill.

Content

No source excerpt is available for this finding.

Ssd 2

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The core description explicitly presents the skill as a way to bypass paywalls and obtain full article text through alternate services. In context, this is not incidental; it is a primary feature that guides the agent toward accessing restricted content through indirect means.

Content

No source excerpt is available for this finding.

Ssd 2

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

This section gives detailed procedural instructions, service priorities, and site-specific steps for retrieving restricted articles through archive mirrors and similar tools. The specificity materially increases the skill's ability to help a user evade publisher access controls rather than merely summarize public information.

Content

No source excerpt is available for this finding.

Ssd 4

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The workflow starts as routine news assistance, then progressively escalates into paywall bypass and finally asks the user to log into their own account so the agent can continue through that session. This staged design is dangerous because it normalizes increasingly risky actions and culminates in the agent operating with user-authenticated access to restricted content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This section instructs the agent to rely on a real user's logged-in Chrome session to access member-only content. That creates a clear boundary-crossing risk: the agent may act with the user's authenticated privileges, exposing subscription content and potentially other account/session data beyond the skill's stated news-fetching purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README is written as a Chinese-only skill description and all example interactions and outputs are prescribed in Chinese, with no indication that users may choose another language. This can violate language/locale policy when a skill imposes a specific language without opt-in or documented justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README explicitly promotes paywall bypass using archive.today, smry.ai, and similar services without any meaningful warning about legal, contractual, or ethical restrictions. In this skill context, that is the core advertised behavior, so it increases the likelihood that users will be guided into violating site terms or redistributing restricted content.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 161)May include surrounding context.

当无法绕过付费墙时,使用 Tavily 搜索同一事件的其他报道:

bash
curl -s --request POST \
  --url https://api.tavily.com/search \
  --header "Authorization: Bearer $TAVILY_API_KEY" \
  --header 'Content-Type: application/json' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 162)May include surrounding context.

bash
curl -s --request POST \
  --url https://api.tavily.com/search \
  --header "Authorization: Bearer $TAVILY_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill declares network use, environment-variable use, and browser-driven fetching behavior, but it does not define an explicit tool scope or allowed-tools boundary. That increases the chance of overbroad execution and makes it harder for reviewers and runtime controls to constrain what the skill is permitted to access.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest description and trigger definitions are entirely in Chinese, and the workflow examples and output instructions consistently require Chinese interaction and formatting. There is no indication that the user can opt into another language or that the locale restriction is required for a region-specific compliance reason.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill stores user news preferences in a workspace file but does not clearly disclose this persistence in the user-facing description at the point of use. Users may reveal interests, reading habits, or preferred outlets without understanding that this data will be retained locally.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The daily-use invocation guidance uses generic examples like asking for today's news, without clear disambiguation from ordinary assistant behavior. In context, that ambiguity is more dangerous because this skill can escalate into browser automation, external transmission, and paywall-circumvention workflows.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

The Tavily API example transmits user-derived search queries and uses an environment-backed API credential to an external service. External transmission is expected for search, but it still carries privacy and governance risk if done without clear disclosure, minimization, and scoped handling of API secrets.

Content

Scanner excerpt · SKILL.md (reported line 351)May include surrounding context.

使用 Tavily API 搜索同一事件的免费报道:

bash
curl -s --request POST \
  --url https://api.tavily.com/search \
  --header "Authorization: Bearer $TAVILY_API_KEY" \
  --header 'Content-Type: application/json' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

This finding identifies the specific external Tavily endpoint used by the skill. By itself the endpoint is not malicious, but in context it confirms undisclosed third-party transmission of user interests and article-related searches, which becomes a privacy concern when combined with the broader workflow.

Content

Scanner excerpt · SKILL.md (reported line 352)May include surrounding context.

bash
curl -s --request POST \
  --url https://api.tavily.com/search \
  --header "Authorization: Bearer $TAVILY_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

All natural-language instructions in the file are presented only in Chinese, with no indication that the user can choose another language or that the locale restriction is required for a region-specific purpose. The policy specifically calls out language or locale constraints that are imposed without user opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document explicitly instructs users to disable privacy protections such as iCloud Private Relay and switch DNS providers to work around archive.today access issues, but does not warn about the resulting privacy and security tradeoffs. In the context of a skill dedicated to bypassing paywalls, this increases risk because users may be encouraged to weaken protections on their system or network for nonessential purposes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file instructs users to disable 1.1.1.1 DNS and iCloud Private Relay and switch network conditions to make archive services work, but it does not warn that these steps reduce privacy protections and can affect connectivity or expose browsing metadata. In the context of a skill explicitly designed to bypass paywalls, these unsafe operational workarounds are more concerning because they normalize weakening user protections in service of accessing restricted content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown file presents all instructions and guidance exclusively in Chinese, and there is no indication that the skill is intentionally limited to Chinese-speaking users or that users can opt into another language. Under the language/locale policy, forcing a specific language without user choice can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The entire skill file is written in Chinese and presents all guidance exclusively in that language, with no indication that users can choose another language or that the file is intended only for a Chinese-language audience. Under the stated policy, forcing a specific language without user opt-in is a natural-language locale violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document is written entirely in Chinese, including headings, instructions, and recommendations, with no indication that users may choose another language or that the Chinese-only format is required for a justified regional use case. This is a natural-language locale policy concern because the skill content imposes a specific language without opt-in.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The matrix explicitly classifies paywall difficulty and recommends progressively stronger methods to bypass access controls, including third-party summarizers, JavaScript disabling, user-agent switching, and browser extensions. In a skill whose stated purpose includes bypassing paywalls, this operational guidance facilitates circumvention of publisher protections and normalizes unauthorized access paths.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

These steps instruct users how to evade metered paywalls by resetting or avoiding tracking state through cookie clearing, private browsing, and device/browser changes. That is actionable guidance for defeating usage limits and access controls, which increases legal/compliance risk and encourages abusive behavior.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill reads TAVILY_API_KEY from the environment and sends user-supplied URLs and search queries to Tavily, a third-party service not disclosed in the manifest description. This creates a data handling and trust-boundary issue because users and deployers may believe only the listed public tools are used, while the code actually transmits inputs to an additional API provider using privileged credentials.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/fetch_news.mjs:16