T01 · Skill Instruction Hijacking
- Location
protagons.mjs:179- Finding
Untrusted Remote SOUL.md Content Can Hijack Agent Instructions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is open about loading AI personas, but it lets mutable remote persona text steer the agent and sends a Google API key to a third-party backend.
Review this skill before installing. Use it only if you are comfortable with agents applying persona text fetched from api.usaw.ai, and treat deployed SOUL.md as untrusted content that must not override higher-priority instructions. For generation, use only a tightly scoped, low-quota, throwaway Google/Gemini API key and rotate or revoke it after use.
protagons.mjs:179Untrusted Remote SOUL.md Content Can Hijack Agent Instructions
protagons.mjs:309Reusable Google API Key Is Disclosed to a Third-Party Backend
The deploy tool explicitly states it returns a rich external SOUL.md for the agent to adopt, making the prompt-injection path direct rather than incidental. This is dangerous because a remote service can supply instructions that impersonate higher-priority guidance, alter the model’s identity, suppress safeguards, or steer future responses and tool decisions under the guise of character deployment.
The instruction to 'Adopt it as your personality for the session' explicitly tells the agent to incorporate externally fetched SOUL.md content into its active behavior. This creates a direct pathway for remote prompt injection or policy override, because untrusted content can influence the agent’s persona, priorities, and response style in ways that may conflict with existing safeguards.
The documented flow normalizes a progression from broad search to deployment of a new identity, making personality takeover a standard interaction pattern rather than a guarded exception. Because the deployed content comes from an external public library and may include 'dark' or 'adversarial' archetypes, this context makes the takeover path more dangerous by encouraging repeated exposure to untrusted behavioral instructions.
The skill’s invocation examples use broad conversational triggers like 'Load a character' and 'Find me a character' without tightly constraining when identity-changing tools should be used. In a system that can fetch and adopt external persona content, vague trigger scope increases the chance of accidental or prompt-injected activation, which could shift agent behavior unexpectedly.
The skill’s core feature is to fetch and present external character/persona content for the agent to adopt, which creates a semantic prompt-injection channel. Even if intended for customization, externally sourced identity instructions can override system or developer goals, influence tool use, or manipulate downstream behavior because they are framed as role/personality rather than untrusted data.
The skill sends user-controlled data to an external service at api.usaw.ai, including search terms, deployed content requests, and in protagons_generate a user-supplied Google API key and character description. In this skill context, external transmission is expected functionality, but it is still security-relevant because sensitive credentials and prompt content leave the local environment and are entrusted to a third party.
* @module protagons
*/
const API_BASE = 'https://api.usaw.ai/api/v1';
const REQUEST_TIMEOUT_MS = 30_000;
const CATEGORIES = [
The status hint presents the skill in a narrowly scoped, non-mutating way focused on returning SOUL.md content. However, the same module also implements protagons_generate, which performs a POST to /generate and transmits sensitive credentials to an external API to create new content, making the status description materially misleading about overall behavior.
The code fixes all API traffic to https://api.usaw.ai/api/v1, which bakes in a specific regional endpoint choice. Under the policy, locale-specific behavior should either be user-selectable or clearly documented as a justified regional constraint, and neither is evident here.