T09 · Insecure Skill Coding Practices
- Location
scripts/influencer_report.py:328- Finding
Unscoped Video Library Queries Can Analyze Unrelated Creator Content
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its influencer-report purpose, but profile mode can pull and analyze unrelated videos from the whole Memories.ai account library without clear scoping.
Install only if you are comfortable sending creator profile/video URLs and derived transcript or metadata content to Memories.ai. Prefer direct video URLs or a dedicated Memories.ai library/account for one creator at a time, and verify that every video in the generated report belongs to the intended influencer before using it for business decisions.
scripts/influencer_report.py:328Unscoped Video Library Queries Can Analyze Unrelated Creator Content
The skill advertises and documents capabilities that require environment access, network calls, and likely file output, but it does not declare any tool scope or permissions boundaries. This is dangerous because an agent may invoke the skill with broader-than-expected privileges, making external API calls and handling secrets without clear user-visible constraints or policy enforcement.
The description is broad enough to match common requests such as 'analyze' or 'review an influencer,' which can cause the skill to trigger in situations the user did not specifically intend. Over-broad triggering is risky because it may cause unsolicited scraping and transmission of profile or video URLs to third-party services, increasing privacy and consent issues.
The workflow and endpoint documentation show that profile URLs and video URLs are sent to external Memories.ai scraping and analysis APIs, but the skill description does not clearly warn users about this data transfer. This is dangerous because users may provide third-party profile links or creator content without informed consent, leading to privacy, compliance, and trust issues.
The report directly embeds slices of AI-generated audio and visual transcript content into the final markdown without any sanitization, minimization, or user-facing warning that the source material may contain sensitive, defamatory, copyrighted, or personal information. In this skill’s context—producing influencer vetting reports for downstream business decisions—that increases the chance of unintentionally redisclosing sensitive content or presenting unsafe/generated claims as report-ready evidence.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Config
# ---------------------------------------------------------------------------
V1_BASE = "https://api.memories.ai/serve/api/v1"
V2_BASE = "https://mavi-backend.memories.ai/serve/api/v2"
PLATFORM_MAI_ENDPOINTS = {
The skill sends user-supplied profile and video URLs to third-party Memories.ai services for scraping, transcript generation, and metadata retrieval, but it does not provide an explicit disclosure or confirmation step before transmitting that data. In an agent-skill context, users may not realize their inputs are leaving the local environment, which creates a privacy and consent risk, especially if the URLs identify private, sensitive, or internal content.
This request transmits the supplied profile URL to an external scraping API, which is a real data egress event. In this skill, external transmission is core functionality, but it remains security-relevant because users may unknowingly disclose browsing targets, creator identities, or other sensitive investigation inputs to a third party.
print(f"[V1] Scraping profile: {profile_url} (count={count})...")
try:
resp = requests.post(url, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
data = resp.json()
if data.get("code") == "0000":
This call retrieves the full video library from Memories.ai, which is another external network interaction involving potentially sensitive account-linked data. While expected for the feature, it increases exposure because the skill may enumerate and process more content than the user intended for a single report.
print("[V1] Listing videos in library...")
try:
resp = requests.post(url, headers=headers, json={}, timeout=30)
resp.raise_for_status()
data = resp.json()
videos = data.get("data", [])
This search request sends a query to the external Memories.ai service and may cause external processing over library contents. Although the query string here is static, the operation still reveals user activity and relies on a third-party service to inspect or rank remotely stored content.
print(f"[V1] Searching: '{query}'...")
try:
resp = requests.post(url, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
data = resp.json()
results = data.get("data", [])
This request sends each video URL to a third-party transcript/analysis endpoint, which can expose the exact content under investigation and trigger remote AI processing. In a vetting workflow, those URLs and resulting transcripts may be sensitive from a privacy, legal, or confidentiality perspective, especially if the operator assumes analysis is local.
print(f"[V2] Submitting MAI transcript: {video_url[:80]}...")
try:
resp = requests.post(url, headers=headers, json={"video_url": video_url}, timeout=30)
resp.raise_for_status()
data = resp.json()
if data.get("code") == "0000":
This metadata request sends the video URL and channel information to an external endpoint, again creating a data disclosure path to a third party. The risk is moderate because metadata collection appears intentional, but users may not expect multiple separate transmissions per video beyond a single analysis request.
print(f"[V2] Fetching metadata: {video_url[:80]}...")
try:
resp = requests.post(url, headers=headers,
json={"video_url": video_url, "channel": "rapid"}, timeout=30)
resp.raise_for_status()
data = resp.json()
The script writes the generated report to the path provided by --output, but does not warn about creating or overwriting a local file. There is no confirmation prompt, pre-write notice about overwrite behavior, or safety comment explaining the file write side effect.
No suspicious patterns detected.