T09 · Insecure Skill Coding Practices
- Location
scripts/extract-frames.sh:19- Finding
Python Code Injection Through Shell-Interpolated Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly coherent for making Instagram content, but it handles sensitive media and logged-in Instagram automation with unsafe helper scripts that need review before use.
Review before installing. Use only with trusted local media, trusted content-plan JSON, and a non-sensitive working directory. Do not run posting commands with --post unless you have inspected the preview and caption, and avoid exposing the OpenClaw CDP browser port to untrusted users. Be aware that transcription uploads audio to OpenAI and preview screenshots are written under /tmp.
scripts/extract-frames.sh:19Python Code Injection Through Shell-Interpolated Arguments
scripts/transcribe.sh:68Python Code Injection Through Transcription Paths and API Data
scripts/extract-frames.sh:27Arbitrary File Writes Through Unvalidated Frame Identifiers
scripts/extract-reel.sh:9Shell Arithmetic Injection Through Reel Timestamp Arguments
scripts/generate-carousel.js:68Carousel Identifier Path Traversal
scripts/capture-instagram-preview.js:38Instagram-Origin Validation Bypass for CDP Target Selection
scripts/post-to-instagram.js:789Instagram Publishing Proceeds When Preview Capture Fails
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
The skill advertises handling YouTube/webpage URLs and generating multiple Instagram asset types, but the detected behavior for this portion appears limited and does not support those claims. Security-wise, this is risky because users may authorize broader access or supply sensitive sources expecting deterministic processing, while the actual code path may behave differently or fail into ad hoc manual/browser-assisted flows that are less controlled.
Referenced artifact was not completely inspected
Script: `scripts/generate-carousel.js`
Referenced artifact was not completely inspected
Script: `scripts/post-to-instagram.js`
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
ffmpeg -y -i "$AUDIO_FILE" -ss "$START" -t "$CHUNK_DURATION" -acodec libmp3lame -ar 16000 -ac 1 -b:a 64k "$CHUNK_FILE" 2>/dev/null
# Transcribe chunk
RESPONSE=$(curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@$CHUNK_FILE" \
-F model="whisper-1" \
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
else
echo "==> Audio file is ${FILESIZE} bytes, transcribing in one shot..."
RESPONSE=$(curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@$AUDIO_FILE" \
-F model="whisper-1" \
The README explicitly describes Instagram draft automation using a logged-in browser session, which means the skill can perform authenticated actions on the user's account. Failing to clearly warn that the automation may post, upload, or otherwise affect the account reduces informed consent and can lead users to run account-impacting actions they did not fully expect.
The skill describes shell execution and file-writing behavior but does not declare any explicit tool scope or allowed-tools boundary. That makes the effective execution surface broader and less auditable, increasing the risk of unintended command execution, filesystem modification, and abuse if the skill is invoked with untrusted inputs or implemented differently than documented.
The script captures screenshots of the Instagram composer and stores them in /tmp, which may include captions, media previews, account details, and other sensitive user content. In a multi-process or shared environment, these artifacts can persist longer than expected and be accessible to other users, logs, backup systems, or later forensic collection, creating unnecessary data exposure.
When the script is run with --post, it performs the final Instagram share action immediately through browser automation, with no in-script confirmation, dry-run guard, or explicit acknowledgement step. In this skill's context, that is more dangerous because the tool is specifically designed to transform and publish social media content, so a mistaken flag, mis-targeted browser tab, or prompt injection in upstream workflow could cause unintended public posting from a real account.
This is a true external-transmission finding because the code sends audio chunks to api.openai.com. In the context of a media-processing skill, this behavior is expected functionally, but it still has security significance because it exports potentially sensitive content off-host to a third party.
ffmpeg -y -i "$AUDIO_FILE" -ss "$START" -t "$CHUNK_DURATION" -acodec libmp3lame -ar 16000 -ac 1 -b:a 64k "$CHUNK_FILE" 2>/dev/null
# Transcribe chunk
RESPONSE=$(curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@$CHUNK_FILE" \
-F model="whisper-1" \
The script uploads user-provided audio content to OpenAI's external transcription API without any explicit notice, consent check, or privacy gating in the script itself. Because podcast/video episodes may contain sensitive, copyrighted, or private speech, silent remote transmission creates a real data-exposure risk even if the destination service is legitimate.
The one-shot transcription branch also performs external transmission of user audio to OpenAI. While not inherently malicious, this is a real privacy and compliance concern because the transfer is automatic and may surprise users who expect local processing.
else
echo "==> Audio file is ${FILESIZE} bytes, transcribing in one shot..."
RESPONSE=$(curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@$AUDIO_FILE" \
-F model="whisper-1" \
In the single-shot path, the script sends the entire extracted audio file to a remote API without any explicit warning or consent mechanism. This is materially the same privacy/security issue as the chunked path: user content is externally transmitted, which is risky in a skill intended to process full podcast/video episodes that may contain sensitive material.
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.
],
"license": "MIT",
"dependencies": {
"canvas": "^3.2.3"
}
}
The script reads and uses the OPENAI_API_KEY environment variable to authenticate outbound API requests. While the header comment lists the variable as required, it does not provide a clear user-facing warning that a credential will be used for external transmission to a third-party service.