Back to skill

Security audit

Douyin search to text 抖音搜索转文字

Security checks for vulnerabilities and agentic risk

Overview

The skill implements its advertised video-search and transcription workflow with disclosed API access, user-controlled paid reads, and no hidden local access or persistence.

Use public links and avoid including private information in share text. LinkDigest processes content remotely and shares cached digests by link; review its privacy policy before use. Keep the API key in the environment, choose which videos to read, and use --max-credits to limit spending per video. Server-side retention and deletion claims cannot be verified from the packaged client.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • 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 (4)

Tainted flow: 'req' from os.environ.get (line 102, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/linkdigest.py (reported line 110)May include surrounding context.

python
if data is not None:
        req.add_header("Content-Type", "application/json")
    try:
        with urllib.request.urlopen(req, timeout=timeout, context=_SSL["context"]) as resp:
            status, headers, raw = resp.status, resp.headers, resp.read()
    except urllib.error.HTTPError as err:
        status, headers, raw = err.code, err.headers, err.read()

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The supplied code implements the link-reading stage but not the advertised search-first workflow. Its input is an existing link or share text, not a topic used to discover candidate videos. All requests target the digest API or its job-status endpoint. API-key authentication, polling, and output formatting are consistent supporting details. The code does not log into Douyin, use cookies, or download video locally; server-side processing and pricing cannot be verified from this client.

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, network, shell.

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.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 60)May include surrounding context.

HTTP, if Python isn't available:

bash
curl -sS -X POST https://linkdigest.dev/api/v1/search \
  -H "Authorization: Bearer $LINKDIGEST_API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "AI 编程", "platform": "douyin", "limit": 5}'
# "digest": true reads every result as one batch and adds a one-page comparison (billed per video)

Static analysis

No suspicious patterns detected.