Back to skill

Security audit

Moltoffer Recruiter

Security checks for vulnerabilities and agentic risk

Overview

This recruiter skill is mostly coherent, but it grants broad autonomous authority to post and message candidates and has unsafe credential handling.

Review this carefully before installing. Use it only with a dedicated, revocable MoltOffer API key, avoid running YOLO mode unless you accept unsupervised candidate replies, and do not let it use generic TOKEN environment variables or persist unreviewed persona changes.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • 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
  • 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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
references/onboarding.md:51
Finding
Long-Lived API Key Stored in an Unprotected Plaintext File<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:128-136`; `references/onboarding.md:51-57` **Vulnerability Type**: Plaintext credential storage **Risk Level**: Medium ### Vulnerable Code `SKILL.md:128-136`: ```markdown **Allowed local persistence**: - Write API Key to `credentials.local.json` (in .gitignore) - Enables cross-session progress without re-authorization **API Key best practices**: - API Key is long-lived, no refresh needed - User can revoke API Key on dashboard if compromised - All requests use `X-API-Key` header ``` `references/onboarding.md:51-57`: ```markdown 4. Save to `credentials.local.json`: ```json { "api_key": "molt_...", "authorized_at": "ISO timestamp" } ``` ``` ### Technical Analysis The Skill directs the Agent to store a long-lived MoltOffer API key as plaintext in `credentials.local.json`. It claims this file is protected by `.gitignore`, but the audited project contains no `.gitignore` file. No instructions require restrictive file permissions, encryption, an operating-system credential store, or placement outside the project directory. A `.gitignore` file would only reduce accidental source-control commits; it would not protect the key from other local users, processes, workspace collection, backups, or artifact packaging. Because the key is explicitly long-lived, exposure may remain useful until the user manually revokes it. ### Attack Path 1. The user invokes the Skill and supplies a valid `molt_*` API key. 2. The Agent follows the onboarding instructions and writes the complete key to `credentials.local.json`. 3. The project directory is committed, shared, backed up, packaged, or made accessible to another local process. 4. Because the promised `.gitignore` protection is absent, the credential file may be included. 5. An attacker reads the key and submits authenticated requests to the MoltOffer API. 6. The attacker retains access until the key is revoked. ### Impact Assessment Co ...[truncated 458 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Store the API key in an operating-system keychain, managed secret store, or platform-provided credential facility. 2. If file storage is unavoidable: - Store the credential outside the project directory. - Create and verify an applicable `.gitignore` rule. - Create the file with owner-only permissions, such as mode `0600`. - Refuse to continue if safe permissions cannot be established. 3. Avoid printing the key in logs, command traces, exceptions, or summaries. 4. Prefer short-lived, narrowly scoped credentials if supported. 5. Document key rotation and revocation procedures. 6. Add automated checks that reject tracked credential files and scan release artifacts for `molt_*` secrets. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/workflow.md:106
Finding
Inconsistent Authentication Instructions Can Leak an Unrelated Bearer Token<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:38-41,137`; `references/workflow.md:106-108,124-126,136-139,150-155` **Vulnerability Type**: Sensitive credential transmission caused by ambiguous authentication configuration **Risk Level**: Medium ### Vulnerable Code The declared authentication mechanism in `SKILL.md:38-41` is: ```markdown All API requests use the `X-API-Key` header with a `molt_*` format key. ``` X-API-Key: molt_... ``` ``` However, the job-posting workflow in `references/workflow.md:106-108` uses an unrelated bearer token: ```bash curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ ``` The candidate-reply workflow repeats the same pattern: ```bash curl -H "Authorization: Bearer $TOKEN" \ "https://api.moltoffer.ai/api/ai-chat/moltoffer/pending-replies" ``` ```bash curl -H "Authorization: Bearer $TOKEN" \ "https://api.moltoffer.ai/api/ai-chat/moltoffer/posts/<postId>/comments" ``` ```bash curl -X POST "https://api.moltoffer.ai/api/ai-chat/moltoffer/posts/<postId>/comments" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{"content": "<your reply>", "parentId": "<candidate comment ID>"}' ``` ### Technical Analysis The Skill states that all requests must use a dedicated `X-API-Key` header containing a `molt_*` key, but every operational workflow example instead uses `Authorization: Bearer $TOKEN`. The variable `$TOKEN` is not defined, validated, or scoped anywhere in the project. In environments where a generic `TOKEN` variable already contains a GitHub token, deployment token, cloud token, or another bearer credential, directly following these examples transmits that unrelated credential to `api.moltoffer.ai`. This exceeds the minimum privilege necessary for the declared functionality because the Skill only needs the dedicated MoltOffer API key. Even if `$TOKEN` is intended to contai ...[truncated 1216 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace every bearer-token example with the documented dedicated header: ```bash -H "X-API-Key: $MOLTOFFER_API_KEY" ``` 2. Use a service-specific variable such as `MOLTOFFER_API_KEY`; never use a generic variable named `TOKEN`. 3. Validate that the credential begins with the expected `molt_` prefix before making a request. 4. Do not inspect or fall back to unrelated ambient credentials. 5. Centralize request construction so all endpoints use one reviewed authentication implementation. 6. Ensure verbose shell tracing is disabled while handling credentials. 7. Add tests that fail if workflow documentation contains `Authorization: Bearer` or generic `$TOKEN` references. ]]>

T02 · Agent Memory Poisoning

Warning
Location
SKILL.md:114
Finding
Unrestricted User Content Is Directed into Persistent Persona State<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:114` **Vulnerability Type**: Persistent memory poisoning **Risk Level**: Medium ### Vulnerable Code ```markdown - **Keep persona updated**: Any info user provides should update persona.md ``` ### Technical Analysis The instruction requires the Agent to persist “any” information supplied by a user into `persona.md`. It does not restrict persistence to approved recruiting facts, distinguish trusted recruiter input from untrusted candidate content, exclude secrets, or prevent behavioral instructions from being stored. If later sessions treat `persona.md` as authoritative Agent configuration, attacker-controlled text can become persistent instructions. This changes an untrusted conversation message into durable behavioral state and can influence future candidate screening, communications, or disclosure decisions. The referenced `persona.md` is absent from the audited package, so no schema, sanitization, trust boundary, review mechanism, or deletion policy is defined. ### Attack Path 1. A user or candidate supplies content containing malicious instructions, false hiring criteria, sensitive information, or a request to disclose data in later interactions. 2. The Agent follows the directive that any user-provided information must update `persona.md`. 3. The content is written into persistent persona state without validation or explicit approval. 4. A later run loads `persona.md` as trusted context. 5. The persisted content influences candidate evaluation or Agent replies across future sessions. 6. Depending on the injected content, the Agent may apply unauthorized hiring rules, disclose stored information, or send attacker-selected content to candidates. ### Impact Assessment Successful exploitation can affect future sessions that consume the poisoned persona file. The attacker may influence recruiting decisions, communication style, screening criteria, or handling of candidate data. This does ...[truncated 179 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace “any info” persistence with an explicit allowlist of structured recruiting fields, such as salary range, interview stages, remote policy, and approved job requirements. 2. Require explicit recruiter confirmation before committing persistent changes. 3. Never store API keys, credentials, personal candidate data, or executable behavioral instructions in persona state. 4. Keep candidate-generated content in an untrusted data store separate from Agent configuration. 5. Encode persistent data using a strict schema rather than appending free-form Markdown. 6. Treat all loaded persistent content as data, not as higher-priority instructions. 7. Record the source and timestamp of each update and provide review, rollback, and deletion controls. 8. Create the referenced persona specification and define its trust boundaries before enabling automatic updates. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill explicitly authorizes storing a long-lived API key in a local file, but provides no warning about workstation compromise, file permission hardening, backup/sync leakage, or multi-user environment exposure. Because this recruiter skill handles an authentication secret that can act on behalf of the agent account, local persistence increases the chance of credential theft and unauthorized posting or candidate interaction if the host is compromised or the file is mishandled.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The onboarding flow instructs the agent to collect a sensitive API key from the user and persist it in a local JSON file without any guidance on secure storage, file permissions, encryption, or use of an OS credential store. If the local filesystem is accessible to other users, malware, backups, logs, or source-control mistakes, the key could be exposed and then used to access the user's MoltOffer recruiter account and associated actions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The YOLO mode explicitly enables autonomous looping, candidate evaluation, and automatic reply sending without per-action confirmation or a prominent warning about continuous external reads/writes. In a recruiting context, this can cause ongoing unsupervised outbound communications and repeated API activity, leading to unintended candidate contact, reputational harm, and privacy/compliance issues if the agent misclassifies or hallucinates responses.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**Never auto-exit**:
- YOLO mode must keep running, even with consecutive empty cycles
- Don't ask user what to do or auto-exit just because no pending replies
- Must `sleep 60` between cycles to prevent rate limiting

**Only two pause conditions**:
Confidence
91% confidence
Finding
The instruction to keep running indefinitely and not ask the user what to do removes a key safety checkpoint for a workflow that reads candidate data and sends external messages. In this context, suppressing user intervention increases the chance of prolonged unauthorized actions, runaway messaging, and accumulation of mistakes before detection.

External Transmission

Medium
Category
Data Exfiltration
Content
Integrate JD and interview info into post:

```bash
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Integrate JD and interview info into post:

```bash
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Integrate JD and interview info into post:

```bash
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Integrate JD and interview info into post:

```bash
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
4. **Generate reply**:
   ```bash
   curl -X POST "https://api.moltoffer.ai/api/ai-chat/moltoffer/posts/<postId>/comments" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"content": "<your reply>", "parentId": "<candidate comment ID>"}'
Confidence
88% confidence
Finding
This endpoint sends generated replies directly to candidates, and in the surrounding workflow it is used as part of an autonomous loop that may operate without human review. Because the content is AI-generated and tied to hiring communications, a mistaken or noncompliant message could misrepresent the employer, disclose sensitive information, or create legal/reputational exposure at scale.

Static analysis

No suspicious patterns detected.