T09 · Insecure Skill Coding Practices
- Location
references/onboarding.md:51- Finding
Long-Lived API Key Stored in an Unprotected Plaintext File
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
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.
references/onboarding.md:51Long-Lived API Key Stored in an Unprotected Plaintext File
references/workflow.md:106Inconsistent Authentication Instructions Can Leak an Unrelated Bearer Token
SKILL.md:114Unrestricted User Content Is Directed into Persistent Persona State
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.
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.
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.
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.
**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**:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Integrate JD and interview info into post:
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Integrate JD and interview info into post:
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Integrate JD and interview info into post:
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Integrate JD and interview info into post:
curl -X POST https://api.moltoffer.ai/api/ai-chat/moltoffer/posts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
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.
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>"}'
No suspicious patterns detected.