Back to skill

Security audit

Linkedin Video Downloader

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated LinkedIn video-download purpose, but its URL handling and README install examples create review-worthy security and supply-chain risk.

Review before installing. Build only from the reviewed local source, not the README placeholder GitHub path or an unpinned @latest command. Use only trusted public LinkedIn post URLs; do not expose this CLI as an automated service for arbitrary submitted URLs unless URL, redirect, response-size, and media-host validation are fixed.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T09 · Insecure Skill Coding Practices

Error
Location
main.go:63
Finding

Server-Side Request Forgery Through Insufficient URL and Redirect Validation

Content
View full analysis
1 { cleaned := cleanURL(match[1]) if cleaned != "" && !seen[cleaned] { seen[cleaned] = true urls = append(urls, cleaned) } } } ``` ```go resp, err := client.Do(req) ``` ### Technical Analysis The application attempts to restrict input to LinkedIn by checking whether the raw argument contains the substring `linkedin.com`. This is not a valid origin check. An arbitrary URL can satisfy the condition by placing that text in its path, query string, user-information component, or attacker-controlled hostname. For example, `http://127.0.0.1:8080/?linkedin.com` passes the check while directing the HTTP request to localhost. The page-fetching client also follows redirects without validating the destination. Consequently, even a genuinely permitted origin could redirect the client to a private or otherwise prohibited address. The extracted media URL is also insufficiently constrained. In particular, the JSON-LD `contentUrl` pattern accepts any HTTP or HTTPS origin. `cleanURL` only checks whether Go can parse the value; it does not enforce an approved hostname, scheme policy beyond the regular expression, or destination IP policy. The resulting URL is subsequently req ...[truncated 1549 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
main.go:139
Finding

Unbounded Buffering of Remote Page Responses

Content
View full analysis
Remediation
View remediation
maxPageSize { return "", fmt.Errorf("page response exceeds size limit") } limited := io.LimitReader(resp.Body, maxPageSize+1) body, err := io.ReadAll(limited) if err != nil { return "", err } if int64(len(body)) > maxPageSize { return "", fmt.Errorf("page response exceeds size limit") } ``` ]]>

T08 · Insecure Dependencies

Warning
Location
README.md:20
Finding

Installation Instructions Reference an Unverified Mutable Placeholder Source

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (2)

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README is written in English, but the example output shown to users is in Spanish ('Obteniendo página del post...', 'Descarga completada'). This suggests the skill may present a fixed locale without offering user choice or documenting a justified locale restriction, which conflicts with the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The request unconditionally sets Accept-Language to en-US,en;q=0.5, which imposes a specific language/locale preference in outbound requests. This is a natural-language policy concern because the skill does not offer user opt-in or explain why English is required.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.