Back to skill

Security audit

wechat-local-reader

Security checks for vulnerabilities and agentic risk

Overview

This skill is a local WeChat reader, but it uses highly sensitive key extraction, plaintext caches, broad chat export, and persistent privilege changes that need careful review before installation.

Install only if you understand that this tool can decrypt and expose local WeChat chats, contacts, favorites, and key material. Avoid running the privilege-changing setup steps unless you can reverse them, do not send summaries to webhooks/email unless the destination is trusted, use --mask and --clean where possible, and treat ~/.wechat-cli/all_keys.json plus the temp cache as highly sensitive secrets.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (6)

T09 · Insecure Skill Coding Practices

Error
Location
tool/wechat_cli/core/db_cache.py:29
Finding
Predictable Shared Plaintext Cache Permits Symlink-Based Disclosure, File Overwrite, and Unsafe Cleanup<![CDATA[ ## Vulnerability Details **File Location**: `tool/wechat_cli/core/db_cache.py:29-37, 42, 68-75, 113-133`; `tool/wechat_cli/core/crypto.py:31-44` **Vulnerability Type**: Unsafe temporary-file handling and symlink traversal **Risk Level**: High ### Vulnerable Code ```python class DBCache: CACHE_DIR = os.path.join(tempfile.gettempdir(), "wechat_cli_cache") MTIME_FILE = os.path.join(tempfile.gettempdir(), "wechat_cli_cache", "_mtimes.json") def __init__(self, all_keys, db_dir): self._all_keys = all_keys self._db_dir = db_dir self._cache = {} os.makedirs(self.CACHE_DIR, exist_ok=True) _restrict_dir(self.CACHE_DIR) self._load_persistent_cache() def _cache_path(self, rel_key): h = hashlib.md5(rel_key.encode()).hexdigest()[:12] return os.path.join(self.CACHE_DIR, f"{h}.db") ``` ```python def _save_persistent_cache(self): data = {} for rel_key, (db_mt, wal_mt, path) in self._cache.items(): data[rel_key] = {"db_mt": db_mt, "wal_mt": wal_mt, "path": path} try: with open(self.MTIME_FILE, 'w', encoding="utf-8") as f: json.dump(data, f) except OSError: pass ``` ```python def full_decrypt(db_path, out_path, enc_key): file_size = os.path.getsize(db_path) total_pages = file_size // PAGE_SZ os.makedirs(os.path.dirname(out_path), exist_ok=True) with open(db_path, 'rb') as fin, open(out_path, 'wb') as fout: for pgno in range(1, total_pages + 1): page = fin.read(PAGE_SZ) if len(page) < PAGE_SZ: if len(page) > 0: page = page + b'\x00' * (PAGE_SZ - len(page)) else: break fout.write(decrypt_page(enc_key, page, pgno)) return total_pages ``` ```python @classmethod def clear_cache(cls): removed = 0 if os.path.isdir(cls.CACHE_DIR): for entry in os.listdir(cls.CACHE_DIR): p = os.path ...[truncated 2856 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the global fixed path with a private per-user cache directory, preferably created using `tempfile.mkdtemp()` or a platform-specific secure user cache location. 2. Create the directory with mode `0700` from the outset rather than applying permissions afterward. 3. Use `os.lstat()` to reject symbolic links and verify that the cache directory is owned by the effective user. 4. Create plaintext files with `os.open()` using `O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW` and mode `0600`, where supported. 5. Write decrypted content to a securely created temporary file and atomically rename it after successful completion. 6. Treat ownership and permission-hardening failures as fatal errors instead of silently ignoring them. 7. Before cleanup, verify the cache root's device, inode, ownership, permissions, and non-symlink status. 8. Do not recursively delete unexpected directories. Maintain an explicit manifest of files created by the application and delete only verified regular files. 9. Use an HMAC or random mapping for cache filenames rather than a short, predictable MD5 digest. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
tool/wechat_cli/keys/scanner_linux.py:103
Finding
Documentation Recommends Granting Global CAP_SYS_PTRACE to the System Python Interpreter<![CDATA[ ## Vulnerability Details **File Location**: `tool/wechat_cli/keys/scanner_linux.py:103-120` **Vulnerability Type**: Persistent overprivileged interpreter capability **Risk Level**: High ### Vulnerable Code ```python def _check_permissions(): """检查是否有读取进程内存的权限。""" if os.geteuid() == 0: return try: with open("/proc/self/status") as f: for line in f: if line.startswith("CapEff:"): cap_eff = int(line.split(":")[1].strip(), 16) CAP_SYS_PTRACE = 1 << 19 if cap_eff & CAP_SYS_PTRACE: return break except (OSError, ValueError): pass raise RuntimeError( "需要 root 权限或 CAP_SYS_PTRACE 才能读取进程内存\n" "请使用: sudo wechat-cli init\n" "或授予 capability: sudo setcap cap_sys_ptrace=ep $(which python3)" ) ``` ### Technical Analysis The recommended command applies `CAP_SYS_PTRACE` to the executable returned by `which python3`. File capabilities apply to the interpreter itself, not only to this Skill or a single invocation. As a result, every subsequently executed Python program using that interpreter may inherit a process-tracing capability. This materially expands the privilege of arbitrary Python scripts and exceeds the narrow requirement to inspect a verified WeChat process during one initialization operation. The capability persists across sessions until explicitly removed. The error message does not provide a cleanup command, warn that all Python code using that interpreter becomes privileged, or constrain the capability to a dedicated helper. ### Attack Path 1. A user encounters the process-memory permission error. 2. The user follows the displayed command: `sudo setcap cap_sys_ptrace=ep $(which python3)`. 3. The system Python interpreter permanently receives `CAP_SYS_PTRACE`. 4. Later, the user runs an unrelated or malicious Python script through that interpreter. ...[truncated 693 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the recommendation to assign `CAP_SYS_PTRACE` to the general-purpose Python interpreter. 2. Implement a small, dedicated, audited native helper that performs only the required WeChat-process inspection. 3. If a file capability is unavoidable, grant it only to that dedicated helper and validate the target process identity immediately before every memory read. 4. Prefer temporary interactive elevation for the narrowly scoped initialization operation. 5. Drop elevated privileges immediately after opening the verified process handle. 6. Document capability removal, such as `sudo setcap -r <dedicated-helper>`, and verify removal after use. 7. Refuse arbitrary PIDs unless the executable identity, owner, command name, and process start time have been validated. 8. Warn users clearly that process-memory inspection can expose all secrets held by the target process. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
tool/wechat_cli/keys/scanner_macos.py:71
Finding
Optional macOS Re-Signing Weakens WeChat Code-Signing and Debugger Protections<![CDATA[ ## Vulnerability Details **File Location**: `tool/wechat_cli/keys/scanner_macos.py:71-120, 175-224`; `tool/README_CN.md:122-149` **Vulnerability Type**: Application integrity modification and debugger entitlement enablement **Risk Level**: Medium ### Vulnerable Code ```python def _build_entitlements_xml(app_path): """构建 entitlements:保留原有权限 + 添加 get-task-allow。""" entitlements = _get_original_entitlements(app_path) if entitlements is None: entitlements = {} entitlements["com.apple.security.get-task-allow"] = True return plistlib.dumps(entitlements, fmt=plistlib.FMT_XML) ``` ```python result = subprocess.run( ["codesign", "--force", "--sign", "-", "--entitlements", ent_path, wechat_app], capture_output=True, text=True, timeout=60, ) ``` ```python if "task_for_pid" in combined_output: if not allow_resign: raise RuntimeError( "macOS 安全策略阻止了进程内存访问(task_for_pid 失败)。\n" "出于安全考虑,本工具默认【不会】自动修改微信签名。\n" ... " sudo wechat-cli init --allow-resign\n" ... ) ok, err = _resign_wechat() ``` The bundled README also directs users to replace WeChat's signature manually: ```bash sudo codesign --force --sign - --entitlements /dev/stdin /Applications/WeChat.app <<'EOF' <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.get-task-allow</key> <true/> </dict> </plist> EOF ``` ### Technical Analysis When the user explicitly supplies `--allow-resign`, the Skill replaces the vendor signature on `WeChat.app` with an ad-hoc signature and adds `com.apple.security.get-task-allow`. This entitlement is designed to permit debugger attachment. The operation modifies a separately installed application and leaves the modified signature and entitlement in place after key extraction. There is no automatic ...[truncated 1390 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not modify the signature or entitlements of the installed WeChat application. 2. Prefer a supported, narrowly scoped process-inspection mechanism that does not alter the target application. 3. If re-signing remains available, place it behind a separate command with a prominent security warning and interactive confirmation. 4. Explain that the vendor signature is replaced and that debugger access is being enabled. 5. Record the original signature state and provide a tested rollback workflow. 6. Restore the official application immediately after key extraction, for example by requiring reinstallation from a verified vendor source. 7. Verify the application's signature and entitlements before and after the operation. 8. Update the README so it does not characterize re-signing as categorically safe. 9. Do not claim that all original entitlements are preserved when entitlement extraction can fail and the code falls back to an empty dictionary. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
tool/wechat_cli/keys/common.py:61
Finding
Extracted WeChat Database Encryption Keys Are Printed to Standard Output<![CDATA[ ## Vulnerability Details **File Location**: `tool/wechat_cli/keys/common.py:61-117` **Vulnerability Type**: Sensitive cryptographic material exposed through logs **Risk Level**: High ### Vulnerable Code ```python if hex_len == 96: enc_key_hex = hex_str[:64] salt_hex = hex_str[64:] if salt_hex in remaining_salts: enc_key = bytes.fromhex(enc_key_hex) for rel, path, sz, s, page1 in db_files: if s == salt_hex and verify_enc_key(enc_key, page1): key_map[salt_hex] = enc_key_hex remaining_salts.discard(salt_hex) dbs = salt_to_dbs[salt_hex] print_fn(f"\n [FOUND] salt={salt_hex}") print_fn(f" enc_key={enc_key_hex}") print_fn(f" PID={pid} 地址: 0x{addr:016X}") print_fn(f" 数据库: {', '.join(dbs)}") break ``` ```python elif hex_len == 64: if not remaining_salts: continue enc_key_hex = hex_str enc_key = bytes.fromhex(enc_key_hex) for rel, path, sz, salt_hex_db, page1 in db_files: if salt_hex_db in remaining_salts and verify_enc_key(enc_key, page1): key_map[salt_hex_db] = enc_key_hex remaining_salts.discard(salt_hex_db) dbs = salt_to_dbs[salt_hex_db] print_fn(f"\n [FOUND] salt={salt_hex_db}") print_fn(f" enc_key={enc_key_hex}") print_fn(f" PID={pid} 地址: 0x{addr:016X}") print_fn(f" 数据库: {', '.join(dbs)}") break ``` ```python elif hex_len > 96 and hex_len % 2 == 0: enc_key_hex = hex_str[:64] salt_hex = hex_str[-32:] if salt_hex in remaining_salts: enc_key = bytes.fromhex(enc_key_hex) for rel, path, sz, s, page1 in db_files: if s == salt_hex and verify_enc_key(enc_key, page1): key_map[salt_hex] = enc_key_hex remaining_salts.discard(salt_hex) dbs = salt_to_dbs[salt_hex] ...[truncated 2021 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove all logging of `enc_key`, raw key candidates, or any reversible representation of keys. 2. Log only the number of successfully matched databases and, if necessary, a short non-secret fingerprint generated with a one-way hash. 3. Add a centralized logging redaction filter that removes key-like 64-character hexadecimal values. 4. Warn users of affected releases that previous initialization logs may contain keys and should be securely deleted. 5. Recommend key re-extraction or database-key rotation where the underlying application supports it. 6. Add automated tests that fail if raw key material appears in stdout or stderr. 7. Review exception messages and helper output to ensure key material cannot be included indirectly. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
tool/wechat_cli/commands/init.py:27
Finding
Sensitive State and Key Files Are Written Non-Atomically With Symlink-Following Semantics<![CDATA[ ## Vulnerability Details **File Location**: `tool/wechat_cli/commands/init.py:27-28, 59-65`; `tool/wechat_cli/keys/common.py:174-179`; `tool/wechat_cli/keys/scanner_macos.py:227-248` **Vulnerability Type**: Insecure sensitive-file creation and path validation **Risk Level**: Medium ### Vulnerable Code ```python # 2. 创建状态目录 os.makedirs(STATE_DIR, exist_ok=True) ``` ```python # 5. 写入配置 cfg = { "db_dir": db_dir, } with open(CONFIG_FILE, "w", encoding="utf-8") as f: json.dump(cfg, f, indent=2, ensure_ascii=False) ``` ```python with open(output_path, 'w', encoding='utf-8') as f: json.dump(result, f, indent=2, ensure_ascii=False) # 密钥文件含微信数据库解密密钥,限制为仅本人可读写,防止本机其他用户/进程读取 try: os.chmod(output_path, 0o600) except OSError: pass ``` The macOS path has the same pattern and additionally trusts a predictable helper output: ```python c_output = os.path.join(work_dir, "all_keys.json") if not os.path.exists(c_output): raise RuntimeError( "C 二进制未能生成密钥文件。\n" f"stdout: {result.stdout}\nstderr: {result.stderr}" ) with open(c_output, encoding="utf-8") as f: keys_data = json.load(f) with open(output_path, 'w', encoding='utf-8') as f: json.dump(keys_data, f, indent=2, ensure_ascii=False) try: os.chmod(output_path, 0o600) except OSError: pass if os.path.abspath(c_output) != os.path.abspath(output_path): os.remove(c_output) ``` ### Technical Analysis The state directory is created without an explicit `0700` mode and without checking whether it is a symbolic link, who owns it, or whether its existing permissions are secure. Configuration and key files are opened using ordinary `open(..., 'w')`, which follows symbolic links and truncates existing targets. The code applies mode `0600` only after writing the complete secret. Until that point, file permissions depend on the process umask and properties of any pre-existing object. Security-critical `chmod` failures are ignored. On macOS, the external helper ...[truncated 1449 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create the state directory with mode `0700` and verify its owner, type, and permissions before use. 2. Reject symbolic links for the state directory, key file, configuration file, and macOS helper output. 3. Use `os.open()` with `O_CREAT | O_EXCL | O_NOFOLLOW` and mode `0600` for newly created sensitive files. 4. For updates, write to a securely created temporary file in the same verified directory, call `fsync()`, and atomically replace the destination. 5. Apply the desired mode at creation time instead of after secret data has been written. 6. Treat permission-setting or ownership-validation failures as fatal. 7. Validate the macOS helper output with `lstat()`, require a regular file owned by the expected user, and reject unexpected hard links. 8. Have the helper accept a securely created file descriptor or unpredictable output path instead of writing a fixed filename. 9. Avoid running general Python file-handling logic as root. Separate and minimize the privileged operation. ]]>

T08 · Insecure Dependencies

Warning
Location
tool/setup.sh:8
Finding
Installation Resolves Mutable Third-Party Packages Without a Lockfile or Integrity Hashes<![CDATA[ ## Vulnerability Details **File Location**: `tool/setup.sh:8-13`; `tool/setup.ps1:7-12`; `tool/pyproject.toml:1-14`; `tool/requirements.txt:1-3` **Vulnerability Type**: Non-reproducible dependency installation and supply-chain exposure **Risk Level**: Medium ### Vulnerable Code ```bash echo "[1/3] 创建隔离虚拟环境 .venv ..." python3 -m venv .venv echo "[2/3] 安装依赖并注册 wechat-cli 命令 ..." .venv/bin/python -m pip install --upgrade pip -q .venv/bin/python -m pip install -e . -q ``` ```powershell Write-Host "[1/3] 创建隔离虚拟环境 .venv ..." python -m venv .venv Write-Host "[2/3] 安装依赖并注册 wechat-cli 命令 ..." & .venv\Scripts\python.exe -m pip install --upgrade pip -q & .venv\Scripts\python.exe -m pip install -e . -q ``` ```toml [build-system] requires = ["setuptools>=68.0", "wheel"] build-backend = "setuptools.build_meta" [project] dependencies = [ "click>=8.1,<9", "pycryptodome>=3.19,<4", "zstandard>=0.22,<1", ] ``` ```text click>=8.1,<9 pycryptodome>=3.19,<4 zstandard>=0.22,<1 ``` ### Technical Analysis The setup scripts access the Python package registry and install the newest package releases satisfying broad version ranges. Build dependencies are also mutable, and pip itself is upgraded to an unspecified current version. No lockfile, cryptographic hashes, reviewed artifact list, or constrained package-index configuration is present. Consequently, identical source code can install different executable dependency code at different times. Python package installation may execute build-backend code. A compromised dependency release, maintainer account, registry response, or package-index configuration could therefore introduce code execution during setup or later runtime. No evidence was found that the declared dependency names are typosquatted or intentionally malicious. The finding concerns installation integrity and reproducibility rather than a confirmed malicious package. ### Attack Path 1. A declared dependency or build dependency publishes a co ...[truncated 889 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every runtime and build dependency to an exact reviewed version. 2. Generate a lockfile containing cryptographic hashes for every supported platform and Python version. 3. Install with hash enforcement, such as `pip install --require-hashes -r requirements.lock`. 4. Pin `setuptools`, `wheel`, and other build-system requirements exactly. 5. Remove the unconditional pip self-upgrade or pin pip to a reviewed version. 6. Configure an explicit trusted package index and disable unintended extra indexes. 7. Maintain a dependency-update process that includes vulnerability scanning, changelog review, and artifact-hash regeneration. 8. Consider distributing a reproducibly built wheel so end users do not invoke a mutable build backend during installation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (50)

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill declares no permissions while its documented behavior clearly requires shell execution, environment manipulation, file reads/writes, and access to highly sensitive local WeChat data. This under-declaration is dangerous because it obscures the real privilege and data-access surface from reviewers and users, especially for a tool that extracts database keys from process memory and produces plaintext caches.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The marketed description frames the skill as a benign local summarizer, but the documented behavior includes extracting encryption keys from running process memory, decrypting local databases, exposing broad chat/contact data, exporting plaintext history, and persisting decrypted caches. That mismatch materially hides invasive capabilities and can mislead users into authorizing a credential- and privacy-sensitive data extraction tool under a much narrower 'daily brief' label.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The documentation claims the tool has no HTTP/socket/upload behavior, yet later instructs users to send generated reports to webhooks, email, and arbitrary HTTP endpoints. Even if the exfiltration is delegated to automation rather than built into the core CLI, this contradiction can create a false sense of 'zero upload' safety and lead users to transmit sensitive chat-derived content externally without appreciating the risk.

Description-Behavior Mismatch

Medium
Confidence
87% confidence
Finding
The README markets the tool as 'fully local' while simultaneously directing installation from a public package registry, which introduces a software supply-chain trust boundary not reflected in the privacy claim. For a skill handling decrypted private WeChat data, this mismatch can mislead users and agents into underestimating the risk of fetching and executing third-party code.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The agent-facing instructions tell the AI to perform global package installation and environment setup, which exceeds the narrow business purpose of reading local WeChat data and generating summaries. Broad host-level provisioning expands the attack surface and creates an avenue for unintended system modification by an over-permissioned agent.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The workflow instructs users to re-sign the WeChat application and grant process-inspection capability to bypass macOS protections. This is a significant host security modification that weakens application integrity boundaries in order to extract secrets from process memory, which is far more invasive than a simple reader/summarizer skill suggests.

Description-Behavior Mismatch

Medium
Confidence
84% confidence
Finding
The skill metadata frames the capability as local reading, masking, and daily brief generation, but the README exposes broad search, export, favorites, contacts, and raw history access far beyond that stated scope. This scope expansion increases the chance that an agent or user will use the skill for generalized surveillance or bulk extraction of private communications.

Intent-Code Divergence

High
Confidence
96% confidence
Finding
The README claims the tool is read-only and does not interfere with WeChat, yet elsewhere it documents automatically re-signing the WeChat app to alter effective privileges. That contradiction is security-relevant because it can cause users to consent under false assumptions about the degree of host and application modification involved.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
On Linux, when the tool is run with sudo, it uses SUDO_USER to derive and search another account's home directory for WeChat data. That expands access beyond the current effective user's own data and conflicts with the skill's stated scope of only processing the locally logged-in user's WeChat database. In practice, a privileged invocation could silently target another user's chat database path, increasing the risk of unintended privacy access and data handling.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The code explicitly resolves and returns local filesystem paths for media and files associated with chat messages, including fuzzy filename matching inside WeChat storage directories. Exposing absolute local paths increases the sensitivity of the output by leaking host filesystem structure and making it easier for downstream integrations such as email, bots, or arbitrary HTTP endpoints to disclose local file locations beyond the minimum needed for summarization.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
This code formats and returns raw chat message content directly from the decrypted database, but there is no desensitization step here despite the skill claiming automatic masking of phone numbers, IDs, bank cards, and email addresses. If these functions feed summaries, searches, or outbound notifications, sensitive personal and business information can be exposed unchanged to logs, UIs, email, enterprise chat bots, or arbitrary HTTP receivers.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The macOS path can modify the installed WeChat application by force re-signing it, which exceeds the skill's stated purpose of local reading/summarization. Altering a third-party app's signature changes host security properties and can persistently weaken protections on the user's system beyond the current run.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The code explicitly adds `com.apple.security.get-task-allow` to WeChat's entitlements, granting a debugging capability that facilitates process-memory inspection. That is far beyond a normal 'read my local messages' workflow and materially lowers protections around another application's runtime secrets.

Intent-Code Divergence

Medium
Confidence
84% confidence
Finding
The comments and user-facing messaging downplay the action as merely preserving permissions with one added flag, but the code forcefully re-signs the app bundle. That framing can mislead users about the real security consequences of modifying an installed application's signature and trust state.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This code extracts WeChat database encryption keys by opening another process and scanning its memory, then persists recovered keys via `save_results`. That is highly sensitive credential-recovery behavior which materially exceeds simple local database reading and redacted summarization; if misused, it enables decryption of private message databases and creates durable key material on disk.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The file enumerates WeChat processes, opens them with memory-read/query privileges, and inspects runtime memory regions and objects to locate encryption material. In the context of a skill advertised as a local summarizer/redactor, this is an intrusive capability expansion that can bypass normal access boundaries around encrypted data and substantially increases abuse potential.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The push workflow encourages sending summaries to email, enterprise webhooks, and arbitrary HTTP endpoints but does not prominently warn that even redacted summaries are derived from private chat content and may still contain sensitive business or personal information. In this context, the danger is elevated because the skill processes decrypted local WeChat records and users may rely on the earlier 'zero upload' framing while exporting data to third-party systems.

Missing User Warnings

Medium
Confidence
78% confidence
Finding
The AI-integration section encourages agents to install and use a tool that accesses highly sensitive local chat histories without an upfront privacy warning or consent checkpoint. In the context of decrypted personal communications, omission of such notice raises the risk of uninformed collection, summarization, or onward sharing through downstream automations.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
This command reads and outputs WeChat favorites content, sender identifiers, and source chat metadata directly from the local decrypted database without any inline warning, confirmation, or sensitivity guard at the point of access. In the context of a tool explicitly designed to extract local WeChat data, this increases the chance of accidental disclosure through terminal history, logs, screenshots, or downstream automation even if no network exfiltration occurs in this file.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
This command outputs full chat contents plus identifiers such as chat display name, username, group status, timestamps, and optional media paths, and only applies masking when the caller explicitly enables --mask. Because the skill is specifically designed to extract and summarize local WeChat data, accidental invocation, automation misuse, or downstream logging can expose highly sensitive personal or business communications without any default warning or privacy-safe default.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The initialization flow extracts WeChat database keys and persists them to KEYS_FILE on disk, but this code provides no explicit warning, consent step, or visible protection controls around the sensitivity of that material. Because these keys can enable decryption of local chat databases, accidental exposure through weak file permissions, backups, or multi-user systems could compromise highly sensitive message content.

Missing User Warnings

Low
Confidence
86% confidence
Finding
The command persistently writes per-chat last-seen timestamps to a predictable file on disk without runtime disclosure or consent at the point of execution. Although it does not store full message bodies, this metadata reveals communication activity patterns and creates privacy-sensitive local residue, which is notable in a tool handling decrypted WeChat data and advertising strong privacy guarantees.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The command returns raw message contents by default in both JSON and text output, while masking is only applied when the user explicitly passes --mask. In a tool designed to read local WeChat history and forward summaries/results to external sinks, this increases the chance of accidental disclosure of sensitive chat content, especially when output is redirected, logged, or consumed by automation.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The command retrieves unread chat metadata and message summaries from the local WeChat database and prints them directly in JSON or text output without an explicit privacy warning, confirmation step, or output-destination safeguards. In a skill specifically designed to summarize and forward chat content, this increases the chance of accidental disclosure through terminal logs, shell history capture, redirected output, automation pipelines, or unintended downstream consumers.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This code persists decrypted WeChat database key material to disk in a JSON file, which creates a durable secret that can be recovered by other local users, backup systems, endpoint agents, or later compromise of the host. Although the code attempts to restrict permissions with chmod(0o600), that protection is best-effort, is not portable or reliable on all platforms, and the code path itself does not enforce an explicit user acknowledgement before writing highly sensitive keys.

Static analysis

No suspicious patterns detected.