Back to skill

Security audit

Octo Mention

Security checks for vulnerabilities and agentic risk

Overview

The skill is not malicious, but it collects and stores sensitive group-chat identity evidence across groups in a way users should review carefully before installing.

Install only if users in the relevant groups understand that message history, names, aliases, group IDs, uid links, and evidence snippets may be stored locally in plaintext and combined across groups. Prefer using it with explicit group consent, a private machine/account, restricted file permissions, and a cleanup or retention process for the generated database.

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
scripts/merge_mentions.py:219
Finding

Plaintext Retention and Cross-Group Aggregation of Sensitive Chat Data

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:11-13, 48-66, 81-93; scripts/merge_mentions.py:67-76, 219-220
Vulnerability Type: Sensitive data stored in plaintext with excessive retention
Risk Level: Medium

Vulnerable Code and Instructions

The Skill explicitly defines the mapping database as sensitive and stores it at a fixed location:

markdown
> **Data path**: The mapping database is fixed at `~/.mano-asr/mentions/openclaw.json` for use with **mano-asr**.
> ⚠️ **Privacy**: The generated mapping database contains group members' real names and message evidence and is therefore **sensitive data**.

It mandates collecting a broad historical message window and correlating identities across groups:

markdown
- **New-group initialization**: `limit=200` (or retrieve all available history)
- **Incremental update**: retrieve messages since the last analysis; when that cannot be determined, default to `limit=100`
- **Minimum threshold**: never use fewer than 100 messages

- Each item of evidence includes a `group_id` label.
- `seen_in_groups` records every group in which the person appeared.
- All mappings are merged across groups by `uid` into the same `openclaw.json`.

The merge implementation retains complete evidence objects, including message text, and writes the resulting database as ordinary plaintext JSON:

python
for e in a.get("evidence", []):
    if ev_key(e) not in seen:
        tgt.setdefault("evidence", []).append(e)
        seen.add(ev_key(e))
        added += 1
python
out = merge(base, new)
os.makedirs(os.path.dirname(os.path.abspath(args.out)), exist_ok=True)
json.dump(out, open(args.out, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
print(f"merged -> {args.out} | version={out['version']} persons={len(out['persons'])}")

Technical Analysis

The Skill intentionally processes sensitive group-chat history and persists complete evidence records containing message text, sender identifiers, tim ...[truncated 2618 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require explicit authorization before collecting message history from each group and before enabling cross-group identity correlation.
  2. Make cross-group aggregation opt-in. Keep records isolated by group unless correlation is necessary and approved.
  3. Apply data minimization:
    • Do not impose a blanket minimum of 100 messages.
    • Retrieve only messages needed to resolve outstanding aliases.
    • Avoid storing complete message text by default.
    • Store redacted excerpts, irreversible hashes, or message IDs when possible.
  4. Add a configurable retention policy for raw evidence, aliases, group associations, conflicts, and previous names. Provide commands to delete a person, a group, or all expired evidence.
  5. Create output files with owner-only permissions, such as mode 0600, and verify permissions after replacement.
  6. Use atomic writes: create a restrictive temporary file in the destination directory, flush and synchronize it, then replace the destination with os.replace.
  7. Consider authenticated encryption for data at rest, with keys supplied through an operating-system key store rather than committed configuration.
  8. Validate the destination path and reject symlinks or unexpected file types before writing when the tool may operate in a shared or adversarial local environment.
  9. Document the threat model, lawful basis or consent requirements, access policy, retention duration, and incident-response procedure for this sensitive database.
  10. Add automated tests verifying restrictive permissions, atomic replacement, evidence expiration, redaction, deletion, and opt-in cross-group correlation.
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个自动化“昵称映射分析”能力:应当从群成员与历史消息中提取证据,生成带置信度、证据、冲突的映射,并支持增量合并。当前代码并不做采集、解析、分析或映射生成;它只对已有数据库结果进行人工校正和维护。虽然代码操作的对象仍然是别名/昵称映射,属于同一业务领域,但其主要目的与行为明显不同:这是后处理的人工修订工具,不是前述自动分析工具。因此构成描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个“映射分析/构建与维护”能力:从权威成员字段和历史消息中提取、归并、更新群成员称呼映射,用于维护 mention 映射表。代码实际只是消费端查询工具,读取现成的 JSON 数据库,对给定 alias 做精确匹配检索,并计算时间衰减后的 effective_confidence 后排序输出。它不抓取历史消息、不分析成员关系、不写回数据库、不做 upsert,也没有实现冲突处理逻辑。虽然领域仍与昵称/别名映射有关,但主功能从“构建和维护映射”变成了“查询已有映射”,属于实质性用途不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个“分析”型技能:利用权威成员字段和历史消息,为群内成员建立称呼映射,并做增量 upsert。实际代码并不抓取任何消息、也不从原始聊天中推断昵称;它只读取 --base 和 --new 两个 JSON 文件,把已有分析结果合并为跨群的人物中心库。虽然代码确实保留了置信度、证据、冲突并支持增量合并,和“维护 mention 映射表”有部分相关,但其核心目的明显偏向‘合并/汇总已产出的映射结果’,而不是‘分析并建立映射’。此外,声明强调单群成员昵称映射分析,代码则明确以“同一 uid 跨群为同一实体”为核心进行跨群合并。因此描述与实际行为存在实质性偏差。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个“昵称映射分析/构建”技能,核心能力应包括数据采集、证据分析、别名推断、冲突处理与映射维护。实际代码仅是一个报告渲染器:从输入 JSON 读取已存在的 persons 结构,按 member_type 分类,并把 canonical_name、aliases、uncertain_aliases、conflicts 等内容输出成 Markdown。虽然输出内容与昵称映射主题相关,但它依赖上游已生成的数据,本身不负责分析或维护映射,因此其主要用途与声明存在实质性不符。

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill describes file-writing behavior to a fixed path under the user's home directory and invokes local scripts that modify JSON/Markdown state, but it does not declare any explicit tool scope or allowed-tools restrictions. In an agent environment, this creates unnecessary ambiguity about what filesystem access the skill expects and can enable broader-than-intended writes if the runtime grants default capabilities.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly instructs broad collection of message history, extraction of nicknames from conversation context, and long-term storage of sensitive evidence text tied to user identities across multiple groups in a shared local database. This creates a real privacy and data-minimization risk: private conversations, relationship inferences, and identifiers can be retained longer than necessary and combined across contexts, increasing harm if the file is exposed or misused.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This Python file contains user-facing natural-language documentation entirely in Chinese, including the tool description, operations, and usage guidance. There is no indication that users may choose another language or that the Chinese-only constraint is intentionally limited to a justified region-specific context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code file contains natural-language documentation entirely in Chinese and the runtime user-facing messages are also hard-coded in Chinese, which imposes a specific language on users without offering a language choice. The policy explicitly flags language or locale constraints unless they are optional or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This Python file contains user-facing natural-language strings entirely in Chinese, including the module description and the generated Markdown headings. The skill does not offer any language selection or explain that it is intentionally limited to a Chinese-speaking context, which is a locale/language policy issue under the stated rules.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.