Back to skill

Security audit

Web Publisher Skill

Security checks for vulnerabilities and agentic risk

Overview

This publishing skill is mostly coherent, but it handles sensitive publishing credentials and includes under-scoped link and fallback-code paths that deserve review before installation.

Install only if you trust the siping.me services with article content, WeChat publishing authority, and AppID/AppSecret handling. Verify configuration links are HTTPS links on the expected siping.me domain before entering credentials, be cautious with the optional news-to-markdown fallback because it runs separate local code, and confirm API-key revocation from the service side after logout.

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)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:398
Finding

Execution of an unaudited third-party fallback dependency

Content
View full analysis
` and first try this Skill: `scripts/run.js draft `. 2. If the task returns `failed` and the error contains retrieval failure, 403, forbidden, login required, or empty content, switch to `news-to-markdown-skill`: ```bash node /news-to-markdown-skill/scripts/run.js convert \ --url "" \ --download-images \ --output-dir ./drafts/ ``` ``` The associated installation instruction is: ```bash npm install --ignore-scripts --save-exact news-to-markdown@3.3.1 ``` ### Technical Analysis The Skill directs the Agent or user to install an external npm package, clone or otherwise obtain a separate repository, and execute that repository's `scripts/run.js`. This third-party code is outside the audited project. Pinning the npm package to version `3.3.1` and disabling npm lifecycle scripts are useful mitigations, but they do not establish the integrity of: - The package contents served by the registry. - Transitive dependencies installed with the package. - The separately obtained Git repository. - The relationship between the npm package and the executed repository. - Future replacement or compromise of the local checkout path. The documentation itself acknowledges that the fixed version does not mean the dependency h ...[truncated 1668 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/run.js:122
Finding

Server-provided credential configuration links are not restricted to trusted HTTPS origins

Content
View full analysis
typeof value === 'string' && /^https?:\/\//.test(value)) || ''; } ``` The returned value is subsequently presented as a trusted WeChat credential configuration link: ```javascript const link = pickLink(data); if (!link) { console.error(JSON.stringify({ success: false, error: '服务器没有返回可打开的 AppID/AppSecret 配置短链', responseKeys: data && typeof data === 'object' ? Object.keys(data) : [] }, null, 2)); process.exit(1); } const serverIps = Array.isArray(data.serverIps) ? data.serverIps : []; process.stderr.write('\n请在浏览器中打开以下链接填写 AppID / AppSecret:\n'); process.stderr.write(` ${link}\n`); ``` The same helper is used for wrapper configuration: ```javascript const link = pickLink(data); if (!link) { console.error(JSON.stringify({ success: false, error: '服务器没有返回可打开的页眉/页脚配置短链', responseKeys: data && typeof data === 'object' ? Object.keys(data) : [] }, null, 2)); process.exit(1); } process.stderr.write('\n请在浏览器中打开以下链接编辑页眉/页脚:\n'); process.stderr.write(` ${link}\n`); ``` ### Technical Analysis Outbound API calls are carefully constrained to allowlisted HTTPS services, but `pickLink()` applies a weaker policy to links returned by those services. It accepts any string beginning with either `http://` or `https://`, without validating: - The destination origin. - Whether HTTPS is used. - The expected path prefix. - Embedded URL credentials. - Whether the destination is the legitimate configuration service. The Skill ...[truncated 1635 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/run.js:1446
Finding

Logout deletes the local credential without confirming remote API-key revocation

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
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (114)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

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
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

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
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| 帮我登录 / 注册 / 绑定账号 | `scripts/run.js login` | **fire-and-forget (checkpoint 模型)**:命令 ~0.3s 返回,写 `~/.web-publisher/login-pending.json` 等待用户在浏览器授权。把 stdout JSON 里

Static analysis

No suspicious patterns detected.