Back to skill

Security audit

Douyin Scraper API - Videos, Creators, Comments, Search

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Scavio API guide for retrieving Douyin data, with privacy and cost considerations but no hidden execution, persistence, or destructive behavior.

Install only if you are comfortable sending Douyin links, profile identifiers, search terms, and retrieved public social-media data to Scavio under your API key. Avoid sensitive research terms or non-public personal data, monitor credit usage, and summarize personal comments or profiles rather than building dossiers on individuals.

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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (8)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly sends Douyin URLs, user identifiers, keywords, and retrieved social-media content to the third-party service at api.scavio.dev, but it does not present a clear user-facing warning or consent cue before doing so. This creates a real privacy and data-handling risk because users may provide profile URLs, creator identifiers, comments, or search terms without understanding they are being transmitted off-platform to an external API provider.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example transmits a user-supplied Douyin share URL to a third-party API, which may expose browsing targets and associated metadata to the external service. In this skill's context, that is expected functionality, but it is still a genuine data egress issue if users are not informed or if sensitive URLs are submitted.

Content

Scanner excerpt · SKILL.md (reported line 143)May include surrounding context.

md
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1. Resolve a share link, then read that video's comments (1 credit each)
video = requests.post(f"{BASE}/api/v1/douyin/video/by-share-url", headers=HEADERS,
    json={"share_url": "https://v.douyin.com/v1zNJi__Teg/"}).json()
aweme_id = video["data"]["aweme_id"]
comments = requests.post(f"{BASE}/api/v1/douyin/video/comments", headers=HEADERS,

External Transmission

Medium
Category
Data Exfiltration
Confidence
87% confidence
Finding

This request sends a resolved video identifier to the external API to retrieve comments, causing third-party processing of content associated with real users. Comments can contain personal data or sensitive speech, so transmitting and handling them without an explicit warning increases privacy and compliance risk.

Content

Scanner excerpt · SKILL.md (reported line 146)May include surrounding context.

md
video = requests.post(f"{BASE}/api/v1/douyin/video/by-share-url", headers=HEADERS,
    json={"share_url": "https://v.douyin.com/v1zNJi__Teg/"}).json()
aweme_id = video["data"]["aweme_id"]
comments = requests.post(f"{BASE}/api/v1/douyin/video/comments", headers=HEADERS,
    json={"aweme_id": aweme_id, "count": 50}).json()

# 2. Resolve a profile URL to a user id, then read the user's posts (1 credit each)

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This example sends a Douyin profile URL to a third-party service to resolve a sec_user_id, disclosing which account the user is investigating. That is not inherently malicious, but it is still external transmission of potentially sensitive interest and identity-linked data without prominent disclosure.

Content

Scanner excerpt · SKILL.md (reported line 150)May include surrounding context.

md
json={"aweme_id": aweme_id, "count": 50}).json()

# 2. Resolve a profile URL to a user id, then read the user's posts (1 credit each)
uid = requests.post(f"{BASE}/api/v1/douyin/resolve/user-id", headers=HEADERS,
    json={"url": "https://www.douyin.com/user/"}).json()["data"]["sec_user_id"]
posts = requests.post(f"{BASE}/api/v1/douyin/user/posts", headers=HEADERS,
    json={"sec_user_id": uid, "count": 20}).json()

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

Sending a sec_user_id to fetch a user's posts shares a persistent account identifier with the third-party API and results in retrieval of personal/social-media data about a real individual. In a social-profile scraping context, this increases privacy sensitivity and warrants stronger disclosure and usage limits.

Content

Scanner excerpt · SKILL.md (reported line 152)May include surrounding context.

md
# 2. Resolve a profile URL to a user id, then read the user's posts (1 credit each)
uid = requests.post(f"{BASE}/api/v1/douyin/resolve/user-id", headers=HEADERS,
    json={"url": "https://www.douyin.com/user/"}).json()["data"]["sec_user_id"]
posts = requests.post(f"{BASE}/api/v1/douyin/user/posts", headers=HEADERS,
    json={"sec_user_id": uid, "count": 20}).json()

# 3. Keyword search - 10 credits

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

Keyword search requests transmit user queries to the external provider, potentially exposing sensitive research topics, business interests, or personal intent. Because search can be broad and repeated, the privacy impact may be larger than a single lookup, especially if users are not warned that queries leave the local system.

Content

Scanner excerpt · SKILL.md (reported line 156)May include surrounding context.

json={"sec_user_id": uid, "count": 20}).json()

3. Keyword search - 10 credits

found = requests.post(f"{BASE}/api/v1/douyin/search/videos", headers=HEADERS, json={"keyword": "美食"}).json()

text

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 163)May include surrounding context.

curl:

bash
curl -s https://api.scavio.dev/api/v1/douyin/trending \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 163)May include surrounding context.

curl:

bash
curl -s https://api.scavio.dev/api/v1/douyin/trending \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:39