Back to skill

Security audit

Tech Radar Daily

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches a public tech-digest workflow, but it also ships an undeclared Feishu tenant chat-discovery script that uses app credentials, so it needs review before installation.

Install only if you are comfortable with a Chinese-language Feishu reporting workflow and external posting to your configured webhook. Do not run scripts/test-feishu-chat.js or provide FEISHU_APP_ID/FEISHU_APP_SECRET unless you intentionally want tenant chat discovery, and update or remove the proxy/PAC dependency chain before relying on it in a sensitive environment.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/test-feishu-chat.js:3
Finding

Undeclared Feishu Tenant Chat Enumeration Exceeds Least Privilege

Content
View full analysis

Vulnerability Details

File Location: scripts/test-feishu-chat.js, lines 3–45
Vulnerability Type: Excessive privilege use and tenant metadata enumeration
Risk Level: Medium

Vulnerable Code

js
async function getChatList() {
  const token = await new Promise((resolve, reject) => {
    const data = JSON.stringify({
      app_id: process.env.FEISHU_APP_ID,
      app_secret: process.env.FEISHU_APP_SECRET
    });
    
    const req = https.request({
      hostname: 'open.feishu.cn',
      port: 443,
      path: '/open-apis/auth/v3/tenant_access_token/internal',
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'Content-Length': data.length }
    }, res => {
      let body = '';
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve(JSON.parse(body).tenant_access_token));
    });
    req.on('error', reject);
    req.write(data);
    req.end();
  });
  
  console.log('✅ Token obtained successfully');
  
  // Retrieve the chat list
  const req = https.request({
    hostname: 'open.feishu.cn',
    port: 443,
    path: '/open-apis/im/v1/chats?page_size=10',
    method: 'GET',
    headers: {
      'Authorization': 'Bearer ' + token,
      'Content-Type': 'application/json'
    }
  }, res => {
    let body = '';
    res.on('data', chunk => body += chunk);
    res.on('end', () => {
      const result = JSON.parse(body);
      if (result.code === 0) {
        console.log('\n📋 Available chat list:');
        result.data.items.forEach((chat, i) => {
          console.log(`${i + 1}. ${chat.name} (ID: ${chat.chat_id})`);
        });

Technical Analysis

The script reads FEISHU_APP_ID and FEISHU_APP_SECRET, submits them to Feishu's official authentication endpoint, obtains a tenant access token, and uses that token to enumerate chats accessible to the application. It then prints chat names a ...[truncated 2142 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove scripts/test-feishu-chat.js from the distributed Skill if chat discovery is not part of its supported functionality.
  2. If retained as an administrative utility, clearly document that it is optional, separate it from normal Skill execution, and require explicit operator confirmation before requesting a tenant token.
  3. Add FEISHU_APP_ID and FEISHU_APP_SECRET to documentation only if this administrative feature is intentionally supported; do not imply that they are needed for webhook-based report delivery.
  4. Use a dedicated Feishu application with only the minimum read scope required for chat discovery. Do not reuse a broadly privileged production application.
  5. Avoid printing raw chat IDs by default. Redact identifiers and reveal them only through an explicit option intended for interactive administration.
  6. Warn operators that output may enter CI systems or retained terminal logs, and disable this utility in automated execution environments.
  7. Validate HTTP status codes and Feishu response codes before accepting tenant_access_token; handle missing or malformed tokens without proceeding.
  8. Keep the token in memory only, never log it, and discard it immediately after the request completes.
  9. Prefer webhook-only delivery for the normal Skill path because it avoids tenant-wide credentials and chat-enumeration permissions.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
Findings (39)

Known Vulnerable Dependency: vm2==3.10.5 — 16 advisory(ies): CVE-2026-45411 (vm2 Has a Sandbox Breakout Using Async Generator); GHSA-2cm2-m3w5-gp2f (vm2 has access to `VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL`); CVE-2026-43997 (vm2 Access to Host Object Enables Sandbox Escape) +13 more

Critical
Category
Supply Chain
Confidence
97% confidence
Finding

vm2 3.10.5 is a heavily broken sandbox package with numerous public sandbox-escape advisories, and here it is introduced through pac-resolver/degenerator. In a project that includes proxy-agent with PAC support, processing an attacker-controlled PAC file could lead to code execution or sandbox escape, making this substantially more dangerous than a generic dormant dependency finding.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

A description-behavior mismatch is a serious trust violation: the skill claims to scan public tech sources and push curated updates, while the detected behavior includes Feishu tenant authentication and chat/group enumeration using additional secrets not disclosed in the metadata. This expands the effective privilege and data-access surface beyond user expectations, creating risk of secret abuse, unauthorized workspace discovery, or covert data exfiltration.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
"run": { "command": "node scripts/run-cycle.js", "description": "运行每日技术情报扫描" },

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
"run": { "command": "node scripts/run-cycle.js", "description": "运行每日技术情报扫描" },

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
"run": { "command": "node scripts/run-cycle.js", "description": "运行每日技术情报扫描" },

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
"run": { "command": "node scripts/run-cycle.js", "description": "运行每日技术情报扫描" },

Known Vulnerable Dependency: ip==1.1.9 — 1 advisory(ies): CVE-2024-29415 (ip SSRF improper categorization in isPublic)

High
Category
Supply Chain
Confidence
95% confidence
Finding

The project includes ip 1.1.9 via pac-resolver, and the cited SSRF-class issue concerns improper classification of public versus non-public addresses. This skill is a network-heavy scraper that fetches remote content and also includes proxy/PAC support, which makes incorrect IP trust decisions materially more dangerous if any host filtering or proxy bypass logic relies on this library.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ip-address==10.1.0 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: undici==7.24.6 — 12 advisory(ies): CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-13697 (undici vulnerable to cross-user information disclosure and parse-time crash via ); CVE-2026-16728 (undici vulnerable to downstream response desynchronization via retry interceptor) +9 more

High
Category
Supply Chain
Confidence
88% confidence
Finding

undici 7.24.6 is pulled in by cheerio and has multiple high-severity HTTP parsing/connection handling advisories. Because this skill continuously fetches untrusted remote pages from trending sites and lists, a vulnerable HTTP client stack increases risk of response desynchronization, cache/connection poisoning, denial of service, or cross-request data exposure when reusing sockets.

Content

No source excerpt is available for this finding.

Possible Typosquatting: 'vm2' resembles popular package 'pm2'

High
Category
Supply Chain
Confidence
70% confidence
Finding

Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares executable actions and requires environment variables and Node.js, but it does not declare any explicit tool scope or allowed-tools boundary. That weakens least-privilege controls and makes it harder for users or the platform to understand and constrain its access to shell, network, and environment data before execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill is designed to send collected content to an external Feishu webhook, but the description does not prominently warn that execution transmits data off-platform. Without explicit disclosure, users may run it without realizing that gathered content, prompts, or derived summaries could be sent to a third-party endpoint they control or misconfigure.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This markdown template is entirely structured in Chinese, including headings, field labels, and placeholders such as '日期' and '项目名称'. Because the file does not indicate that Chinese is optional or region-specific, it creates a natural-language locale constraint that may violate organizational language-choice policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The user-facing console strings and comments are written in Chinese, including success/error messages at L12, L22, and L44, with no indication that the skill is intended only for Chinese-speaking users or that language is configurable. This creates a natural-language locale policy issue because the skill imposes a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file's user-facing content is presented as a Chinese-only daily report ('今日精选 5 条高价值技术情报') and the rest of the document consistently uses Chinese labels without indicating that language is optional or region-specific. Under the language/locale policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document headings and instructional text are written in Chinese throughout, which imposes a specific language on users without any opt-in or stated regional requirement. Under the policy, language constraints should either provide user choice or be clearly justified as region-specific.

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 · scripts/collectors-awesome.js (reported line 55)May include surrounding context.

js
}

 try {
 const url = `https://api.github.com/repos/${repo}`;
 const options = {
 headers: process.env.GITHUB_TOKEN
 ? { 'Authorization': `token ${process.env.GITHUB_TOKEN}` }

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code's human-facing natural-language content is written in Chinese, including the top-level description and runtime console messages, with no indication that the skill is China-specific or that users can choose another language. That creates a locale-policy concern because the skill implicitly forces one language for interaction and diagnostics.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This JavaScript file contains natural-language comments and a console message in Chinese, including the user-visible log at L043. The policy requires avoiding forced language or locale unless the skill offers user choice or clearly documents a justified locale restriction, which is not present here.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The docstring says this function parses a Product Hunt page, which implies extracting real content from the provided HTML. Instead, the implementation ignores the input entirely and returns a fixed synthetic record, directly contradicting the documented intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This script explicitly formats dates using the 'zh-CN' locale, and surrounding user-facing logs/comments are also Chinese, which indicates the skill is designed to operate in a single language/locale. Under the policy, forcing a specific language or locale without user opt-in is a natural-language policy violation unless the constraint is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The file’s user-facing natural-language content in comments is entirely in Chinese, beginning with the title at L002, with no indication that language selection is optional or that the skill is region-specific. Under the policy for natural-language violations, forcing a specific language without user opt-in can be a locale-policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file’s natural-language comments and prompt construction indicate the summarizer is designed to operate in Chinese, including the generated summary prompt at L051-L060. There is no indication of user opt-in, language selection, or documented region-specific justification, which can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The description and operational instructions are presented entirely in Chinese, including user-facing labels and setup guidance, but the file does not state that the skill is region-specific or provide an opt-in language choice. The policy calls for flagging language or locale constraints when a specific language is effectively forced without user choice or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The document is presented entirely in Chinese, including headings and descriptive text, with no indication that the skill is China-specific or that users can opt into another language. This can violate language/locale policy when a skill imposes a specific language without user choice or justification.

Content

No source excerpt is available for this finding.