Back to skill

Security audit

Placed Resume Optimizer

Security checks for vulnerabilities and agentic risk

Overview

This resume skill is mostly purpose-aligned, but it sends sensitive career data to a third-party API and tells users to persist and source an API key in an unsafe plaintext shell file.

Review this before installing. Use it only if you are comfortable sending resume, job-description, and career-history data to Placed. Prefer setting PLACED_API_KEY only for the current session or storing it in a secure secret manager; if you must use the documented file, restrict permissions and do not source files that can be modified by others.

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:20
Finding

Unsafe Plaintext Storage and Executable Loading of API Credentials

Content
View full analysis
" > "$HOME/.config/placed/credentials" export PLACED_API_KEY= ``` ### Technical Analysis The Skill stores the Placed API key in a plaintext file without explicitly restricting the permissions of either the directory or the file. Depending on the user's `umask`, the resulting credential file may be readable by other local users or processes. The credential file is subsequently loaded with `source`. This command interprets the entire file as shell code rather than reading the API key strictly as data. Consequently, any party capable of modifying `~/.config/placed/credentials` can insert arbitrary shell commands that will execute under the account running the Skill. The documented save procedure also places a user-provided value directly into generated shell syntax. A specially constructed key containing shell metacharacters, command substitutions, quotes, or line breaks could alter the intended command if an agent substitutes it literally. Credential access is necessary for the authenticated API request, but executable configuration loading and unrestricted plaintext storage exceed the minimum privileges and behavior required. ### Attack Path 1. The Skill creates `~/.config/placed/credentials` without explicitly setting restrictive permissions. 2. A local user, compromised process, or other principal with file access reads or modifies the credential file. 3. To steal the credential, the attacker reads the plaintext `PLACED_API_KEY` and uses it to access the Placed API as the vi ...[truncated 1244 chars]
Remediation
View remediation
"$credential_file" chmod 600 "$credential_file" ``` 4. Do not interpolate a user-provided key into generated shell source. Accept it through a protected input mechanism, assign it to a quoted variable, and write it using `printf '%s\n'`. 5. Prefer an operating-system credential manager or secret store instead of a plaintext file where available. 6. Avoid displaying the key in logs, command output, prompts, or error messages. 7. Validate the credential file before use: require a regular file owned by the current user, reject symbolic links, and reject files with group or world permissions. 8. Document credential revocation and rotation procedures in case an existing plaintext key has been exposed. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

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 43)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
96% confidence
Finding

The skill is explicitly designed to process resumes and job descriptions, but it does not clearly warn users that this potentially sensitive personal and employment data will be transmitted to a third-party service at placed.exidian.tech. Because resumes often contain PII, work history, and contact information, users may unknowingly expose sensitive data to an external processor without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill instructs users to save the API key in a shell-sourceable plaintext file under the home directory without warning about local credential exposure risks. This can leak the token through weak file permissions, backups, shared accounts, shell sourcing behavior, or accidental disclosure, enabling unauthorized use of the external service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
98% confidence
Finding

The curl-based helper transmits API credentials and tool arguments to an external endpoint, and those arguments may contain full resumes, bullet content, and job descriptions. In this skill context that behavior is expected, but it is still a real data-exposure risk because sensitive personal data is sent off-platform to a third party.

Content

Scanner excerpt · SKILL.md (reported line 43)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}}" \

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documented generate_resume_from_prompt capability materially expands the skill from resume optimization into full resume creation, which exceeds the declared scope in the metadata. Scope expansion is dangerous because it can enable unintended data flows, user expectations, and agent behavior not covered by the manifest’s stated purpose or review boundary, especially when handling sensitive career-history inputs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

This markdown file describes use of a Bearer token and later documents endpoints that process resume and job-description content, which are user-sensitive data. The reference contains no user-facing warning about protecting the API key or about sending resume/job data to the service.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.