Back to skill

Security audit

WeChat Contact List Video Extraction & CRM Analyzer

Security checks for vulnerabilities and agentic risk

Overview

The skill largely does what it advertises, but it bulk-extracts WeChat contacts into persistent CRM files and the generated dashboard can expose that data through remote code and injection flaws.

Review carefully before installing. Use only with contacts you are authorized to process, keep outputs in restricted storage, avoid shared or cloud-synced folders, and treat the raw text, CSV, JSON, and HTML files as sensitive personal data. The dashboard should be fixed to remove remote scripts/fonts and to safely render contact values before opening or sharing it.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/structure_contacts.py:217
Finding

Stored HTML and JavaScript Injection in the Generated CRM Dashboard

Content
View full analysis
const contacts = {json.dumps(data, ensure_ascii=False)}; function renderTable(list) {{ const tbody = document.getElementById('contactTableBody'); tbody.innerHTML = list.map(c => ` ${{c.name || '-'}} ${{c.role_title ? '' + c.role_title + '' : ''}} ${{c.org_school ? '' + c.org_school + '' : ''}} ${{!c.role_title && !c.org_school ? '-' : ''}} ${{c.industry || '-'}} ${{c.venue_event ? '📍 ' + c.venue_event : '-'}} ${{c.city || '-'}} ${{c.time_met || '-'}} ${{c.raw}} `).join(''); }} ``` ### Technical Analysis The input records originate from an arbitrary text file and can also be derived from OCR of contact remarks. These values are therefore untrusted. Fields including `raw`, `name`, `role_title`, `org_school`, `industry`, `venue_event`, `city ...[truncated 2328 chars]
Remediation
View remediation
SAFE_SERIALIZED_JSON ``` The serializer should escape at least `<`, `>`, `&`, U+2028, and U+2029. The client should parse the element's text content with `JSON.parse()`. 5. Add a restrictive Content Security Policy that disallows inline scripts and unauthorized outbound connections. CSP should be defense in depth rather than the primary injection fix. 6. Add regression tests covering values containing: ```text "'> ``` The tests should verify that these values appear only as literal text and never create executable DOM elements. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
scripts/structure_contacts.py:149
Finding

Generated Dashboard Loads Mutable Remote Code While Processing Sensitive Contact Data

Content
View full analysis
``` ### Technical Analysis Every generated CRM dashboard loads JavaScript from `https://cdn.tailwindcss.com`. The URL is not pinned to an immutable artifact and does not use Subresource Integrity. Consequently, the effective JavaScript executed by the dashboard can change after the project has been audited. The remote script runs in the same document context as the complete contact dataset: ```javascript const contacts = /* complete structured contact data */; ``` Code returned by the CDN can therefore access the DOM and the `contacts` variable. A compromised CDN, DNS or network path, or an unsafe upstream change could expose the CRM data. The dashboard also requests a stylesheet from Google Fonts. Although this is not executable JavaScript, it creates an external network request and reveals metadata such as the user's IP address, request time, browser information, and referrer behavior. These external resources conflict with the project's documented claim that processing is “100% local offline.” The video and parsing pipeline is local, but opening the generated dashboard while online initiates third-party requests. ### Attack Path 1. The victim processes a contact list and generates the HTML CRM dashboard. 2. The generated file embeds the complete structured contact dataset. 3. The victim opens the dashboard while connected to the network. 4. The browser requests `https://cdn.tailwindcss.com` and executes the returned JavaScript in the dashboard's origin and document context. 5. If the remote resource or its delivery path is compromised, the returned script rea ...[truncated 847 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (20)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied code does perform part of the declared workflow: processing a WeChat screen-recording video, extracting frames via ffmpeg, and using Apple Vision OCR to identify contact text. However, its actual scope is much narrower than the declared description. It only produces a deduplicated raw contacts text list and some console statistics. There is no implementation of the advertised structured CRM pipeline, no rule-based extraction of multiple semantic fields such as title, organization, venue, city, or time, and no export to Excel/CSV, JSON deliverables, or interactive HTML dashboards. The primary purpose in the code is raw contact list extraction, not the broader structured analytics pipeline described.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied code chunk is a contact-remark structuring and reporting script, not a full extraction pipeline. Its actual purpose is narrower: parse existing text lines into structured CRM data and render outputs. The description materially overstates upstream capabilities such as screen capture, video frame extraction, and OCR, none of which appear in the code. While the code does match the later-stage NLP/rule-based structuring and does produce JSON/CSV/HTML outputs, the primary declared end-to-end extraction workflow is not represented by this chunk. Therefore this is a clear description/behavior mismatch.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill is explicitly designed to extract and structure personal contact information from recorded WeChat contact lists, yet it omits clear privacy, consent, and data-handling warnings. That is dangerous because users may bulk-export sensitive third-party personal data into durable CRM artifacts without understanding legal, ethical, or platform-policy implications.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill’s core purpose is bulk capture and conversion of personal WeChat contacts into a searchable CRM dataset, which materially increases the scale and usability of harvested personal data. In this context, the 'zero-risk' and 'permission-free' framing heightens concern because it normalizes high-volume extraction of third-party personal information while minimizing perceived sensitivity.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This section encourages users to maximize retained metadata in contact remarks, including organization, venue, city, and year, specifically to improve later bulk extraction and profiling. That is dangerous because it promotes richer downstream identification, segmentation, and surveillance of personal contacts beyond ordinary address-book usage.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The operational steps provide a complete procedure to record a messaging app contact list and transform it into structured raw text and CRM-style outputs, making personal-data harvesting easy to reproduce. The context makes this more dangerous because it targets a real consumer communication platform and converts socially collected contacts into persistent, searchable intelligence artifacts.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The instructions direct users to create raw text, CSV, and HTML outputs containing contact information but do not warn that these files become persistent local copies of sensitive data. This increases the chance of secondary exposure through backups, sync services, shared devices, accidental uploads, or weak local access controls.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This manifest/config file contains only Chinese-language city, role, venue, and organization values, which indicates a fixed language/locale assumption in the skill's natural-language content. Under the policy, forcing a specific language without user opt-in is a reportable locale-policy violation unless the regional constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code hard-codes OCR recognition to Simplified Chinese, Traditional Chinese, and US English only. This is a natural-language/locale constraint with no user opt-in, configurability, or documented reason, which can violate language choice policy for a general-purpose skill.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/process_video.py (reported line 28)May include surrounding context.

python
"-q:v", "2",
        os.path.join(output_dir, "frame_%04d.jpg")
    ]
    subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
    
    frames = sorted([os.path.join(output_dir, f) for f in os.listdir(output_dir) if f.startswith("frame_") and f.endswith(".jpg")])
    print(f"✅ 成功提取 {len(frames)} 张画面帧!")

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
85% confidence
Finding

The script automatically compiles and then later executes a local Swift source file if the binary is absent. In an adversarial or tampered skill package, this creates a code-execution path from repository contents to native binary execution without integrity verification, which is especially risky because the skill is designed to process sensitive personal contact data.

Content

Scanner excerpt · scripts/process_video.py (reported line 60)May include surrounding context.

python
if not os.path.exists(ocr_bin) and os.path.exists(swift_src):
        print("🔨 编译高并发 Apple Vision OCR 引擎 (8 线程)...")
        subprocess.run(["swiftc", "-O", "-whole-module-optimization", swift_src, "-o", ocr_bin], check=True)
        
    print(f"\n🔍 正在通过 Apple Vision 引擎进行高精 OCR 与多帧去重分析...")
    t0 = time.time()

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
91% confidence
Finding

This line executes the previously built local OCR binary on extracted frames, again without any integrity or provenance checks. Because the surrounding skill explicitly targets WeChat contact extraction, successful abuse could directly expose or misuse highly sensitive personal data while running arbitrary native code on the user's machine.

Content

Scanner excerpt · scripts/process_video.py (reported line 71)May include surrounding context.

python
for i in range(0, len(frames), chunk_size):
        chunk = frames[i:i+chunk_size]
        proc = subprocess.run([ocr_bin] + chunk, capture_output=True, text=True, check=True)
        for line in proc.stdout.splitlines():
            line = line.strip()
            if not line:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script writes deduplicated WeChat contacts to disk as raw text without any user-facing warning, consent checkpoint, minimization, or protection of the output. In this skill context, the data being processed is inherently personal and potentially regulated, so silent extraction and storage materially increases privacy and compliance risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file claims to be 'Zero PII' while it explicitly parses, preserves, and republishes personal contact remarks, inferred names, organizations, cities, and meeting times into JSON, CSV, and HTML outputs. In the context of a WeChat contact extraction/CRM skill, this misleading claim can cause operators to handle highly sensitive personal data under a false sense of safety, increasing the likelihood of unauthorized collection, storage, and sharing.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documentation contradicts the implementation: the script keeps raw contact remarks and displays names and other extracted identifiers in a browsable dashboard. This is dangerous because the misleading description obscures real data-handling behavior and can facilitate privacy violations or policy noncompliance when users believe the tool is non-sensitive.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The generated HTML dashboard embeds the full raw remarks and extracted contact attributes directly into a local, easily browsable file. Because the dashboard is designed for convenient viewing and searching, it concentrates sensitive personal data into a single artifact that can be casually opened, copied, or shared, amplifying privacy exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script exports structured contact data to JSON, CSV, and HTML without any warning, confirmation step, or privacy guardrails despite handling personal information. In this skill's context—mass extraction of WeChat contacts for CRM use—silent export materially increases the risk of accidental disclosure, oversharing, and downstream misuse of personal data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

Several user-visible status messages are hardcoded in Chinese, which imposes a language choice on users without opt-in. The file does not indicate that the tool is intentionally restricted to a Chinese-speaking audience or provide any alternative locale behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The HTML output is hard-coded with lang="zh-CN", which imposes a specific language/locale setting on all generated dashboards. Under the stated policy, locale constraints should be optional or clearly justified; this file provides neither user opt-in nor documentation explaining why the dashboard must be Chinese-specific.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.