Back to skill

Security audit

posty

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Posty CLI guide for authenticated social-media publishing, with normal but sensitive posting and credential behavior users should scope carefully.

Install only if you trust the Posty CLI package and service, prefer a scoped API key or carefully approved device login, limit workspaces/channels granted to the key, review content before publishing or deleting posts, and consider pinning the package or source revision in sensitive environments.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:17
Finding
Unpinned Third-Party CLI Installation and Build<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 17-28 **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: Medium ### Vulnerable Code ```bash npm install -g posty-cli posty auth:login ``` The alternative source installation method is also unpinned: ```bash git clone https://github.com/norbertlevente/posty-agent.git cd posty-agent pnpm install && pnpm run build npm link ``` ### Technical Analysis The Skill instructs users to globally install and execute the latest available version of `posty-cli` without specifying an audited version, integrity hash, or verifiable package provenance. This allows the code ultimately executed by the Skill to change after the Skill itself has been reviewed. The alternative installation process similarly clones the repository's current default branch rather than a specific reviewed commit or signed release. It then installs dependencies and runs the project's build process. Package installation and build operations may execute lifecycle scripts supplied by the project or its transitive dependencies. Because this artifact contains only `SKILL.md`, the implementation of the installed executable, its dependency lockfile, and its lifecycle scripts cannot be reviewed as part of this audit. A malicious or compromised package release, repository update, maintainer account, or transitive dependency could therefore introduce arbitrary executable code. ### Attack Path 1. An attacker compromises the npm package, source repository, maintainer credentials, or a transitive dependency. 2. The attacker publishes a malicious update under the expected package name or adds malicious code to the repository's default branch. 3. A user or Agent follows the Skill's installation instructions. 4. `npm install`, `pnpm install`, or the build process retrieves the attacker-controlled version and executes applicable lifecycle or build scripts. 5. The malicious code runs with the privileges of the user performin ...[truncated 1355 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `posty-cli` to a specifically reviewed release rather than installing the latest version: ```bash npm install -g posty-cli@<reviewed-version> ``` 2. Publish and verify the expected npm integrity digest or package provenance before installation. Use npm provenance attestations and signed release artifacts where available. 3. Pin source-based installation instructions to a full reviewed commit hash or signed tag: ```bash git clone https://github.com/norbertlevente/posty-agent.git cd posty-agent git checkout --detach <reviewed-full-commit-hash> ``` 4. Ship and enforce a committed lockfile. Use a frozen installation mode, such as: ```bash pnpm install --frozen-lockfile ``` 5. Review lifecycle and build scripts before execution. Where compatible with the package, initially install dependencies with lifecycle scripts disabled and explicitly run only audited build steps. 6. Avoid global installation where practical. Use a dedicated unprivileged environment, container, or project-local installation to reduce the files and credentials exposed if the dependency is compromised. 7. Never perform installation with administrative privileges unless it is strictly necessary. Document that the CLI should run as an ordinary user. 8. Add an update-review policy so that version or commit changes require a fresh security review before the Skill's installation instructions are updated. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Credential Access

High
Category
Privilege Escalation
Content
resulting key may reach. This runs inside Posty's own backend; there is no
separate auth service.

Credentials land in `~/.posty/credentials.json` (`0600`, in a `0700`
directory) and take priority over `POSTY_API_KEY`. The token response also
carries the API base, so the CLI points itself at the right host without a
release.
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
Posty can generate video, and do not call those routes — they 404.
- **No image or video generation of any kind through this CLI.** Media comes
  from files the user already has, via `posty upload`.
- **No channel deletion.** `DELETE /integrations/:id` was deliberately removed
  from the public API. Disconnecting a channel is a signed-in, admin action in
  the web app.
- **Nothing outside the channel table at the top of this file.**
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Session Persistence

Medium
Category
Rogue Agent
Content
2. **Discover** - List integrations and get their settings
3. **Fetch** - Use integration tools to retrieve dynamic data (Instagram `audioSearch`; Discord and Slack `channels`)
4. **Prepare** - Upload media files if needed
5. **Post** - Create posts with content, media, and platform-specific settings
6. **Analyze** - Track performance with platform and post-level analytics
7. **Resolve** - If analytics returns `{"missing": true}`, run `posts:missing` to list provider content, then `posts:connect` to link it
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
A1=$(posty upload another.jpg | jq -r '.path')
A2=$(posty upload more.jpg | jq -r '.path')

posty posts:create \
  -c "Main post" -m "$I1,$I2" \
  -c "Comment 1" -m "$CI" \
  -c "Comment 2" -m "$A1,$A2" \
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
### Threads — `threads`, and Bluesky — `bluesky`
```bash
posty posts:create -c "Post text" -s "2026-12-31T12:00:00Z" -i "$THREADS_ID"
```
No provider settings. Omit `--settings` entirely.
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The file states that 'Everything the CLI accepts is documented above,' implying the document is a complete command reference. However, the rate-limits section explicitly lists an additional `upload-from-url` route at L272, while no corresponding command syntax or usage is documented elsewhere in the file. This is an active contradiction between the file's completeness claim and its own documented behavior surface.

Intent-Code Divergence

Low
Confidence
96% confidence
Finding
The media upload section says the server 'sniffs the magic bytes, so renaming the file does not help,' which means actual content determines file acceptance. Later, the gotchas section says 'CLI auto-detects from file extension,' which directly conflicts with the earlier statement about content-based detection. These instructions would lead a user to opposite conclusions about what matters for upload validation.

Static analysis

No suspicious patterns detected.