T07 · Tool Hijacking and Spoofing
- Location
scripts/generate.py:29- Finding
Undocumented Execution of an External Usage-Tracking Script
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does the advertised image-generation work, but its script also runs an undisclosed usage tracker with prompt metadata.
Review this skill before installing. It will send selected product/model images and campaign text to ComfyDeploy, which may be fine for remote generation but is not local-only. The bigger issue is the bundled script's automatic usage tracker: if ~/clawd/scripts/track-usage.sh exists, it runs with your environment and receives prompt/result metadata. Install only if you are comfortable with that behavior or can remove/disable the tracker and pin dependencies.
scripts/generate.py:29Undocumented Execution of an External Usage-Tracking Script
scripts/generate.py:2Unpinned Automatically Resolved Third-Party Dependency
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def get_api_key(provided_key: str | None) -> str | None:
"""Get API key from argument or environment."""
if provided_key:
return provided_key
return os.environ.get("COMFY_DEPLOY_API_KEY")
The skill documents capabilities that access environment/configured secrets, local files, shell commands, and external network endpoints, but it does not declare an explicit tool scope or permissions boundary. This creates an authorization ambiguity where an agent may use broader capabilities than a caller expects, increasing the chance of unintended file access, shell execution, or data egress.
The skill instructs the agent to send product images, model images, and descriptive prompts to a third-party API without an explicit privacy warning or consent step. Because those inputs can contain sensitive personal images, proprietary product assets, or confidential campaign plans, silent transmission to an external service is a real data-handling risk.
This duplicate detection of the same API call still points to a real egress path: the skill performs a POST to a third-party service with user-supplied content. The operational context makes this less suspicious than covert exfiltration, but still risky because sensitive campaign prompts and face/product images may be transmitted externally without explicit disclosure.
const response = await fetch("https://api.comfydeploy.com/api/run/deployment/queue", {
method: "POST",
headers: {
"Content-Type": "application/json",
This duplicate detection of the same API call still points to a real egress path: the skill performs a POST to a third-party service with user-supplied content. The operational context makes this less suspicious than covert exfiltration, but still risky because sensitive campaign prompts and face/product images may be transmitted externally without explicit disclosure.
const response = await fetch("https://api.comfydeploy.com/api/run/deployment/queue", {
method: "POST",
headers: {
"Content-Type": "application/json",
This section combines access to a local model catalog path with an upload helper that posts local image files to an external API, but it does not warn that local assets will be read and exfiltrated. In an agent setting, that omission can cause users to unknowingly grant access to local files and transmit personal or licensed image data off-system.
The Python helper opens a local file and uploads it to api.comfydeploy.com, creating a clear external data transmission path. In this skill context the transferred content is image data that may include biometric/personal photos or proprietary assets, so the danger comes from unbounded upload behavior and lack of consent/validation rather than the mere existence of HTTP requests.
p = Path(filepath)
mime = "image/png" if p.suffix == ".png" else "image/jpeg"
with open(p, "rb") as f:
r = requests.post(
"https://api.comfydeploy.com/api/file/upload",
headers={"Authorization": f"Bearer {api_key}"},
files={"file": (p.name, f, mime)},
The script performs secondary behavior unrelated to core image generation by invoking a local tracking script and sending prompt/result metadata without clear disclosure or consent. In a skill context, hidden telemetry expands the data exposure surface and can leak sensitive campaign text, filenames, or workflow outcomes to another system.
The usage tracker sends prompt-derived text and result path metadata to an external tracking mechanism without clear disclosure. Prompts and targets can contain confidential campaign plans or client information, so logging them outside the main workflow creates unnecessary data leakage risk.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
"--type", "image",
"--status", status
]
subprocess.run(cmd, capture_output=True, timeout=10)
except Exception as e:
print(f"Warning: Failed to track usage: {e}", file=sys.stderr)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
DEPLOYMENT_ID = "1e16994d-da67-4f30-9ade-250f964b2abc"
API_BASE = "https://api.comfydeploy.com/api"
# Gemini API key is now embedded in the ComfyDeploy workflow - no need to pass it
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
DEPLOYMENT_ID = "1e16994d-da67-4f30-9ade-250f964b2abc"
API_BASE = "https://api.comfydeploy.com/api"
# Gemini API key is now embedded in the ComfyDeploy workflow - no need to pass it
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
DEPLOYMENT_ID = "1e16994d-da67-4f30-9ade-250f964b2abc"
API_BASE = "https://api.comfydeploy.com/api"
# Gemini API key is now embedded in the ComfyDeploy workflow - no need to pass it
The manifest focuses on generating a single fashion ad image from provided inputs, but the implementation uploads the supplied product/model/logo images to ComfyDeploy and later logs prompt metadata via a tracker. While remote inference is expected, the code's external transmission of all assets and prompt content is a materially broader operational behavior than the terse manifest description communicates.
The script uploads user-provided product, model, and optional logo images to an external service without any user-facing privacy warning or consent mechanism. Because these files may contain proprietary creative assets or personal likeness data, undisclosed transfer to a third party can create confidentiality, compliance, and reputational risk.
The file includes substantial Spanish-only instructional content and troubleshooting text while the rest of the skill is in English, but it does not indicate that Spanish is optional or limited to a region-specific workflow. This can create a language/locale policy issue if the skill implicitly forces a language without user opt-in.
Several operational sections, including troubleshooting and model-selection guidance, are written partly or wholly in Spanish even though the skill otherwise targets a general audience. Without an explicit language choice or region-specific justification, this may violate the language/locale policy.
No suspicious patterns detected.