Back to skill

Security audit

Placed Resume Builder

Security checks for vulnerabilities and agentic risk

Overview

This resume-management skill is mostly purpose-aligned, but it handles an API key and sensitive resume data with under-scoped local credential storage and unsafe shell practices.

Review before installing. This skill is not evidence of malware, but it will send resume data to placed.exidian.tech and may store a long-lived API key locally. Prefer using a temporary/session-only key, confirm before exporting or making resumes public, and avoid letting the skill source or write plaintext credential files unless you understand the local exposure risk.

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
SKILL.md:16
Finding

Unsafe Sourcing and Storage of API Credentials

Content
View full analysis
"Please provide your Placed API key (get it at https://placed.exidian.tech/settings/api)" Then save it for future sessions: ```bash mkdir -p "$HOME/.config/placed" echo "export PLACED_API_KEY=" > "$HOME/.config/placed/credentials" export PLACED_API_KEY= ``` ### Technical Analysis The `source` command evaluates the entire credential file as shell code. A credential file should be treated as data, but this implementation turns it into an executable code-loading mechanism. If an attacker or compromised process gains write access to `~/.config/placed/credentials`, arbitrary shell commands placed in that file will execute with the privileges of the user running the Skill. The storage commands do not explicitly set restrictive permissions. The resulting directory and file permissions depend on the user's current `umask`; an insufficiently restrictive configuration could expose the bearer token to other local users. Possession of that token permits authenticated access to the user's Placed account through the documented API. The placeholder also instructs the Agent to insert the supplied key directly into shell syntax without quoting or validating it. If a supplied value contains shell metacharacters, command substitutions, whitespace, or quotes, it can alter the generated command or execute unintended commands. Reading a Placed API credential is necessary for the declared functionality, but evaluating the credential file as code and omitting explicit access controls exceed the minimum ...[truncated 2300 chars]
Remediation
View remediation
"$credential_file" chmod 600 "$credential_file" ``` 3. **Never insert user-provided credentials directly into generated shell syntax.** Receive the value through a protected input mechanism, assign it using safe quoting, and write it with `printf '%s\n'`. 4. **Validate the token format** against the provider's documented character set and length. Reject newlines, control characters, shell metacharacters, and structurally invalid values. 5. **Prefer an operating-system credential manager** such as macOS Keychain, Windows Credential Manager, or Secret Service/libsecret instead of a plaintext file. 6. **Avoid displaying or logging the token.** Ensure verbose shell tracing is disabled while credentials are handled and redact authorization headers from diagnostics. 7. **Check existing credential-file ownership and permissions** before reading it. Refuse to use files owned by another account or files writable by group or other users. 8. **Support revocation and rotation.** Advise users to revoke and replace the Placed API key if the credential file may have been exposed. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
placed_call() {
  local tool=$1
  local args=${2:-'{}'}
  curl -s -X POST https://placed.exidian.tech/api/mcp \
    -H "Authorization: Bearer $PLACED_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"$tool\",\"arguments\":$args}}" \

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 3)May include surrounding context.

md
---
name: placed-resume-builder
description: This skill should be used when the user wants to "build a resume", "create a resume", "update my resume", "export resume as PDF", "change resume template", "list my resumes", "download resume", "switch template", or wants to manage resumes using the Placed career platform at placed.exidian.tech.
version: 1.0.0
metadata:
  { "openclaw": { "emoji": "📄", "homepage": "https://placed.exidian.tech" } }

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill is designed to send resume contents, which commonly include sensitive personal data, to a remote API service but does not clearly warn the user of that transmission. Users may disclose names, emails, phone numbers, work history, and other personal information without informed consent about where the data is being sent.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs the agent to read credentials from a local shell configuration file and to persist a user-provided API key back to disk. That expands the skill from simple resume management into local secret discovery and storage, which increases the risk of unnecessary credential exposure or reuse beyond the immediate task.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill tells the agent to save the provided API key into ~/.config/placed/credentials without any user-facing disclosure that the secret will be written to disk. Silent persistence of credentials creates avoidable long-term exposure if the machine, account, backups, or logs are later accessed by others.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The curl helper sends authenticated requests and user resume data to an external service. External transmission is expected for this skill's purpose, but it still represents a real data exposure surface because highly personal content and bearer credentials leave the local environment.

Content

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

md
placed_call() {
  local tool=$1
  local args=${2:-'{}'}
  curl -s -X POST https://placed.exidian.tech/api/mcp \
    -H "Authorization: Bearer $PLACED_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"$tool\",\"arguments\":$args}}" \

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The API reference documents creation, retrieval, update, export, and sharing-related operations over highly sensitive resume/profile data, including PII such as name, email, phone, work history, education, references, and social profiles, but provides no privacy, consent, retention, or safe-handling guidance. In an agent skill context, this increases the risk that an integrator or agent will over-collect, expose, export, or make public user data without clear user awareness or safeguards.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.