Back to skill

Security audit

考公备考追踪

Security checks for vulnerabilities and agentic risk

Overview

This study tracker is purpose-aligned, but it needs review because screenshots may leave the device despite local-only privacy claims and the export path has security hardening issues.

Review this skill before installing. Use it only if you are comfortable storing exam screenshots and notes under ~/.openclaw and sending image inputs to your configured multimodal model provider. Treat Feishu sync as a separate opt-in upload of wrong-question data and screenshots. Avoid exporting or opening spreadsheets from untrusted imported content until formula sanitization and safer temporary-file handling are fixed.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/export_xlsx.js:181
Finding

Spreadsheet Formula Injection in Exported Workbooks

Content
View full analysis
[ q.date ?? '', q.module ?? '', q.subtype ?? '', q.error_reason ?? '', q.question_text ?? q.question_desc ?? '', q.visual_description ?? '', q.answer ?? '', q.analysis ?? q.user_annotation ?? '', Array.isArray(q.keywords) ? q.keywords.join('、') : '', q.status ?? '待二刷', q.source_engine ?? (q.source === 'image' ? '图片' : '文字'), '', ]); ``` The generated Python code writes those values directly into spreadsheet cells: ```python for ri, row in enumerate(wrong_rows, 2): for ci, val in enumerate(row, 1): cell = ws.cell(row=ri, column=ci, value=val) cell.alignment = Alignment(vertical="center", wrap_text=(ci in [5, 6, 8])) cell.font = Font(name="Arial", size=9) ``` ### Technical Analysis Spreadsheet applications may interpret text beginning with `=`, `+`, `-`, or `@` as a formula rather than inert text. The exported fields include content derived directly from user messages, screenshots, annotations, and multimodal-model output. No validation or formula neutralization is applied before these values reach `openpyxl`. Consequently, an attacker who can influence a stored question, annotation, analysis, visual description, or daily note can insert a spreadsheet formula into the generated XLSX file. This is especially relevant when study records are populated from untrusted forwarded messages, shared screenshots, imported data, or potentially manipulated model output. ### ...[truncated 1436 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/export_xlsx.js:200
Finding

Predictable Temporary Files Permit Local Disclosure and Symlink Attacks

Content
View full analysis
{ if (!q.raw_image_b64) return; const tmpPath = path.join(os.tmpdir(), `qimg_${Date.now()}_${idx}.jpg`); try { fs.writeFileSync(tmpPath, Buffer.from(q.raw_image_b64, 'base64')); imageMap[String(idx)] = tmpPath; tmpFiles.push(tmpPath); } catch (_) {} }); ``` The dynamically generated Python program is handled in the same manner: ```javascript const pyScript = buildPythonScript({ wrongRows, dailyRows, outPath, imageMap, pendingOnly }); const tmpPy = path.join(os.tmpdir(), `export_${Date.now()}.py`); fs.writeFileSync(tmpPy, pyScript, 'utf-8'); ``` ### Technical Analysis The file names are derived only from `Date.now()` and a sequential index. These values are predictable within a small search window. Files are created directly in a shared temporary directory without: - Exclusive creation semantics. - A private per-process directory. - Explicit restrictive permissions. - Symlink checks. - Cryptographically random names. On a multi-user system, another local process may predict or monitor these paths. If the attacker creates a symbolic link before `writeFileSync` executes, the write can be redirected to another file writable by the victim. The attacker may also read temporary screenshots if the effective file permissions or temporary-directory environment allow it. Although cleanup occurs in a `finally` block, cleanup after use does not prevent disclosure or race-condition attacks while the files exist. ### Attack Path 1. A local attacker monitors the temporary directory or predicts the timestamp used during export. 2. The attacker creates a symbolic link at a likely `qi ...[truncated 1171 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
package.json:20
Finding

Unpinned npm and Python Dependencies Create Supply-Chain Risk

Content
View full analysis
Remediation
View remediation
--hash=sha256: paddleocr== --hash=sha256: ``` ]]>

other

Warning
Location
scripts/parse_input.js:164
Finding

Privacy Documentation Omits Transmission to the Configured Multimodal Provider

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (36)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 4)May include surrounding context.

text
node_modules/
data/
*.xlsx
.env
.DS_Store
*.log
config.json

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README explicitly promises that all data stays local and is not uploaded to any cloud, but later documents use of external multimodal models and optional Feishu cloud sync. This is a security-relevant misrepresentation because users may share screenshots, study records, and embedded image data under a false privacy assumption, causing unintended disclosure to third-party services.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The 'local-first / not uploaded to any third-party server' design claim conflicts with the documented behavior of sending content to external models and syncing records to Feishu. Such contradictory documentation can undermine informed consent and safe deployment decisions, especially where screenshots may contain sensitive personal study data.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This specification introduces cron-based review/reminder behavior and state changes such as mastery updates that are not disclosed in the short declared purpose. Undeclared autonomous study-state mutation and reminders can affect user records and create unexpected interactions, especially in cross-platform chat contexts.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

This specification introduces cron-based review/reminder behavior and state changes such as mastery updates that are not disclosed in the short declared purpose. Undeclared autonomous study-state mutation and reminders can affect user records and create unexpected interactions, especially in cross-platform chat contexts.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This specification introduces cron-based review/reminder behavior and state changes such as mastery updates that are not disclosed in the short declared purpose. Undeclared autonomous study-state mutation and reminders can affect user records and create unexpected interactions, especially in cross-platform chat contexts.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

This specification introduces cron-based review/reminder behavior and state changes such as mastery updates that are not disclosed in the short declared purpose. Undeclared autonomous study-state mutation and reminders can affect user records and create unexpected interactions, especially in cross-platform chat contexts.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger conditions are extremely broad—any mention of studying, mistakes, preparation, or related screenshots may activate the skill. Overbroad triggers raise the risk of unintended collection, parsing, and storage of sensitive educational content or images when the user did not intend to invoke this specific skill.

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 151)May include surrounding context.

md
### Step 3:更新记录(`update_daily.js`)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
### Step 3:更新记录(`update_daily.js`)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
### Step 5:导出 Excel(`export_xlsx.js`)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
### Step 5:导出 Excel(`export_xlsx.js`)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · assets/workspace-example.yaml (reported line 14)May include surrounding context.

yaml
channels:
  feishu:
    enabled: true
    webhook_url: "${FEISHU_WEBHOOK_URL}"   # 在 .env 里配置
    # 只响应特定用户(填飞书 user_id,留空则全响应)
    allow_from: []

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README describes sending screenshots and content to external multimodal models and optionally syncing full wrong-question data to Feishu, yet does not provide a clear, prominent warning that these actions expose user data outside the local machine. This omission increases the risk of users disclosing sensitive notes, images, or metadata without understanding the privacy boundary.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill declares network- and environment-dependent behavior (multimodal API use, optional Feishu sync, Python invocation) but does not define any explicit tool scope or permission boundaries. In agent environments, missing scope declarations can cause overbroad access, unclear consent, and make it harder for hosts to enforce least privilege.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The activation examples, trigger phrases, and user-facing text are entirely Chinese, and the file does not state that the user may choose another language or that the skill is intentionally restricted to Chinese-only operation. That can amount to a language policy issue unless the locale constraint is explicit and justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill stores extracted study content and raw screenshot data as base64 locally, but the initial trigger/description does not present this prominently before activation. Because screenshots can contain personal notes, IDs, names, or other sensitive information, silent or poorly disclosed retention increases privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The alias lists include very broad terms such as '语言', '阅读', '数学', '数字', '判断', '逻辑', '推理', '资料', '作文', and '分析', which can match many unrelated user messages. In this skill, broad matching can cause unintended activation, accidental collection/processing of user content, and misclassification of study records or exports to local storage/Feishu when the user did not intend to invoke this skill.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The setting language: "zh-CN" hard-codes a specific language/locale in the skill configuration. Under the policy, locale restrictions should either offer user choice or be clearly justified as region-specific; this file does not provide either in the configuration text.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file title and all reply templates are written exclusively in Chinese, and line 3 instructs that every reply must be selected from these templates. This effectively forces a specific language for all responses, which is a natural-language policy violation when no user opt-in or documented locale limitation is provided.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The entire tone guide is written as a prescriptive instruction set in Chinese, including required response style and example outputs, but it does not indicate that the user can opt into another language or that the skill is limited to a Chinese-only context. This creates a natural-language policy concern because it effectively forces a specific language/locale without user choice.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This JavaScript file includes its descriptive comments and generated user-facing summary text exclusively in Chinese. Under the stated policy, forcing a specific language without offering user choice or documenting a justified locale constraint is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill's stated purpose is study-tracking, wrong-question analysis, and export/sync workflows. Exporting Excel is in scope, but invoking an external interpreter via child_process is a stronger capability than the manifest justifies and is not an obvious requirement of a study-tracker skill itself.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The export writes a consolidated Excel file containing study history and potentially embedded screenshots to a predictable local path under the user's home directory, then logs the attachment path. In this skill context, screenshots and notes may contain sensitive personal study content, so silent export increases privacy exposure if the host environment is shared, synced, backed up, or accessible by other tools.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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/feishu_doc.js (reported line 36)May include surrounding context.

js
// ─── 飞书 API 基础 ────────────────────────────────────────────

async function getTenantToken(appId, appSecret) {
  const res = await fetch('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal', {
    method:  'POST',
    headers: { 'Content-Type': 'application/json' },
    body:    JSON.stringify({ app_id: appId, app_secret: appSecret }),

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/export_xlsx.js:34