Back to skill

Security audit

aidenote-skill

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real AideNote/SlonAide note assistant, but its remote bridge setup can run unverified downloaded installer code, pass secrets into it, and create login persistence.

Install only if you trust the publisher and are comfortable with a persistent local bridge. Before using slonaide_setup_remote_bridge, review the installer source and URLs, avoid running it in an environment containing unrelated secrets, rotate the AideNote API key if exposed in logs, and prefer a version that verifies installer hashes or signatures and provides a clear uninstall path.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (4)

T03 · Remote Payload Retrieval and Execution

Error
Location
src/bridge.js:54
Finding

Unverified Remote Installer Download and Execution

Content
View full analysis

Vulnerability Details

File Location: src/bridge.js:54-69 and src/bridge.js:135-144
Vulnerability Type: Remote payload retrieval and execution
Risk Level: Critical

Vulnerable Code

js
const config = getConfig();
const installerUrl = installerUrlForPlatform(config);
const installer = await downloadInstaller(installerUrl, installerFileName());
const env = {
  ...process.env,
  AIDE_NOTE_API_KEY: config.apiKey,
  AIDE_NOTE_RELAY_HOST: config.bridgeRelayHost || 'api.aidenote.cn',
  AIDE_NOTE_TUNNEL_BASE_URL:
    config.bridgeTunnelBaseUrl || 'https://cdn.aidenote.cn/tunnel',
  // Note: AIDE_NOTE_TOKEN_ENDPOINT is intentionally not passed.
  OPENCLAW_LOCAL_PORT: String(config.openClawLocalPort || 18789)
};

const output = await run(installerCommand(), installerArgs(installer), {
  env,
  timeout: 120000
});
js
async function downloadInstaller(url, fileName) {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`Failed to download installer: HTTP ${response.status}`);
  }
  const script = await response.text();
  const dir = await mkdtemp(join(tmpdir(), 'aidenote-openclaw-'));
  const file = join(dir, fileName);
  await writeFile(file, script, { mode: 0o700 });
  return file;
}

The downloaded file is subsequently executed using either Bash or PowerShell:

js
function installerCommand() {
  return process.platform === 'win32' ? 'powershell.exe' : 'bash';
}

function installerArgs(installer) {
  if (process.platform === 'win32') {
    return ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', installer];
  }
  return [installer];
}

Technical Analysis

The bridge setup tool downloads executable script content from a remote URL and immediately runs it. The code does not verify a cryptographic digest, digital signature, pinned version, or expected content. The installer URL is also configurable, wi ...[truncated 1465 chars]

Remediation
View remediation

Remediation Suggestions

  • Bundle the installer with the Skill so that the executed code is included in security review.
  • If remote retrieval is unavoidable, use immutable, versioned URLs and verify a hard-coded SHA-256 or stronger digest before execution.
  • Prefer a publisher signature verified against a pinned public key.
  • Require HTTPS and enforce an exact allowlist of trusted schemes, hosts, ports, and paths.
  • Reject redirects to untrusted origins.
  • Remove PowerShell -ExecutionPolicy Bypass.
  • Display the verified installer version and obtain explicit user confirmation before execution.
  • Run installation with the lowest possible privileges and in a restricted environment.
  • Clean up temporary installer files after use.

T09 · Insecure Skill Coding Practices

Error
Location
src/bridge.js:54
Finding

API Key and Parent Environment Exposed to an Unverified Installer

Content
View full analysis

Vulnerability Details

File Location: src/bridge.js:54-69
Vulnerability Type: Sensitive credential exposure
Risk Level: High

Vulnerable Code

js
const config = getConfig();
const installerUrl = installerUrlForPlatform(config);
const installer = await downloadInstaller(installerUrl, installerFileName());
const env = {
  ...process.env,
  AIDE_NOTE_API_KEY: config.apiKey,
  AIDE_NOTE_RELAY_HOST: config.bridgeRelayHost || 'api.aidenote.cn',
  AIDE_NOTE_TUNNEL_BASE_URL:
    config.bridgeTunnelBaseUrl || 'https://cdn.aidenote.cn/tunnel',
  // Note: AIDE_NOTE_TOKEN_ENDPOINT is intentionally not passed.
  OPENCLAW_LOCAL_PORT: String(config.openClawLocalPort || 18789)
};

const output = await run(installerCommand(), installerArgs(installer), {
  env,
  timeout: 120000
});

Technical Analysis

The plugin explicitly provides the user's AideNote API key to the downloaded installer through AIDE_NOTE_API_KEY. It also spreads the complete parent process environment into the child environment.

Because the installer is remotely downloaded without integrity or authenticity verification, it must be treated as untrusted. It can read the API key and every inherited environment variable. The inherited environment may contain unrelated API tokens, cloud credentials, proxy credentials, deployment secrets, or service configuration.

Providing the entire parent environment exceeds the minimum privileges needed to install a bridge. Even a legitimate installer should receive only narrowly scoped, non-secret values unless secure credential provisioning is strictly necessary.

Attack Path

  1. An attacker controls or modifies the remote installer response.
  2. The setup tool downloads and executes the modified script.
  3. The script reads AIDE_NOTE_API_KEY and enumerates all inherited environment variables.
  4. It sends those values to an attacker-controlled endpoint or stores them for later a ...[truncated 507 chars]
Remediation
View remediation

Remediation Suggestions

  • Do not provide credentials to code downloaded at runtime.
  • Authenticate the installer before execution using both a pinned signature and an immutable version.
  • Construct a minimal child environment instead of spreading process.env.
  • Pass only essential non-secret variables such as the local port.
  • Provision bridge credentials after installation through a separate, trusted component.
  • Store credentials using the operating system's credential manager or another protected secret store.
  • Use short-lived, bridge-specific tokens with narrowly scoped permissions instead of the primary API key.
  • Ensure child-process output and error messages cannot reveal secret values.
  • Rotate API keys that may already have been exposed to installer scripts.

T06 · System Persistence

Error
Location
src/bridge.js:145
Finding

Remote Installer Establishes Cross-Session Login Persistence

Content
View full analysis

Vulnerability Details

File Location: src/bridge.js:145-168
Vulnerability Type: Persistent startup service installation
Risk Level: High

Vulnerable Code

js
async function bridgeStatus() {
  if (process.platform === 'win32') {
    const script =
      `$task = Get-ScheduledTask -TaskName '${WINDOWS_TASK_NAME}' -ErrorAction SilentlyContinue; ` +
      `$proc = Get-Process aide-note-tunnel -ErrorAction SilentlyContinue | Select-Object -First 1; ` +
      `if ($task) { $task | Format-List TaskName,State | Out-String } else { 'Task not found' }; ` +
      `if ($proc) { $proc | Format-List Id,ProcessName,StartTime | Out-String } else { 'Process not running' }`;
    const output = await run(
      'powershell.exe',
      ['-NoProfile', '-Command', script],
      { timeout: 10000, rejectOnExit: false }
    );
    const running = /State\s*:\s*Running|ProcessName\s*:\s*aide-note-tunnel/i.test(output);
    return { running, output };
  }

  const output = await run('launchctl', ['print', `gui/${process.getuid()}/${MAC_LABEL}`], {
    timeout: 10000,
    rejectOnExit: false
  });
  const running = /state = running|pid = \d+/.test(output);
  return { running, output };
}

The documentation confirms that bridge installation registers login persistence:

text
This tool installs aide-note-tunnel on macOS or Windows, writes
.aidenote/openclaw-tunnel.json, and registers a login startup service.

Technical Analysis

The declared bridge workflow creates either a Windows scheduled task named AideNoteOpenClawBridge or a macOS LaunchAgent identified as cn.aidenote.openclaw-tunnel. This causes the tunnel to start automatically in later login sessions.

Persistent startup may be functionally related to a remote bridge, but the service is installed by remote code that is not included in the project and is not cryptographically verified. Therefore, the audit cannot validate ...[truncated 1363 chars]

Remediation
View remediation

Remediation Suggestions

  • Make persistence an explicit, separate, opt-in step with clear disclosure before installation.
  • Include the complete installer and service definitions in the Skill package for review.
  • Pin and cryptographically verify the tunnel binary and all service files.
  • Use least-privilege, per-user service configuration and avoid administrator privileges.
  • Bind the local gateway connection to loopback and require strong mutual authentication.
  • Restrict relay destinations to validated, trusted endpoints.
  • Provide a first-class uninstall command that stops the process and removes the scheduled task or LaunchAgent, configuration files, credentials, and binary.
  • Show the exact executable, arguments, network destination, and persistence changes before requesting confirmation.
  • Disable unattended self-update unless every update is signature-verified.

T09 · Insecure Skill Coding Practices

Warning
Location
src/tools.js:20
Finding

API Key Embedded in Authentication URL with Configurable Destination

Content
View full analysis

Vulnerability Details

File Location: src/tools.js:20-40; secondary occurrence at scripts/test_api.py:14-25
Vulnerability Type: Credential disclosure through URL paths and unrestricted endpoint configuration
Risk Level: Medium

Vulnerable Code

js
async function getToken() {
  if (cachedToken && tokenExpiry && Date.now() < tokenExpiry) {
    return cachedToken;
  }

  const config = initConfig();
  const apiKey = config.apiKey;
  const baseUrl = config.baseUrl || 'https://api.aidenote.cn';

  if (!apiKey) {
    throw new Error('SlonAide API Key is not configured.');
  }

  try {
    const response = await axios.post(
      `${baseUrl}/api/UserapikeyMstr/GetToken/${apiKey}`,
      {},
      {
        headers: { 'Content-Type': 'application/json' },
        timeout: 10000
      }
    );

The test script uses the same authentication design:

python
base_url = "https://api.aidenote.cn"
token_url = f"{base_url}/api/UserapikeyMstr/GetToken/{api_key}"

try:
    response = requests.post(
        token_url,
        headers={'Content-Type': 'application/json'},
        timeout=10
    )

Technical Analysis

The network request identified by the static pre-scan is necessary to test authentication against the declared AideNote service. However, the API key is embedded directly in the URL path. URLs are commonly retained in reverse-proxy access logs, application logs, monitoring systems, error reports, browser or client diagnostics, and network-security products. HTTPS protects transport contents in transit but does not prevent endpoints and authorized intermediaries from logging the URL.

In the plugin implementation, baseUrl is configurable and is not validated for scheme, hostname, port, user information, or destination. If plugin configuration is altered, invoking any authenticated tool sends the API key to the configured endpoint as part of the reque ...[truncated 1229 chars]

Remediation
View remediation

Remediation Suggestions

  • Redesign authentication so the API key is sent in an authorization header or request body rather than the URL.
  • Use a standard scheme such as Authorization: Bearer or a dedicated secret header, as supported by the service.
  • Enforce HTTPS for every configured endpoint.
  • Validate baseUrl against an exact allowlist of trusted hostnames, ports, and path prefixes.
  • Reject embedded credentials, non-HTTPS schemes, unexpected ports, and redirects to different origins.
  • Configure server and proxy logging to redact authentication paths during migration.
  • Ensure error messages and telemetry never include complete request URLs containing secrets.
  • Rotate API keys that may have been retained in historical access logs.
  • Apply the same authentication redesign to scripts/test_api.py.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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 (37)

Context-Inappropriate Capability

Critical
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code fetches an installer script from a remote URL and executes it with bash or PowerShell, which is equivalent to arbitrary code execution under the current user. Because the payload is not pinned, verified, or bundled, compromise of the CDN, configuration, or update path can directly lead to full host compromise and persistence.

Content

No source excerpt is available for this finding.

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose omits that the skill depends on external API authentication and remote data access, while also not actually implementing some claimed AI/knowledge-base features. This creates a transparency problem around what data leaves the environment and what the tool really does, which is important for privacy-sensitive note content.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The documented purpose omits that the skill depends on external API authentication and remote data access, while also not actually implementing some claimed AI/knowledge-base features. This creates a transparency problem around what data leaves the environment and what the tool really does, which is important for privacy-sensitive note content.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose omits that the skill depends on external API authentication and remote data access, while also not actually implementing some claimed AI/knowledge-base features. This creates a transparency problem around what data leaves the environment and what the tool really does, which is important for privacy-sensitive note content.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The documented purpose omits that the skill depends on external API authentication and remote data access, while also not actually implementing some claimed AI/knowledge-base features. This creates a transparency problem around what data leaves the environment and what the tool really does, which is important for privacy-sensitive note content.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

This skill exposes tooling to install and start a remote bridge service that is outside the narrow scope of a recording/transcription assistant. Adding persistence-capable bridge setup materially expands the trust boundary and creates a path to alter host state and enable remote connectivity from a skill users would not reasonably expect to perform system-level setup.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The tool performs a host-modifying action—downloading and executing an installer—immediately when invoked, without a user-facing warning, confirmation, or explanation of persistence and remote access implications. This makes accidental or socially engineered execution much more likely and hides a high-risk action behind an innocuous assistant workflow.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill probes launchctl, Scheduled Tasks, and process state to inspect a background bridge service, which grants the skill awareness and management of system services beyond its stated purpose. In context, this increases the capability footprint and can be used to validate or support persistence-oriented behavior on the host.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The connection-test tool includes user-visible output that reveals part of the API key and part of the bearer token. Even partial credential disclosure is unnecessary for the tool's function and can leak secrets into chat logs, telemetry, screenshots, or downstream tools, increasing the risk of credential compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

This finding is valid because the tool prints a masked API key and a token prefix directly into normal output without any safety boundary. In an agent setting, that output may be retained in conversation history or exposed to other components, making credential harvesting materially easier.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

The README instructs users to run npx clawhub install slonaide without pinning a specific package version. This can cause users to fetch and execute whatever version is currently published at install time, increasing supply-chain risk if the package is updated maliciously or compromised.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README states that the remote bridge will auto-start on login, but it does not present this as a prominent security warning before installation. A login-persistent bridge expands the local attack surface and may create ongoing remote connectivity, so users need explicit informed consent before running the setup command.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding

The skill documents capabilities that imply environment access, local file reads, and network use, but it does not declare any explicit tool scope or permissions. This weakens least-privilege controls and makes it harder for users or the platform to understand and constrain what the skill can access, especially given its bridge-installation and configuration behaviors.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Using npx clawhub install slonaide without a pinned version allows whatever package version is current at execution time to be fetched and run. This creates a supply-chain risk where a malicious or compromised upstream package, or an unexpected breaking update, could execute arbitrary code on the user's system.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The remote bridge installation changes the host by installing aide-note-tunnel, writing configuration, and enabling auto-start persistence, but the initial quick-start flow does not present a strong upfront warning about these persistent system modifications. For a skill centered on note management, this substantially increases risk because users may trigger host-level changes without appreciating the security implications.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% confidence
Finding

The documented use of a LaunchAgent plist indicates the bridge runs persistently across user sessions. Persistence is not inherently malicious, but in this skill it supports an externally connected tunnel/bridge, so compromised configuration or unintended exposure could provide lasting access to the local OpenClaw gateway.

Content

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

md
> tunnel disconnected: auth rejected: invalid token
> ```
>
> **解决方法:** 编辑 `~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist`,
> 删除 `--token-endpoint` 及其后面的 URL 参数行,然后重启服务:
> ```bash
> launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% confidence
Finding

The instructions to manage ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist confirm the skill relies on login persistence for the remote tunnel. Because the tunnel is intended to bridge into the local host, persistent background execution materially raises the impact of misconfiguration, abuse, or upstream compromise.

Content

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

md
> **解决方法:** 编辑 `~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist`,
> 删除 `--token-endpoint` 及其后面的 URL 参数行,然后重启服务:
> ```bash
> launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist
> launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist
> ```

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% confidence
Finding

The launchctl bootstrap instruction shows the bridge service is actively registered for persistent execution, not just run once. In the context of a notes assistant, persistent remote-bridge infrastructure is more dangerous because it extends host exposure beyond the immediate task and can survive session boundaries.

Content

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

md
> 删除 `--token-endpoint` 及其后面的 URL 参数行,然后重启服务:
> ```bash
> launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist
> launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/cn.aidenote.openclaw-tunnel.plist
> ```

### 6. 检查 bridge 状态

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest advertises a recording/note assistant but also exposes remote bridge installation, tunnel download, and relay configuration that are outside the core user-expected scope. This capability expansion increases attack surface and can enable remote access or code delivery paths that users may not reasonably anticipate from a transcription plugin.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest includes URLs for downloading and executing platform-specific installer scripts and configuring a relay/tunnel, which is a sensitive capability for a note-taking assistant. Even at manifest level, this signals the plugin may bootstrap remote-access components, creating risk of arbitrary code execution, persistence, or outbound tunneling if the referenced resources are compromised or misused.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

All user-facing docstrings and printed messages in the script are in Chinese, including status, instructions, and next steps. For a general-purpose configuration checker, this imposes a specific language on users without opt-in, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest describes an assistant for recording note management, transcription, summarization, knowledge-base management, and semantic search. This script adds a separate capability to inspect process environment variables for secrets, which is administrative/configuration introspection rather than an obvious part of the end-user skill purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script prints part of the bearer token returned by the authentication API to stdout. Even partial credential disclosure increases the chance of token leakage through terminal history, logs, screenshots, CI output, or shared support sessions, and this skill handles authenticated access to user notes so exposed credentials can aid unauthorized access.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/test_api.py (reported line 56)May include surrounding context.

python
}
    
    try:
        response = requests.post(list_url, headers=headers, json=payload, timeout=10)
        data = response.json()
        
        if data.get("code") == 200:

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/bridge.js:173

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/bridge.js:57