T08 · Insecure Dependencies
- Location
SKILL.md:223- Finding
Execution of an Unpinned npm Package Through npx
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is not evidently malicious, but it runs mutable npm tooling and generates brand agents with broad command, file, and web permissions that need review before use.
Review before installing. Pin and verify the `openpersona` package version, run generation in a restricted workspace, remove broad default runtime tools from generated agents unless a declared service truly needs them, and make persistence plus ACN registration explicit user-approved steps.
SKILL.md:223Execution of an Unpinned npm Package Through npx
assets/brand.persona.template.json:111Generated Agents Receive Excessive Command Execution and Network Permissions
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
## Prerequisites
- `skills/anyone-skill/SKILL.md` must be present
- `skills/open-persona/SKILL.md` must be present
- `npx openpersona` must be available (`npm install -g openpersona` or use `npx`)
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
## Prerequisites
- `skills/anyone-skill/SKILL.md` must be present
- `skills/open-persona/SKILL.md` must be present
- `npx openpersona` must be available (`npm install -g openpersona` or use `npx`)
Optional:
The README instructs users to run npx openpersona without pinning a package version or integrity source. That allows the fetched code to change over time, and if the package, dependency chain, or registry resolution is compromised, users may execute unintended code during installation or use.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
Optional:
- `skills/persona-knowledge/SKILL.md` — enables persistent brand knowledge base (auto-detected by `anyone-skill`)
---
The listed trigger phrases include broad natural-language requests like 'generate a persona for my brand' and 'help me create a brand agent', which can overlap with normal conversation. In agentic systems, ambiguous triggers can cause unintended skill activation, leading to unauthorized workflow execution, data collection, or file generation when the user did not explicitly intend to invoke this skill.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
### Phase 4 in detail — Four generation steps
| Step | What happens |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 4a | `npx openpersona create` generates the persona pack. `agent-card.json` and `acn-config.json` are auto-generated — A2A discoverability requires no extra work. |
| 4b | `assets/behavior-guide.template.md` is filled with brand-specific values and written to `soul/behavior-guide.md`, overwriting the framework default |
npx openpersona create pulls and executes a package at runtime without a pinned version, creating a supply-chain execution risk. In this skill's context, the command is part of the generation flow, so operators are more likely to execute it directly, increasing practical exposure.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
Every brand agent generated by this skill includes five universal commercial behavior standards in its `soul/behavior-guide.md`:
| Standard | What it enforces |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Onboarding** | On first activation, introduce in brand voice and offer 3 recommended first questions |
| **Data priority** | Live data (MCP/API/Webhook) > static knowledge > honest redirect. Never answer real-time questions with unqualified static values. |
The built-in behavior standards state that generated agents should "Always speak in the brand's own tone," but the documentation does not indicate any user opt-in or language/locale selection. Because the skill is intended for broad commercial use, a fixed output style without user choice can conflict with organizational language/locale policy requirements.
The ACN registration example uses npx openpersona without version pinning, again exposing users to mutable package execution from the registry. Because registration is an operational step that may run in production-like environments, compromise could affect agent credentials, config, or deployment state.
The trigger phrases are broad enough to match ordinary branding or marketing assistance requests, increasing the chance this orchestration skill activates unexpectedly. Unexpected activation matters here because the skill can lead to file generation, dependency loading, web research, and shell command execution paths.
The skill explicitly directs loading another skill by path (skills/anyone-skill/SKILL.md) and following its instructions. Chaining into another skill expands the trust boundary and can import unsafe behavior or prompt-injection content from that dependency, especially since skills are treated as adversarial input.
## Phase 1A — Brand Soul Distillation (Primary path — selected A)
Load `skills/anyone-skill/SKILL.md` and follow its instructions.
When anyone-skill asks "Who do you want to distill?", select `**[6] Archetype`** — composite persona with no single real-world subject. This is the correct type for a brand persona.
This line reveals and conditionally interacts with another installed skill (skills/persona-knowledge/SKILL.md) and its persistent store behavior. Enumerating installed skills and automatically routing data into persistent storage increases attack surface and can expose environment structure or cause sensitive business content to be stored without strong user awareness.
| Product catalog / FAQ document | `.md` / `.pdf` → `universal` adapter |
**Note**: if `skills/persona-knowledge/SKILL.md` is present, anyone-skill will automatically route brand knowledge into the MemPalace persistent store. No extra steps needed.
**Output**: a structured brand persona draft with four dimensions extracted:
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
For each service declared above, the implementation method is **transparent to this skill** — the brand chooses based on what they have:
| Implementation | When to use | Example |
| ------------------ | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| Knowledge response | Information queries, no system integration | Business hours, product descriptions, policies |
| Local script | Specific business operations | Queue number generation, appointment booking |
The instruction to load skills/open-persona/SKILL.md and follow it creates another unbounded cross-skill execution path. In this context, that dependency directly precedes shell execution and file generation, so unsafe instructions in the downstream skill could materially affect the host environment.
## Phase 4 — Generate Persona Pack
Load `skills/open-persona/SKILL.md` and follow its generation instructions.
### Step 4a — Run the generator
The skill instructs the host to execute npx openpersona create without pinning a specific package version. npx may fetch the latest package at runtime, which creates a supply-chain risk: a compromised or breaking upstream release could execute arbitrary code in the agent environment during skill use.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
Fill `skills/brand-persona-skill/assets/behavior-guide.template.md` with brand-specific values and write the result to `./{slug}-skill/soul/behavior-guide.md`, overwriting the framework default. Apply this mapping:
| Placeholder | Source |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `{{brandName}}` | Phase 1A/1B brand name |
| `{{oneLinerBio}}` | Phase 1A/1B one-line bio |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
| Placeholder | Source |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `{{brandName}}` | Phase 1A/1B brand name |
| `{{oneLinerBio}}` | Phase 1A/1B one-line bio |
| `{{onboardingQuestion_1/2/3}}` | 3 realistic first questions a customer would ask this brand |
| `{{blindspotRedirect}}` | Escalation channels declared in Phase 2 (human handoff channel, official website, customer service number, etc.) |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
| Placeholder | Source |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `{{brandName}}` | Phase 1A/1B brand name |
| `{{oneLinerBio}}` | Phase 1A/1B one-line bio |
| `{{onboardingQuestion_1/2/3}}` | 3 realistic first questions a customer would ask this brand |
| `{{blindspotRedirect}}` | Escalation channels declared in Phase 2 (human handoff channel, official website, customer service number, etc.) |
| `{{confirmationRequiredOps}}` | Action services from Phase 2 that require confirmation (list each by name) |
The ACN registration step also uses unpinned npx openpersona, which can download and execute whatever version is current at invocation time. That exposes users to supply-chain compromise and unexpected behavior when publishing to an external network.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
"_comment_speakingStyle": "How the brand speaks to customers. Describe tone, sentence rhythm, characteristic phrases, things to avoid. E.g. 'Speaks like a trusted local friend — direct, natural, never uses marketing jargon. Comfortable admitting when it doesn't know something.'",
"speakingStyle": "{{speakingStyle}}",
"_comment_boundaries": "Combined hard limits from Phase 1 (brand red lines) and Phase 2 (service operation limits). Write as a plain paragraph or newline-separated list. E.g.:\n Never fabricate menu prices or availability.\n Never promise delivery times without checking live data.\n Never make commitments on behalf of third-party partners.\n For complaints involving disputes, always escalate to a human.",
"boundaries": "{{coreRedLines}}\n{{serviceOperationLimits}}",
"_comment_background": "Optional. Brand history, founding story, positioning context. Populated from Phase 1A distillation output if available. Leave empty string if not available.",
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
"_comment_speakingStyle": "How the brand speaks to customers. Describe tone, sentence rhythm, characteristic phrases, things to avoid. E.g. 'Speaks like a trusted local friend — direct, natural, never uses marketing jargon. Comfortable admitting when it doesn't know something.'",
"speakingStyle": "{{speakingStyle}}",
"_comment_boundaries": "Combined hard limits from Phase 1 (brand red lines) and Phase 2 (service operation limits). Write as a plain paragraph or newline-separated list. E.g.:\n Never fabricate menu prices or availability.\n Never promise delivery times without checking live data.\n Never make commitments on behalf of third-party partners.\n For complaints involving disputes, always escalate to a human.",
"boundaries": "{{coreRedLines}}\n{{serviceOperationLimits}}",
"_comment_background": "Optional. Brand history, founding story, positioning context. Populated from Phase 1A distillation output if available. Leave empty string if not available.",
This manifest template says the trigger is optional and describes it only as 'keywords or phrases that activate this skill' without requiring a constrained list, scope boundaries, or negative examples. That broad guidance can lead skill authors to choose everyday-language triggers that cause unintended invocation collisions.
This persona template grants broad execution, filesystem, and network capabilities via Bash, Read/Write, WebFetch, and WebSearch even though the file’s stated purpose is only to define a brand persona. In a templated skill, these defaults can propagate to many deployed agents and enable command execution, data exfiltration, or unauthorized external access if later prompts or linked skills are compromised or overly permissive.
The template explicitly gives an example recovery path of "Authentication expired" → "Re-trigger auth flow automatically," which normalizes automatic auth re-initiation without requiring explicit user notice, consent, or anti-phishing safeguards. In a service-contract template meant to guide agent behavior and external agent integration, this can propagate insecure authentication patterns across downstream agents and increase the risk of silent re-auth prompts, confused-deputy flows, or credential phishing abuse.
No suspicious patterns detected.