Back to skill

Security audit

site-memory

Security checks for vulnerabilities and agentic risk

Overview

This skill is not clearly malicious, but it combines global persistent browser memory with powerful live Chrome control that can read or change logged-in pages.

Install only if you are comfortable giving the agent durable cross-project browser memory and optional control over a live, logged-in Chrome session. Use a separate low-sensitivity browser profile, keep SITE_MEMORY_HOME scoped per project when possible, review notes before reuse, and avoid storing secrets, personal data, session state, or instructions copied from webpages.

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 (2)

T02 · Agent Memory Poisoning

Error
Location
scripts/memory-phrasing.mjs:132
Finding

Persistent Prompt Injection Through Globally Shared Browser Memory

Content
View full analysis
0 ? `## ${INDEX_FILE}\n\n${indexContent.trim()}` : `## ${INDEX_FILE}\n\nThe index is currently empty. New durable notes will appear here after they are written.`; return `# Persistent Browser Memory You have a reusable note directory at \`${runtimeRoot}\`. Use it as a two-part loop for repeated browser work: - look up a few strong leads before exploring - write back durable findings after the task ${NOTE_TYPE_GUIDE} ${DO_NOT_SAVE} ${saveInstructions(skipIndex)} ${WHEN_TO_RECALL} ${VERIFY_BEFORE_USE} ${indexSection}`; } ``` `scripts/build-recall-input.mjs:14-27`: ```js const manifestText = formatManifest(manifestEntries); const index = readIndex(context.memoryRoot); const recentToolsText = recentTools.length > 0 ? `\n\nRecently used tools: ${recentTools.join(', ')}` : ''; const policyPrompt = buildMemoryPolicy({ runtimeRoot: context.memoryRoot, indexContent: index.content, }); const selectorUserPrompt = `Task: ${task}\n\nAvailable notes:\n${manifestText}${recentToolsText}`; ``` `scripts/memory-core.mjs:260-274`: ```js export function readSelectedNotes(memoryRoot, selectedPaths) { return selectedPaths.map(relativePath => { const absolutePath = resolveMemoryPath(memoryRoot, relativePath); const stats = statSync(absolutePath); const raw = readFileSync(absolutePath, 'utf8'); const truncated = truncateSurfacedContent(raw); return { relativePath: relative(memoryRoot, absolutePath).replace(/\\/g, '/'), absolutePath, ...[truncated 3267 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/memory-core.mjs:217
Finding

Memory-Root Containment Check Can Be Bypassed With Symbolic Links

Content
View full analysis
{ const absolutePath = resolveMemoryPath(memoryRoot, relativePath); const stats = statSync(absolutePath); const raw = readFileSync(absolutePath, 'utf8'); const truncated = truncateSurfacedContent(raw); return { relativePath: relative(memoryRoot, absolutePath).replace(/\\/g, '/'), absolutePath, modifiedAtMs: stats.mtimeMs, header: `Loaded note (${formatAge(stats.mtimeMs)}): ${absolutePath}:`, content: truncated.content, truncated: truncated.truncated, }; }); } ``` ### Technical Analysis `resolveMemoryPath` performs lexical containment validation. It normalizes the requested path and verifies that the resulting string starts with the normalized memory-root prefix. This blocks ordinary `../` traversal but does not account for symbolic links. Both `statSync` and `readFileSync` follow symbolic links. A path can therefore be lexically located under the memory root while its resolved filesystem target is outside that directory. The reader also does not require s ...[truncated 1837 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (18)

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

Allowing SITE_MEMORY_CDP_SCRIPT to override the target script path enables arbitrary script execution under the current process's privileges. Because this is a persistent-memory skill, accepting an environment-controlled executable path is unjustified and especially dangerous: any actor who can influence the environment can redirect the skill to malicious code while preserving the appearance of legitimate behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest explicitly advertises access to a live Chrome session and existing open tabs, but it provides no warning that this may expose highly sensitive information such as authenticated sessions, personal content, internal tools, or cross-site browsing data. In the context of a persistent browser-oriented skill ecosystem, this omission is especially risky because an agent may invoke the skill without the user appreciating the privacy and security consequences.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The eval command executes arbitrary JavaScript in the current page context via Runtime.evaluate. This enables extraction of page contents, form data, tokens accessible to page scripts, and arbitrary page-side actions, which is substantially more powerful than a memory helper and can be used for surveillance or manipulation of authenticated sessions.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The evalraw command allows arbitrary Chrome DevTools Protocol methods to be invoked against a live browser session. This effectively exposes a low-level browser control backdoor, enabling actions well beyond memory use, including page inspection, modification, input simulation, and access to sensitive browser/session data depending on available CDP methods.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The exposed CLI functionality is materially broader than the declared 'site-memory' purpose: it supports full browser automation, DOM/HTML extraction, screenshots, navigation, clicking, typing, tab creation, and daemonized control. That capability mismatch is dangerous because reviewers or users may grant the skill broader trust than intended, enabling covert browsing control and data access under misleading packaging.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
87% confidence
Finding

Persistent write-back of reusable lessons creates durable session persistence, which can be useful but also dangerous when the stored content may later influence unrelated tasks. In this skill, that danger is elevated by the global shared memory model, making poisoning, stale guidance reuse, and accidental retention of sensitive workflow details more likely.

Content

Scanner excerpt · SKILL.md (reported line 16)May include surrounding context.

md
Its job is intentionally narrow:

- load a small number of high-value notes before acting
- write back reusable lessons after the task completes

It does not define business schemas. It does not own the browser driver.
Pair it with whatever browser control tool you already trust.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documentation says the skill does not own the browser driver, then later instructs use of its bundled browser control proxy. This inconsistency can mislead reviewers and agents about trust boundaries, making it easier to smuggle higher-risk browser automation into a skill that appears limited to note management.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill states that memory is global and shared across all projects, which creates a clear risk of cross-project data mixing, privacy leakage, and accidental reuse of sensitive operational details. In a browser-automation context, notes can easily capture internal URLs, selectors tied to private apps, workflow constraints, or other information that should not automatically propagate between unrelated tasks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill mandates execution of a generated prompt from build-distill-input.mjs without requiring user review or policy checks. Treating generated prompts as mandatory follow-on instructions creates a prompt-injection style trust chain where unreviewed content can influence file reads and writes inside persistent memory, enabling poisoning of future runs.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill is presented as persistent site memory, but later expands into full browser control via a bundled CDP proxy. That scope expansion can cause an agent or operator to grant broader capabilities than expected, increasing the chance of unintended navigation, page interaction, or data access under the guise of a memory utility.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

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.

Content

Scanner excerpt · SKILL.md (reported line 118)May include surrounding context.

Read its instructions before first use:

bash
cat ./vendor/chrome-cdp-skill/skills/chrome-cdp/SKILL.md

Use node ./scripts/cdp-proxy.mjs <command> [args] for browser interaction.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script launches a separate Node process to execute an external Chrome CDP helper, which expands the skill's capabilities from site-memory persistence into browser automation/external code execution. In isolation subprocess execution is not always unsafe, but in this skill context it is unnecessary and increases the attack surface by delegating behavior to another script outside the file's direct control.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README explicitly promotes connecting an agent to a live Chrome session with existing logged-in accounts and current page state, but it does not prominently warn that this grants access to highly sensitive authenticated data and active workflows. In an agent-skill context, this omission is dangerous because users may enable the capability without understanding that the agent can read private content, session-protected pages, and in-progress work across tabs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The documented commands include navigation, clicking, typing, opening tabs, evaluating JavaScript, and raw CDP passthrough against a live browser session, all of which can alter state, submit forms, trigger transactions, or execute arbitrary page-context actions. Without an explicit warning about destructive or side-effecting operations, users may treat the tool as observational when it is effectively a powerful live-control interface over authenticated browser activity.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The package description is broad enough to encourage invocation whenever browser access seems useful, but it does not state clear limits, preconditions, or user-consent requirements. For a skill that can attach to an already-running Chrome session, this increases the chance of unnecessary use and unintended access to sensitive browsing context, cookies, tabs, or page data.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

These commands provide active browser manipulation, including navigation, clicking, typing, screenshot capture, and opening tabs. In the context of a purported memory skill, such capabilities expand the attack surface from passive note handling to direct control of authenticated browsing flows, which can trigger unintended actions or exfiltrate visible/sensitive information.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This code creates the runtime memory directory and initializes an index file with writeFileSync, which changes the user's filesystem. In this file there is no confirmation prompt, user-facing log/print, or explanatory comment/docstring disclosing that the skill will create files under the configured memory root.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/cdp-proxy.mjs:28

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
vendor/chrome-cdp-skill/skills/chrome-cdp/scripts/cdp.mjs:631