Back to skill

Security audit

Wjs Uploading Video

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent YouTube uploader, but it needs Review because it handles long-lived OAuth credentials and may expose proxy credentials in logs without strong safeguards.

Install only if you are comfortable granting a local script OAuth authority to upload videos to your YouTube account. Store credentials and token files with restrictive permissions, avoid proxy URLs with embedded passwords or ensure logs are private, prefer dry-run before batch uploads, and verify privacy and playlist flags before running live uploads.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/upload_youtube.py:321
Finding

Proxy Credentials Exposed Through Diagnostic Logging

Content
View full analysis
Remediation
View remediation
str: parsed = urlsplit(value) host = parsed.hostname or "" port = f":{parsed.port}" if parsed.port else "" return f"{parsed.scheme}://{host}{port}" if proxies: print(f"[proxy] enabled: {redacted_proxy(proxies['https'])}", file=sys.stderr) ``` - Add an automated test using a value such as `https://user:secret@example.test:8443` and assert that neither `user` nor `secret` appears in output. - Review existing execution logs and rotate proxy credentials if credential-bearing proxy URLs may already have been recorded. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/upload_youtube.py:84
Finding

OAuth Refresh Token Stored Without Enforced Restrictive Permissions

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:24
Finding

Unpinned Third-Party Dependency Installation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/credentials-setup.md (reported line 3)May include surrounding context.

md
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/credentials-setup.md (reported line 31)May include surrounding context.

md
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/credentials-setup.md (reported line 35)May include surrounding context.

md
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/upload_youtube.py (reported line 37)May include surrounding context.

python
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/upload_youtube.py (reported line 75)May include surrounding context.

python
# Google Cloud OAuth setup for YouTube upload

One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill describes capabilities that read local files, use OAuth tokens, write result files, and perform network uploads, but it declares no explicit tool scope or permission boundaries. That increases the chance an agent invokes it without clear user consent or least-privilege controls, especially because it can transmit local video content and metadata off-device.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill is built to upload videos and metadata to YouTube, but its description does not clearly warn that local media, titles, descriptions, tags, playlist IDs, and OAuth-authenticated account actions will be sent to Google servers. This can mislead users about privacy and data egress, causing unintentional disclosure of unpublished content or sensitive metadata.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The document instructs users to place OAuth client credentials and the resulting token in predictable local paths but does not warn that these files are sensitive secrets that grant API access. In a skill specifically designed to automate YouTube uploads, those files can enable unauthorized uploads or account misuse if exposed through weak filesystem permissions, backups, or accidental sharing.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/credentials-setup.md (reported line 5)May include surrounding context.

md
One-time, ~5 minutes. Result: a `credentials.json` file you save to `~/.config/youtube/credentials.json`.

## 1. Create a project

1. https://console.cloud.google.com → top-bar project picker → **New Project**
2. Name it anything (e.g., `youtube-upload`) and create

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · scripts/upload_youtube.py (reported line 184)May include surrounding context.

python
"Content-Type": "application/json; charset=UTF-8",
        "X-Upload-Content-Type": mimetype,
    }
    r = requests.post(UPLOAD_INIT_URL, headers=headers, json=body,
                      proxies=proxies, timeout=60)
    if r.status_code != 200:
        raise RuntimeError(f"init session failed: {r.status_code} {r.text[:500]}")

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script supports adding uploaded videos to an arbitrary YouTube playlist via --playlist, but this capability is not disclosed in the skill metadata. Hidden or under-declared side effects are dangerous in agent skills because a caller may authorize uploads without realizing the tool can also mutate other account resources using the same OAuth token.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

This request modifies playlist state on YouTube, which is an external action beyond the manifest's stated upload functionality. In an agent setting, undisclosed external mutations are risky because they can alter account content organization without informed user consent.

Content

Scanner excerpt · scripts/upload_youtube.py (reported line 269)May include surrounding context.

python
"resourceId": {"kind": "youtube#video", "videoId": video_id},
        }
    }
    r = requests.post(
        url,
        headers={
            "Authorization": f"Bearer {token}",

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes metadata as coming from a sibling UPLOAD_META.md file for the videos, which implies a file adjacent to the directory of MP4s. In code, when uploading a directory, the default metadata path is d / "UPLOAD_META.md", meaning the file is expected inside the target directory rather than alongside it.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.