Back to skill

Security audit

blog-mini-kit-ljt2

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent blog API management tool, but it grants broad write, delete, and local-file upload authority with weak scoping and some under-disclosed side effects.

Install only if you trust the target blog API and are comfortable with an agent creating, updating, deleting, and uploading content there. Prefer HTTPS, avoid using --pwd on the command line, restrict upload paths manually, confirm destructive actions with the user, and avoid enabling the Issue/PR comment behavior unless that external posting channel is explicitly intended.

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

T09 · Insecure Skill Coding Practices

Warning
Location
blog-mini-kit-ljt2.py:493
Finding

User Password Exposure Through Command-Line Arguments and Unencrypted HTTP

Content
View full analysis
").strip().rstrip('/') if not base_url: print("错误:API 地址不能为空", file=sys.stderr) sys.exit(3) if not (base_url.startswith("http://") or base_url.startswith("https://")): print("错误:地址必须以 http:// 或 https:// 开头", file=sys.stderr) sys.exit(3) print("提示:可通过 export %s_BASE_URL=\"%s\" 永久设置,避免每次输入。" % (_CRED_PREFIX, base_url)) ``` `blog-mini-kit-ljt2.py:251-256` places the supplied password directly into the request body: ```python payload = {'uname': args.uname} if args.phone is not None: payload['phone'] = args.phone if args.pwd is not None: payload['pwd'] = args.pwd if args.email is not None: ``` `blog-mini-kit-ljt2.py:490-494` accepts that password as a command-line argument: ```python p_cu = sub.add_parser('create-user', help='创建用户') p_cu.add_argument('--uname', required=True, help='用户名(必填)') p_cu.add_argument('--phone', default=None, help='手机号') p_cu.add_argument('--pwd', default=None, help='密码') p_cu.add_argument('--email', default=None, help='邮箱') ``` The documented invocation in `SKILL.md:295` also encourages direct command-line password entry: ```bash python3 scripts/blog-mini-kit-ljt2.py create-user --uname "用户名" [--phone TXT] [--pwd TXT] [--email TXT] [--img TXT] ``` The configuration guidance explicitly presents HTTP URLs in `SKILL.md:41,55,65`, including: ```bash export BLOG_MINI_KIT_LJT2_BASE_URL="http://:" # (示例) ``` ### Technical Analysis Passwords passed through `--pwd` can be retained in shell history and may be visible in process listings, audit logs, terminal recording systems, job-runner metadata, and monitoring tools. On multi-user syst ...[truncated 1951 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (23)

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
70% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · blog-mini-kit-ljt2.py (reported line 62)May include surrounding context.

python
"""
    creds = {}
    creds.update(_load_from_project_knowledge())
    for k, v in os.environ.items():
        u = k.upper()
        if u.startswith(_CRED_PREFIX):
            if 'BASE_URL' in u:

Tainted flow: 'files' from open (line 332, file read) → requests.post (network output)

High
Category
Data Flow
Confidence
95% confidence
Finding

The upload paths read arbitrary local files specified by the caller and transmit their contents to a remote base_url via requests.post. In an agent/skill setting this creates a real exfiltration primitive, especially because the destination URL is configurable and the API is explicitly unauthenticated/public, so local workspace files or secrets could be sent off-host without meaningful guardrails.

Content

Scanner excerpt · blog-mini-kit-ljt2.py (reported line 136)May include surrounding context.

python
if method == 'GET':
            resp = requests.get(url, params=params, timeout=30, **auth_kwargs)
        elif method == 'POST':
            resp = requests.post(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PUT':
            resp = requests.put(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PATCH':

Tainted flow: 'files' from open (line 332, file read) → requests.put (network output)

High
Category
Data Flow
Confidence
80% confidence
Finding

File contents flow to a network sink. This may indicate data exfiltration of sensitive files.

Content

Scanner excerpt · blog-mini-kit-ljt2.py (reported line 138)May include surrounding context.

python
elif method == 'POST':
            resp = requests.post(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PUT':
            resp = requests.put(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PATCH':
            resp = requests.patch(url, json=payload, timeout=30, **auth_kwargs)
        elif method == 'DELETE':

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill declares powerful capabilities (environment access, file reads, and network use) but does not constrain them with an explicit tool scope such as allowed-tools or permissions. This increases the chance that an agent using the skill will access local configuration or make unintended outbound requests beyond the blog API surface described by the skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest trigger list includes the single word "博客", which is a generic everyday term rather than a narrowly scoped invocation phrase. Because this file does not provide exclusion conditions or tighter activation context for that trigger, it could cause unintended skill activation when users merely discuss blogs.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

These triggers describe broad content areas rather than precise invocation commands, and they can appear in normal user requests without meaning to invoke this specific skill. The file does not state contextual limits, an explicit invocation syntax, or negative examples to distinguish intended activation from ordinary discussion.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs the agent to create Issue/PR comments, which is outside the declared purpose of a blog API management tool. This scope expansion can cause the agent to interact with an external collaboration system and publish data or operational results where they do not belong.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The output format requires Issue comments summarizing execution results, which extends the skill into external workflow automation unrelated to blog API management. This creates a channel for unintended disclosure of API responses, identifiers, or operational metadata into another system.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instruction that the agent 'must execute Issue comment ... then end the task' forces an external side effect not justified by the skill's stated function. Mandatory external posting increases the risk of cross-system data leakage and makes the skill harder to safely compose in environments without explicit collaboration-tool authorization.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file documents deletion and restoration behavior for articles, including a soft=false option that implies hard deletion, but it does not warn readers about the data-loss implications. Under the markdown-file criteria, destructive behaviors that could affect user data should include an explicit warning.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The file lists delete operations for comments, messages, moods, and uploaded files, but provides no warning that these actions may remove user-generated content or files. The markdown guidance should disclose behaviors that can affect user data or system integrity.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · blog-mini-kit-ljt2.py (reported line 136)May include surrounding context.

python
if method == 'GET':
            resp = requests.get(url, params=params, timeout=30, **auth_kwargs)
        elif method == 'POST':
            resp = requests.post(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PUT':
            resp = requests.put(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PATCH':

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · blog-mini-kit-ljt2.py (reported line 138)May include surrounding context.

python
elif method == 'POST':
            resp = requests.post(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PUT':
            resp = requests.put(url, json=payload, files=files, timeout=30, **auth_kwargs)
        elif method == 'PATCH':
            resp = requests.patch(url, json=payload, timeout=30, **auth_kwargs)
        elif method == 'DELETE':

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The upload commands send local file contents to a remote server without any user-facing confirmation about data disclosure. In a tool intended for agent use, this increases the chance of accidental exfiltration of sensitive local files because the action is framed as routine API usage rather than a potentially sensitive outbound transfer.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This JSON manifest contains multiple user-facing natural-language fields such as descriptions and notes entirely in Chinese. Under the stated policy, forcing a specific language or locale without user opt-in is a natural-language policy violation unless the locale constraint is documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
70% confidence
Finding

Overly Broad Trigger: '博客' is too short and may match unintended inputs

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
70% confidence
Finding

Overly Broad Trigger: '说说' is too short and may match unintended inputs

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

文档在开头强调该技能是“无认证公开 API”,给人的预期是不依赖本地凭据或敏感配置;但后文又专门说明 .project-info/ 含敏感配置,并定义了环境变量/项目配置解析优先级。虽然这些配置目前主要用于 base_url,但这种文档表述会让技能意图从“无需配置的公开 API”偏离到“读取本地敏感配置”。

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

该技能宣称自己是无认证的公开博客 API 管理工具,但文档要求优先扫描 .project-info/ 目录中的 JSON 配置以解析 base_url。对于一个公开 API 管理工具而言,请求用户提供 base_url 或读取单一环境变量即可,递归扫描项目知识目录属于额外的本地数据访问能力。

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document consistently presents operational API documentation in Chinese, with only limited English labels, and does not indicate that language selection is optional or region-specific. This can violate language/locale policy when a specific language is imposed without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

Natural-language strings that describe capabilities, prompts, errors, and help text are presented exclusively in Chinese, with no indication that users can choose another language. This can violate a language/locale policy when the skill is intended for general use rather than a clearly documented Chinese-only context.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The dependency is specified as requests>=2.20.0, which allows installation of a wide range of versions, including future releases and historically vulnerable versions. This undermines reproducibility and makes it impossible to ensure the deployed package is free from known security issues, especially in a publicly exposed API tool.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.20.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The manifest references requests without pinning to a version, while the package has multiple published advisories. Because the actual installed version is unconstrained beyond a very low minimum, the environment could resolve to a release affected by issues such as credential leakage or certificate verification flaws, which is more concerning for a tool interacting with networked blog-management APIs and file uploads.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.