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

Content
View full analysis

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
View 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
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

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

Tool Reference

1. Create Personal Post

bash
pdauth call linkedin.linkedin-create-text-post-user \

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
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.

Content

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

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

---

Static analysis

No suspicious patterns detected.