Back to skill

Security audit

Smart Photo Editor

Security checks across malware telemetry and agentic risk

Overview

This is a broad but coherent photo-editing skill; its main privacy risk is that selected images and metadata may be sent to AI or optional R2 services when those features are used.

Install only if you are comfortable with selected photos being processed by external AI services for AI features. If enabling R2 upload, use your own trusted worker URL and scoped token. Strip EXIF metadata before sharing edited images when location, device, or timestamp privacy matters, and avoid using untrusted filenames with command-like prefixes.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (21)

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

Critical
Category
Data Flow
Content
req.add_header("User-Agent", "Mozilla/5.0")

        try:
            with urllib.request.urlopen(req, timeout=120) as resp:
                body = resp.read().decode()
                result = _json.loads(body)
                url = result.get("url", "")
Confidence
93% confidence
Finding
with urllib.request.urlopen(req, timeout=120) as resp:

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill declares no permissions while clearly documenting capabilities that access environment variables, read/write local files, invoke shell tools, and make network requests to external services. This creates a transparency and governance gap: users and the platform may authorize the skill under false assumptions, increasing the risk of unintended data exposure or unsafe execution paths.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The declared purpose is narrower than the documented behavior: the skill also performs scene compositing, portrait retouching, EXIF manipulation, saliency analysis, document warping, compression, and external uploads. Behavior-description mismatch is dangerous because it weakens informed consent and review, especially where sensitive image metadata and third-party transfers are involved.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
Reading environment variables for upload credentials adds access to sensitive secrets that are not obvious from a basic photo-editing description. Combined with network functionality, this increases the blast radius of misuse or compromise because the skill can use bearer tokens to send user data to an external service.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
This helper uploads user-provided images to a Cloudflare Worker/R2 endpoint whenever files exceed a threshold, creating an undisclosed external data-transfer path. For a photo editor that may process personal or sensitive images, hidden network egress materially raises confidentiality and compliance risk.

Missing User Warnings

Medium
Confidence
78% confidence
Finding
The EXIF examples include stripping metadata and copying metadata between images without warning that EXIF can contain sensitive information such as GPS coordinates, device identifiers, timestamps, and other provenance data. In a photo-editing skill, users may reasonably share outputs externally, so silent metadata retention or transfer can cause privacy leaks even though no direct system compromise occurs.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
Stating that Chinese prompts are automatically translated to optimized English without user choice or opt-in creates a data handling and transparency risk, especially if translation involves external services or prompt rewriting that changes user intent. In an image-editing skill, prompts may include sensitive personal or contextual details, so undisclosed transformation or transmission can affect privacy, consent, and result integrity.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The trigger list includes broad everyday phrases, raising the risk that the skill activates unexpectedly on loosely related conversations. Because the skill can read/write files, invoke shell tools, and send images to external AI services, accidental activation can lead to unintended processing or data transfer.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documentation states that large reference images may be uploaded to a Cloudflare Worker/R2 service, but it does not present a strong, clear privacy warning or explicit consent flow. This is dangerous because photos can contain sensitive personal data and EXIF metadata, and automatic third-party upload materially changes the privacy model of a local editing skill.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
User image data may be sent to a remote Cloudflare Worker without a user-facing warning at the point of operation. Even if intended for functionality, undisclosed transmission of potentially sensitive photos undermines privacy expectations and can violate data-handling requirements.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The Seedream integration converts local images into data URIs or uploads them, then hands them to an external AI toolchain, but the operation does not present a clear user-facing disclosure that images may leave the local environment. In this context, silent third-party processing of personal photos is a privacy-relevant vulnerability.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This code automatically preserves and copies EXIF metadata from source images to outputs without warning or sanitization. EXIF can include GPS coordinates, timestamps, device identifiers, and author information, so edited images may unintentionally retain sensitive metadata and leak user location or identity when shared.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The CLI copy command writes EXIF metadata from one image into another with no privacy disclosure or filtering. This can propagate hidden sensitive metadata into redistributed files, causing accidental disclosure of geolocation, capture time, camera serial/device details, or authorship information.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The tool preserves EXIF metadata by default, which can retain sensitive information such as GPS coordinates, device identifiers, timestamps, and other embedded metadata in the edited output. In a photo-editing skill, users may reasonably assume the output is visually transformed without realizing private metadata is still being propagated, increasing the risk of accidental data disclosure when files are shared.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The script preserves EXIF metadata by default, which can retain sensitive information such as GPS coordinates, device identifiers, timestamps, and camera details in the output image. In a photo-editing context, users may expect edited images to be safe to share, so silent metadata retention can cause unintended privacy disclosure when exported files are distributed.

Unvalidated Output Injection

High
Category
Output Handling
Content
venv_rembg = self.venv_python.replace("/bin/python", "/bin/rembg")
        for cmd_candidate in ["rembg", venv_rembg]:
            try:
                subprocess.run([cmd_candidate, "--help"],
                             capture_output=True, timeout=5)
                rembg_cmd = cmd_candidate
                break
Confidence
77% confidence
Finding
subprocess.run([cmd_candidate, "--help"], capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
if rembg_cmd and tool in ("auto", "rembg"):
            try:
                self._log("Using rembg for background removal...")
                result = subprocess.run(
                    [rembg_cmd, "i", image, output],
                    capture_output=True, text=True, timeout=60
                )
Confidence
86% confidence
Finding
subprocess.run( [rembg_cmd, "i", image, output], capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
bg_hex = '#%02x%02x%02x' % bg_color

                    # Make detected background color transparent
                    result = subprocess.run(
                        [im_cmd, image, "-fuzz", "20%", "-transparent", bg_hex, output],
                        capture_output=True, text=True, timeout=30
                    )
Confidence
88% confidence
Finding
subprocess.run( [im_cmd, image, "-fuzz", "20%", "-transparent", bg_hex, output], capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
args.append(output)

                result = subprocess.run(
                    args,
                    capture_output=True, text=True, timeout=30
                )
Confidence
89% confidence
Finding
subprocess.run( args, capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
if im_cmd:
            try:
                result = subprocess.run(
                    [im_cmd, image, "-crop", f"{width}x{height}+{x}+{y}",
                     "+repage", output],
                    capture_output=True, text=True, timeout=30
Confidence
89% confidence
Finding
subprocess.run( [im_cmd, image, "-crop", f"{width}x{height}+{x}+{y}", "+repage", output], capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
args.append(output)

            result = subprocess.run(args, capture_output=True, text=True, timeout=30)

            if result.returncode == 0:
                elapsed = int((time.time() - start) * 1000)
Confidence
89% confidence
Finding
subprocess.run(args, capture_output

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.