Back to skill

Security audit

Alembic

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent local note-making helper with some implementation safety caveats, but I found no hidden, deceptive, or malicious behavior.

Install only if you are comfortable letting the agent read your selected note vault for conflict checks and write Markdown notes to the chosen output directory. Use HTTPS ChatGPT share links, avoid untrusted links, choose simple keywords that cannot be interpreted as paths, and review generated notes before relying on them.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/parse_chatgpt_share.py:35
Finding

Domain Allowlist Bypass Through HTTP and Unvalidated Redirects

Content
View full analysis
None: """校验 URL 是否为合法的 ChatGPT 共享链接""" if not ALLOWED_URL_PATTERN.match(url): raise ValueError( f"不支持的 URL 格式: {url}\n" f"仅支持 ChatGPT 共享链接,格式如: https://chatgpt.com/share/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ) def fetch_html(url: str) -> str: """用 Python 标准库下载共享页面 HTML(不依赖 curl)""" validate_url(url) req = urllib.request.Request( url, headers={ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/125.0.0.0 Safari/537.36", }, ) try: with urllib.request.urlopen(req, timeout=60) as resp: raw = resp.read() # 尝试从 Content-Type 获取编码,默认 utf-8 charset = resp.headers.get_content_charset() or "utf-8" html = raw.decode(charset, errors="replace") ``` ### Technical Analysis The parser validates only the URL initially supplied to `fetch_html()`. Python's default `urllib.request.urlopen()` behavior follows HTTP redirects automatically, but the code does not validate each redirect target or inspect and validate `resp.geturl()` after the request completes. As a result, an initially permitted ChatGPT URL can cause the client to fetch content from a destination outside the documented allowlist if the permitted endpoint returns a redirect. The regular expression also explicitly permits both `http://` and `https://`, despite the documentation describing an HTTPS-only restriction. Permitting plaintext HTTP creates a practical int ...[truncated 1619 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
SKILL.md:253
Finding

Unconstrained Agent-Generated Filenames May Escape the Selected Output Directory

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个“知识蒸馏/笔记生成”工具,核心能力应包括对对话内容进行总结、提炼关键词、结构化整理,并产出适合 Obsidian 的 Markdown。实际代码只是一个底层解析器:校验 ChatGPT 分享链接、抓取 HTML、解析前端 RSC 序列化数据、提取消息列表并输出 JSON。虽然它与“解析 ChatGPT 共享链接”这一子任务相关,但没有任何知识蒸馏、摘要、关键词提取、结构化笔记生成或 Markdown 输出逻辑,因此主要用途与声明存在明显偏差。

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

cat "$SKILL_DIR/parsed_conversation.json"

text

> **注意**:解析完成并生成笔记后,应清理临时文件:`rm -f "$SKILL_DIR/parsed_conversation.json"`

### 模式 B:用户直接粘贴对话文本

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill instructs use of network access, file reads/writes, and shell commands, but it declares no explicit tool scope or permissions boundary. That gap increases the chance an agent runtime grants broader capabilities than intended, making unintended filesystem access, network fetches, or command execution harder to constrain and audit.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring, CLI description, help text, and runtime messages are written exclusively in Chinese, which imposes a specific language on users. The file does not provide any language selection, opt-in, or justification that this is a region-specific tool, so this is a natural-language locale policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instruction "中文回复,技术术语保留英文" forces a specific language/locale behavior for all outputs. The policy category forbids language constraints unless the skill offers user opt-in or clearly justifies a region-specific requirement, which is not present here.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.