Back to skill

Security audit

Social Media Scheduler

Security checks for vulnerabilities and agentic risk

Overview

This social scheduler does what it advertises, but its local dashboard and queue storage can expose or misuse social-media credentials and scheduled posts without enough protection.

Review carefully before installing. Use only low-scope platform credentials, avoid running the dashboard on shared or exposed machines, do not browse untrusted sites while it is running, and rotate any tokens that may have been stored in storage/queue.json. The package should be fixed to redact config from API responses, add authentication, bind only to loopback, restrict CORS, store credential references instead of full secrets, and update vulnerable dependencies.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/dashboard.js:27
Finding

Unauthenticated Dashboard Exposes Stored Social-Media Credentials

Content
View full analysis
scheduledFor) const normalize = posts => posts.map(p => ({ ...p, scheduledFor: p.scheduledTime || p.scheduledFor })); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ pending: normalize(pending).sort((a, b) => new Date(a.scheduledFor) - new Date(b.scheduledFor)), completed: normalize(completed).slice(-20).reverse(), failed: normalize(failed).slice(-10).reverse() })); } catch (err) { res.writeHead(500, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: err.message })); } } ``` ```javascript // Enable CORS for local development res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); ``` ```javascript server.listen(PORT, () => { console.log(`\n🎨 Social Scheduler Dashboard\n`); console.log(` 📡 Server running at: http://localhost:${PORT}`); console.log(` 🌐 Open in browser to manage scheduled posts\n`); console.log(` Press Ctrl+C to stop\n`); }); ``` ### Technical Analysis Queue records contain the complete `config` value used to authenticate to each platform. Depending on the platform, this can include OAuth access tokens, account passwords, API secrets, bot tokens, or Discord webhook URLs. The `normalize` function cop ...[truncated 2130 chars]
Remediation
View remediation
posts.map(({ config, result, ...post }) => ({ ...post, scheduledFor: post.scheduledTime || post.scheduledFor })); ``` 2. Bind the dashboard explicitly to loopback: ```javascript server.listen(PORT, '127.0.0.1', () => { // ... }); ``` 3. Require authentication for every dashboard and API route. Use a randomly generated, securely stored session secret or local access token. 4. Replace wildcard CORS with a strict allowlist. If the frontend is served from the same origin, omit CORS entirely. 5. Add CSRF protection and validate the `Origin` and `Host` headers for state-changing routes. 6. Never return credentials in error objects, post results, analytics, or completed queue records. 7. Rotate all platform credentials that may previously have been exposed through this endpoint. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/dashboard.js:48
Finding

Unauthenticated Dashboard Allows Arbitrary Queue Modification

Content
View full analysis
body += chunk); req.on('end', async () => { try { const { id } = JSON.parse(body); const cancelled = await queue.cancel(id); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: cancelled })); } catch (err) { res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: err.message })); } }); } // API: Add a new scheduled post async function addPost(req, res) { let body = ''; req.on('data', chunk => body += chunk); req.on('end', async () => { try { const { platform, config, content, scheduledFor } = JSON.parse(body); // Validate required fields if (!platform || !config || !content || !scheduledFor) { throw new Error('Missing required fields'); } // Add post to queue (using queue's add method signature) const post = queue.add({ platform, content, config, scheduledTime: new Date(scheduledFor).toISOString() }); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: true, post })); } catch (err) { res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: err.message })); } }); } ``` ```javascript // Enable CORS for local development res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); if (req.method ...[truncated 2720 chars]
Remediation
View remediation
{ size += chunk.length; if (size > MAX_BODY) { req.destroy(); } }); ``` 8. Return only a Boolean cancellation result rather than the canceled queue object, because that object may contain credentials. 9. Add audit logging for authenticated queue additions and cancellations without logging secrets. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/queue.js:47
Finding

Platform Credentials Are Persisted in Plaintext Queue Records

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (160)

Known Vulnerable Dependency: form-data==2.3.3 — 2 advisory(ies): CVE-2025-7783 (form-data uses unsafe random function in form-data for choosing boundary); CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

Critical
Category
Supply Chain
Confidence
97% confidence
Finding

form-data 2.3.3 combines CRLF injection risk with weak randomness for multipart boundary generation. Because it is pulled in under request and likely involved in outbound uploads, attacker-controlled filenames or fields could manipulate multipart structure, and predictable boundaries can weaken request integrity in edge cases.

Content

No source excerpt is available for this finding.

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 · MEDIA-GUIDE.md (reported line 313)May include surrounding context.

text

### "Access token invalid"
Regenerate your access tokens from the platform's developer portal.

## Testing

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · ANNOUNCEMENT.md (reported line 58)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · CHANGELOG.md (reported line 136)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · CONTRIBUTING.md (reported line 278)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · README.md (reported line 33)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · README.md (reported line 35)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · README.md (reported line 426)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · announcements/README.md (reported line 139)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · announcements/REDDIT.md (reported line 201)May include surrounding context.

md
cd skills/social-scheduler
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · ANNOUNCEMENT.md (reported line 59)May include surrounding context.

md
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

# 3. Schedule a post

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · README.md (reported line 34)May include surrounding context.

md
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

# 3. Schedule a post

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · README.md (reported line 425)May include surrounding context.

md
npm install

# 2. Configure (create .env with your API keys)
cp .env.example .env
# Edit .env with your credentials

# 3. Schedule a post

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 · README.md (reported line 88)May include surrounding context.

md
| Platform | Type | Auth | Features |
|----------|------|------|----------|
| **Twitter/X** | Microblog | OAuth 1.0a | Tweets, threads, media |
| **Mastodon** | Microblog | Access Token | Posts, threads, media, any instance |
| **Bluesky** | Microblog | Handle + Password | Posts, threads, media |
| **Reddit** | Community | OAuth2 | Posts, comments |
| **Discord** | Community | Webhook | Rich embeds, mentions |

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/dashboard.js (reported line 107)May include surrounding context.

js
| Platform | Type | Auth | Features |
|----------|------|------|----------|
| **Twitter/X** | Microblog | OAuth 1.0a | Tweets, threads, media |
| **Mastodon** | Microblog | Access Token | Posts, threads, media, any instance |
| **Bluesky** | Microblog | Handle + Password | Posts, threads, media |
| **Reddit** | Community | OAuth2 | Posts, comments |
| **Discord** | Community | Webhook | Rich embeds, mentions |

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/platforms/twitter.js (reported line 189)May include surrounding context.

js
| Platform | Type | Auth | Features |
|----------|------|------|----------|
| **Twitter/X** | Microblog | OAuth 1.0a | Tweets, threads, media |
| **Mastodon** | Microblog | Access Token | Posts, threads, media, any instance |
| **Bluesky** | Microblog | Handle + Password | Posts, threads, media |
| **Reddit** | Community | OAuth2 | Posts, comments |
| **Discord** | Community | Webhook | Rich embeds, mentions |

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/platforms/twitter.js (reported line 190)May include surrounding context.

js
| Platform | Type | Auth | Features |
|----------|------|------|----------|
| **Twitter/X** | Microblog | OAuth 1.0a | Tweets, threads, media |
| **Mastodon** | Microblog | Access Token | Posts, threads, media, any instance |
| **Bluesky** | Microblog | Handle + Password | Posts, threads, media |
| **Reddit** | Community | OAuth2 | Posts, comments |
| **Discord** | Community | Webhook | Rich embeds, mentions |

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 · CHANGELOG.md (reported line 30)May include surrounding context.

md
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

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 · COMPLETION-REPORT.txt (reported line 45)May include surrounding context.

text
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

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 · MEDIA-GUIDE.md (reported line 312)May include surrounding context.

md
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

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 · RELEASE-CHECKLIST.md (reported line 27)May include surrounding context.

md
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

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 · announcements/REDDIT.md (reported line 154)May include surrounding context.

md
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

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 · announcements/REDDIT.md (reported line 178)May include surrounding context.

md
- [x] **Twitter/X** - OAuth 1.0a, tweets, threads, media
- [x] **Reddit** - OAuth2, posts, comments
- [x] **Discord** - Webhooks, rich embeds
- [x] **Mastodon** - Access token, any instance, threads
- [x] **Bluesky** - AT Protocol, posts, threads
- [x] **Moltbook** - API key, posts
- [x] **LinkedIn** - OAuth 2.0, personal/company posts

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · RELEASE.md (reported line 357)May include surrounding context.

md
1. Create `scripts/platforms/yourplatform.js`
2. Implement: `validate()`, `validateContent()`, `post()`
3. Add tests to `scripts/test.js`
4. Update SKILL.md documentation
5. Submit PR! 🎉

**Want to improve existing code?**

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/schedule.js add discord YOUR_WEBHOOK_URL "Scheduled message!" "2026-02-02T20:00:00"

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/platforms/mastodon.js:94

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/platforms/twitter.js:103

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/test.js:54

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/upload-media.js:86