T03 · Remote Payload Retrieval and Execution
- Location
tools/postiz-setup.md:32- Finding
Unverified Remote Script Is Downloaded and Executed Directly
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a legitimate social-media scheduling purpose, but it can unexpectedly publish live posts and uses risky credential and setup patterns.
Install only if you are comfortable giving the agent credentials that can access and post through your social accounts. Use test accounts or least-privilege keys, store secrets carefully, always pass --draft unless you truly want live publishing, avoid remote HTTP Postiz URLs, and do not run the Docker curl-to-sh setup command without independently reviewing Docker's official installation guidance.
tools/postiz-setup.md:32Unverified Remote Script Is Downloaded and Executed Directly
scripts/post-scheduler.js:75Postiz API Credentials May Be Transmitted over Plaintext HTTP
scripts/post-scheduler.js:342Documented Draft-by-Default Protection Conflicts with Immediate Publication Behavior
scripts/post-scheduler.js:40Scheduler Loads Unrelated Secrets from the Agent-Wide OpenClaw Environment File
The skill explicitly declares filesystem access to read a local .env file for credentials, creating a path for credential exposure if the skill or its supporting scripts are compromised, overly permissive, or prompted to reveal configuration data. Combining local secret access with network permissions materially increases risk because stolen API keys could be exfiltrated or abused to control connected social accounts.
- POSTIZ_BASE_URL # Required if using Postiz (your instance URL)
permissions:
- network: Calls Buffer GraphQL API or Postiz API to schedule and retrieve posts
- filesystem: Reads .env for credentials, writes scheduled post logs to working directory
source:
url: https://github.com/Batsirai/carson-skills
author: Carson Jarvis (@CarsonJarvisAI)
The security note normalizes loading API keys from a local .env file, reinforcing a design where the skill can access plaintext credentials from disk. Even though the file says no credentials are embedded and drafts require approval, local secret access remains dangerous because any prompt injection, script bug, or logging mistake could disclose or misuse the keys.
github: https://github.com/Batsirai/carson-skills
verified: true
security:
note: API keys are loaded from environment variables or a local .env file. No credentials are embedded in the skill or scripts. All posts are created as DRAFTS by default — human approval required before publishing.
---
# Social Media Agent
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Referenced artifact was not completely inspected
node scripts/post-scheduler.js --status
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
function info(msg){ log('ℹ️ ' + msg); }
function getEnv() {
// Try loading .env from project root or parent directories
const envPaths = [
path.join(__dirname, '..', '.env'),
path.join(process.cwd(), '.env'),
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
function info(msg){ log('ℹ️ ' + msg); }
function getEnv() {
// Try loading .env from project root or parent directories
const envPaths = [
path.join(__dirname, '..', '.env'),
path.join(process.cwd(), '.env'),
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
function getEnv() {
// Try loading .env from project root or parent directories
const envPaths = [
path.join(__dirname, '..', '.env'),
path.join(process.cwd(), '.env'),
path.join(process.env.HOME || '', '.openclaw', '.env'),
];
The script implicitly loads credentials and endpoint configuration from ~/.openclaw/.env, then uses those secrets to make authenticated network requests. In a skill/execution context, hidden cross-project credential discovery increases the blast radius because running this script can silently reuse unrelated user secrets and act on external accounts without explicit consent for this invocation.
// Try loading .env from project root or parent directories
const envPaths = [
path.join(__dirname, '..', '.env'),
path.join(process.cwd(), '.env'),
path.join(process.env.HOME || '', '.openclaw', '.env'),
];
for (const p of envPaths) {
The loop accepts the first discovered .env file from several locations and trusts its contents, including POSTIZ_BASE_URL. In a hostile or untrusted workspace, an attacker-controlled .env can redirect authenticated requests to an arbitrary HTTP/HTTPS server, causing API keys to be sent in Authorization headers to attacker infrastructure.
const envPaths = [
path.join(__dirname, '..', '.env'),
path.join(process.cwd(), '.env'),
path.join(process.env.HOME || '', '.openclaw', '.env'),
];
for (const p of envPaths) {
if (fs.existsSync(p)) {
The | sh chaining pattern removes any opportunity for inspection between download and execution, making compromise of the fetched script immediately exploitable. In a setup guide for server deployment, this is especially dangerous because users may run it as root on internet-exposed infrastructure.
If not installed:
# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd postiz-app
cp .env.example .env
Edit `.env` with your values:
Documenting a parameterized DELETE operation without guardrails can enable misuse in agentic or scripted contexts, especially when an ID is selected dynamically. The danger is accidental or unauthorized deletion of content if the parameter source is wrong, stale, or attacker-influenced.
DELETE /posts/:id
The README encourages users to configure live social-media publishing credentials and use a script that can schedule or draft posts, but it does not prominently warn that this grants an agent the ability to publish to real accounts or expose account-linked data and analytics. In an agent-skill context, this is dangerous because users may treat the setup as low risk and enable unattended actions against public brand accounts without approval gates, dry-run defaults, or credential-scope guidance.
The trigger includes generic phrases like "what should I post this week" and "wants a calendar," which could match ordinary brainstorming requests rather than explicit invocation of this scheduling/planning skill. The file does not provide exclusion conditions or narrower activation constraints to distinguish when the skill should activate versus when the user is just asking for advice.
The phrase "write a post about X" is common everyday language and can easily overlap with unrelated writing assistance requests. Because no negative examples or contextual boundaries are provided, the activation condition is ambiguous and may cause unintended invocation.
The instructions tell users to export or store a Buffer API key but do not state that it is a sensitive secret that must not be committed, logged, or shared. This omission can lead to credential exposure, allowing unauthorized posting, channel enumeration, or account abuse through the connected Buffer workspace.
The guide includes a 'post immediately' example that can cause an agent or user to publish live content to connected public social accounts without any explicit warning or confirmation step. In the context of an agent skill, this increases the risk of unintended public posting, reputational harm, or abuse if the command is invoked with unreviewed content.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
```bash
curl -s -X POST 'https://api.buffer.com' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-d '{"query": "{ account { organizations { id channels { id name service } } } }"}'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
| shareNext | Post next in queue |
| customScheduled | Schedule for specific time (requires dueAt) |
Full curl example:
curl -s -X POST 'https://api.buffer.com' \
-H 'Content-Type: application/json' \
The guide tells users to 'check the database for the verification link' if SMTP is not configured, which normalizes direct database inspection of authentication data without any safety guidance. That can expose sensitive tokens, user records, or lead operators to use over-privileged access paths outside normal app workflows.
No suspicious patterns detected.