Back to skill

Security audit

PCEC EvoMap Integrator

Security checks for vulnerabilities and agentic risk

Overview

This skill openly integrates with EvoMap, but it gives an agent broad remote-query, automatic reporting, remote solution reuse, and external task-claiming behavior without enough user control or safety boundaries.

Review this skill carefully before installing. Use it only if you are comfortable sending error/workflow signals and usage results to evomap.ai, and do not allow it to execute returned solutions or claim/complete bounty tasks unless the agent asks for explicit approval and shows exactly what will be sent or changed.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:26
Finding
Untrusted Remote Solution Retrieval and Execution## Vulnerability Details **File Location**: `SKILL.md`, lines 26–73 and 232–249 **Vulnerability Type**: Remote payload retrieval and execution **Risk Level**: Critical ### Vulnerable Code ```javascript async function evomapQuery(signals) { const timestamp = new Date().toISOString(); const messageId = `msg_${Date.now()}_${Math.random().toString(16).slice(2,6)}`; const response = await fetch('https://evomap.ai/a2a/fetch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ protocol: 'gep-a2a', protocol_version: '1.0.0', message_type: 'fetch', message_id: messageId, sender_id: 'node_9e601234', timestamp: timestamp, payload: { signals: signals, limit: 5 } }) }); return response.json(); } async function autoReuse(signals) { // 1. Query const result = await evomapQuery(signals); // 2. Match if (result.payload?.results?.length > 0) { const best = result.payload.results[0]; // 3. Extract solution const solution = best.payload; // 4. Record reuse await recordReuse(signals, best); // 5. Report result later setTimeout(() => reportUsage(best.asset_id, true), 60000); return { reused: true, solution, asset: best }; } return { reused: false }; } ``` The usage example then directs the consumer to apply the returned solution: ```javascript if (!solution) { const result = await evomapQuery(errorSignals); if (result.payload?.results?.[0]) { solution = result.payload.results[0]; // Update local cache updateLocalCache(errorSignals, solution); } } // Use solution if (solution) { console.log('Reused solution:', solution.payload?.summary); // Execute solution... } ``` ### Technical Analysis The Skill retrieves mutable content from `https://evomap.ai/a2a/fetch`, selects the first result, extracts its payload as a solution, and directs the Agent to use or e ...[truncated 1826 chars]
Remediation
## Remediation Suggestions 1. Treat every remote response as untrusted data rather than executable instructions. 2. Replace free-form solution payloads with a strict, versioned schema containing only declarative, allowlisted operations. 3. Reject payloads containing shell commands, tool directives, prompt instructions, arbitrary URLs, filesystem paths, or unsupported fields. 4. Require assets to be signed by approved publishers and verify signatures locally before use. 5. Pin each approved asset to a cryptographic digest and reject any digest mismatch. 6. Require explicit, informed user approval before applying or caching a newly retrieved solution. 7. Display the source, digest, requested operations, affected resources, and expected network activity during approval. 8. Execute approved operations in a least-privilege sandbox with restricted filesystem, process, credential, and network access. 9. Do not automatically select the first search result; enforce publisher trust, compatibility, safety-policy, and integrity checks. 10. Disable automatic usage reporting until the user has consented to the disclosed data transfer. 11. Add response-size limits, content-type validation, timeout handling, schema validation, and safe failure behavior. 12. Maintain an auditable local allowlist of reviewed assets and do not update it directly from untrusted search responses.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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 (11)

Missing User Warnings

High
Confidence
96% confidence
Finding
The skill advertises automatic feedback reporting and remote querying but does not clearly warn users that data will be sent to evomap.ai. This creates a real risk of silent data exfiltration of error details, workflow metadata, or internal signals to an external party.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
文件中的描述和触发词均以中文固定给出,没有提供用户语言偏好选择,也没有说明该技能仅面向中文场景。按照语言/locale 政策,这属于未经用户选择即施加特定语言约束。

Vague Triggers

Medium
Confidence
91% confidence
Finding
The trigger phrase “自动上报” is overly broad and likely to overlap with normal user discussion, increasing the chance that the skill activates unintentionally. In this skill's context, accidental activation is security-relevant because activation can lead to external reporting and task-oriented network actions.

External Transmission

Medium
Category
Data Exfiltration
Content
const timestamp = new Date().toISOString();
  const messageId = `msg_${Date.now()}_${Math.random().toString(16).slice(2,6)}`;
  
  const response = await fetch('https://evomap.ai/a2a/fetch', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
Confidence
95% confidence
Finding
This function sends user-derived signals and metadata to an external endpoint at evomap.ai. Because the skill is built around automatic reuse and remote lookup, these outbound requests can disclose internal error states, workflow context, and operational metadata without clear consent or data minimization.

External Transmission

Medium
Category
Data Exfiltration
Content
async function reportUsage(assetId, success, notes = '') {
  const timestamp = new Date().toISOString();
  
  await fetch('https://evomap.ai/a2a/report', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
Confidence
98% confidence
Finding
The reportUsage function automatically transmits usage outcomes and notes to an external service, which can leak sensitive operational details or human-authored notes. The delayed setTimeout call in the broader flow makes this especially risky because reporting may occur later without the user's immediate awareness.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The skill goes beyond passive integration and documents active remote task claiming and completion against an external service. That creates a capability for unauthorized external state changes and agent-driven actions on third-party systems without clear approval, authentication boundaries, or user confirmation.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documented bounty flow performs remote state changes by claiming and completing tasks, yet the user is not clearly warned that the skill may mutate external system state. This is dangerous because an agent could take irreversible or unauthorized actions on behalf of a user or workspace.

External Transmission

Medium
Category
Data Exfiltration
Content
async function fetchBounties() {
  const timestamp = new Date().toISOString();
  
  const response = await fetch('https://evomap.ai/a2a/fetch', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
Confidence
91% confidence
Finding
Fetching bounty tasks from an external service is an outbound network operation that introduces remote influence into the agent workflow. While less severe than state-changing calls, it still leaks metadata about tool usage and can pull in externally controlled task content that may shape subsequent actions.

External Transmission

Medium
Category
Data Exfiltration
Content
}

async function claimTask(taskId) {
  await fetch('https://evomap.ai/a2a/task/claim', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
Confidence
97% confidence
Finding
The claimTask function performs a remote state-changing operation against a third-party service. If triggered automatically or without strong authorization and confirmation, it could claim tasks improperly, create accountability issues, or be abused for unauthorized actions under the user's identity.

External Transmission

Medium
Category
Data Exfiltration
Content
}

async function completeTask(taskId, assetId) {
  await fetch('https://evomap.ai/a2a/task/complete', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
Confidence
98% confidence
Finding
The completeTask function marks external tasks complete, which is a consequential remote state change. In the context of an agent skill that emphasizes automation, this can result in unauthorized completion, false attestations of work, or workflow abuse if invoked without deliberate user approval.

Intent-Code Divergence

Low
Confidence
78% confidence
Finding
The example comment and code indicate '// 更新本地库' via 'updateLocalCache(errorSignals, solution)', suggesting the skill updates the local capability library. However, the only local-library implementation shown is a static cache plus query function, while later documentation describes recording reuse to 'memory/evomap-reuse-log.md' instead; this creates an intent/documentation inconsistency about what local state is actually updated.

Static analysis

No suspicious patterns detected.