Back to skill

Security audit

Linkedin Pipedream

Security checks for vulnerabilities and agentic risk

Overview

This skill can perform real LinkedIn actions and includes hard-coded account identifiers that could cause posts or deletions under the wrong account.

Review carefully before installing. Replace all hard-coded user, organization, member, and auth-provision identifiers with your own protected configuration, avoid committing secrets, and require explicit confirmation or dry-run behavior before posting or deleting LinkedIn content.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
org-post.mjs:25
Finding
Hard-Coded Production Account Identifiers and Unsafe Default Organization Posting## Vulnerability Details **File Location**: `org-post.mjs`, lines 25–52 **Vulnerability Type**: Hard-coded account configuration and unsafe credential-backed action defaults **Risk Level**: Medium ### Vulnerable Code ```javascript // Defaults - customize as needed const DEFAULTS = { userId: 'telegram:5439689035', orgId: '105382747', // Versatly authProvisionId: 'apn_4vhLGx4', // LinkedIn account }; const client = new PipedreamClient({ projectEnvironment: config.environment || 'development', clientId: config.clientId, clientSecret: config.clientSecret, projectId: config.projectId, }); async function postAsOrg(text, options = {}) { const { orgId = DEFAULTS.orgId, userId = DEFAULTS.userId, authProvisionId = DEFAULTS.authProvisionId } = options; console.log(`📝 Posting to organization ${orgId}...`); console.log(` User: ${userId}`); console.log(` Text: ${text.substring(0, 100)}${text.length > 100 ? '...' : ''}`); try { const result = await client.actions.run({ id: 'linkedin-create-text-post-organization', externalUserId: userId, configuredProps: { linkedin: { authProvisionId }, organizationId: orgId, text: text, }, }); ``` ### Technical Analysis The script embeds identifiers for a specific Telegram user, LinkedIn organization, and OAuth authorization provision. It then uses these identifiers as automatic defaults for a credential-backed external action. Running the script with only post text is sufficient to attempt publication to the hard-coded organization. The script does not require the operator to explicitly select an organization, verify that the authorization provision belongs to the selected user, display the complete pending request for approval, or confirm publication before invoking `client.actions.run()`. The `--user` and `--org` arguments can modify two identifiers, but the autho ...[truncated 2409 chars]
Remediation
## Remediation Suggestions 1. Remove all real user, organization, and authorization-provision identifiers from source control. 2. Require the caller to supply `--org`, `--user`, and an account or authorization reference explicitly, or load them from a protected per-user configuration file. 3. Reject execution when any required identity field is absent instead of using production defaults. 4. Validate that the selected authorization provision belongs to the selected external user and is authorized to administer the requested organization. 5. Add a confirmation step that displays the target organization, acting identity, and complete post content before publication. Provide a separate explicit `--yes` option for controlled automation. 6. Implement a dry-run mode and make it the default: ```bash node org-post.mjs --org ORG_ID --user USER_ID --dry-run "Post content" ``` 7. Restrict supported organization IDs through an allowlist maintained outside the repository. 8. Protect `~/.config/pdauth/config.json` with least-privilege filesystem permissions, such as owner-only read and write access. 9. Avoid logging sensitive post content by default, particularly in shared CI/CD logs. 10. Remove or redact the corresponding personal member URN, Telegram identifier, organization identifier, and authorization-provision identifier documented in `SKILL.md`.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Ssd 3

High
Confidence
98% confidence
Finding
The sample SDK code combines instructions to retrieve client credentials from disk with live-looking external user and auth linkage identifiers. This creates a concrete pathway for readers to reuse another user's account context or mishandle secrets, making unauthorized actions significantly easier than abstract documentation would.

Ssd 3

High
Confidence
99% confidence
Finding
These sections disclose concrete account-linkage and profile values for a real person, including identifiers that tie LinkedIn, Pipedream, and organization administration together. In context, this is more dangerous because the skill is specifically about performing authenticated actions on LinkedIn accounts, so leaked linkage data is immediately useful for abuse or targeted social engineering.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The skill repeatedly uses a hard-coded personal identifier format with a concrete Telegram user ID in examples, without any note that such identifiers are sensitive and user-specific. This can normalize copying another person's account reference into commands and may facilitate misuse of the wrong linked identity.

Session Persistence

Medium
Category
Rogue Agent
Content
## Tool Reference

### 1. Create Personal Post

```bash
pdauth call linkedin.linkedin-create-text-post-user \
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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill includes a delete-post capability with no warning that the action is destructive or recommendation for confirmation before use. In an automation context, this can lead to accidental content deletion, especially if the agent or user passes the wrong URN.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The workaround instructs users to pull client credentials from a local config file and embed them directly into a custom script. This expands the skill from normal API usage into unsafe secret extraction and hardcoding, increasing the risk of credential leakage through source files, shell history, logs, or accidental sharing.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The documentation discusses retrieving client credentials from a local config and placing them into code without any privacy or secret-handling warning. That encourages insecure operational practices and may cause sensitive credentials to be exposed in files, repositories, or logs.

Context-Inappropriate Capability

Medium
Confidence
99% confidence
Finding
The skill exposes a real user's LinkedIn-related identifiers, including a Pipedream external user ID, member URN, auth provision ID, and organization admin relationship. These are privacy-sensitive account linkage details that can enable impersonation attempts, unauthorized action targeting, or abuse of an already-linked OAuth context if combined with other access.

Skill Enumeration

Medium
Category
Agent Snooping
Content
|------|---------|
| `~/.config/pdauth/config.json` | Pipedream credentials |
| `~/.openclaw/workspace/pdauth/` | pdauth CLI source |
| `~/.openclaw/workspace/skills/pdauth/SKILL.md` | pdauth skill reference |

---
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Static analysis

No suspicious patterns detected.