Back to skill

Security audit

Linkedin Page Publisher

Security checks across malware telemetry and agentic risk

Overview

This appears to be a genuine LinkedIn Company Page publishing skill, but it requests broader LinkedIn organization-admin permission than its posting workflow needs and handles long-lived tokens in a risky way.

Install only if you are comfortable granting this skill LinkedIn Company Page publishing power. Before authorizing OAuth, review the consent screen and avoid approving organization-admin permissions unless you specifically need them. Store tokens in a secure secret manager or tightly permissioned local file, revoke/rotate them if exposed, and use `--dry-run` plus explicit human approval before any live post.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill clearly relies on environment variables and outbound network access to LinkedIn, yet no permissions are declared. That creates a trust and review gap: operators may invoke a network-capable skill that can read credentials from the environment without explicit disclosure, increasing the chance of unintended data access or exfiltration in an agent environment.

Vague Triggers

Medium
Confidence
83% confidence
Finding
The activation language is very broad and may cause the skill to be selected for generic LinkedIn-related conversations, not just explicit publishing tasks. In an agentic system, overbroad routing can expose OAuth-bearing publishing functionality in contexts where the user did not intend to post content or use stored credentials, raising the risk of unintended actions.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The documentation mentions redacting tokens in debug output but does not prominently warn that the OAuth helper stores both access and long-lived refresh tokens locally. That omission can lead users to leave sensitive credentials on disk insecurely or share local files/logs without understanding the persistence and value of those secrets.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The setup guide instructs users to print OAuth access and refresh tokens to stdout and then place them into a shell profile or .env file without any warning about their sensitivity. Tokens are bearer credentials; exposing them in terminal history, logs, screenshots, shared shell configs, or improperly protected environment files can allow unauthorized posting as the LinkedIn organization.

Credential Access

High
Category
Privilege Escalation
Content
- **Personal token limit**: roughly 100 calls/day/member. Respect this when building schedulers.
- **Scope required**: `w_organization_social`. The authenticating user must be an admin of the Company Page — being an employee is not enough.
- **Post character limit**: 3,000. The API returns HTTP 422 if exceeded. The library checks locally before calling so the failure is cheaper.
- **Access token lifetime**: 60 days. Refresh tokens last 365 days and can be used to mint new access tokens without re-prompting the user. `get_token.py` saves both.

## What LinkedIn's API cannot do (as of 2026)
Confidence
80% confidence
Finding
Access token

Credential Access

High
Category
Privilege Escalation
Content
- **Personal token limit**: roughly 100 calls/day/member. Respect this when building schedulers.
- **Scope required**: `w_organization_social`. The authenticating user must be an admin of the Company Page — being an employee is not enough.
- **Post character limit**: 3,000. The API returns HTTP 422 if exceeded. The library checks locally before calling so the failure is cheaper.
- **Access token lifetime**: 60 days. Refresh tokens last 365 days and can be used to mint new access tokens without re-prompting the user. `get_token.py` saves both.

## What LinkedIn's API cannot do (as of 2026)
Confidence
80% confidence
Finding
access tokens

VirusTotal

67/67 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.