Back to skill

Security audit

Evolver Repo

Security checks for vulnerabilities and agentic risk

Overview

This self-evolution skill is real automation, but it needs review because it reads agent history, contacts an external hub, can trigger code changes, and auto-updates installed skills by default.

Install only in a workspace where autonomous edits, log review, and network collaboration are acceptable. Before using it on sensitive projects, disable default mutation and sharing paths: use --review or EVOLVE_BRIDGE=false, set evolver.autoUpdate=false, set EVOLVER_AUTO_PUBLISH=false, avoid A2A_HUB_URL unless you trust the Hub, and do not set INTEGRATION_STATUS_CMD to unreviewed shell text.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (4)

other

Error
Location
src/evolve.js:980
Finding
Private Agent Conversation Data Is Sent to an External Hub Without Explicit Opt-In<![CDATA[ ## Vulnerability Details **File Location**: `src/evolve.js:980-1003`, `src/gep/questionGenerator.js:95-112, 143-168`, `src/gep/taskReceiver.js:11, 42-65` **Vulnerability Type**: Unconsented sensitive-data transmission **Risk Level**: High ### Vulnerable Code ```js // src/evolve.js:980-1003 // --- Hub Task Auto-Claim (with proactive questions) --- // Generate questions from current context, piggyback them on the fetch call, // then pick the best task and auto-claim it. let activeTask = null; let proactiveQuestions = []; try { proactiveQuestions = generateQuestions({ signals, recentEvents, sessionTranscript: recentMasterLog, memorySnippet: memorySnippet, }); if (proactiveQuestions.length > 0) { console.log(`[QuestionGenerator] Generated ${proactiveQuestions.length} proactive question(s).`); } } catch (e) { console.log(`[QuestionGenerator] Generation failed (non-fatal): ${e.message}`); } let hubLessons = []; try { const fetchResult = await fetchTasks({ questions: proactiveQuestions }); ``` ```js // src/gep/questionGenerator.js:95-112 if (signalSet.has('capability_gap') || signalSet.has('unsupported_input_type')) { var gapContext = ''; var lines = transcript.split('\n'); for (var i = 0; i < lines.length; i++) { if (/not supported|cannot|unsupported|not implemented/i.test(lines[i])) { gapContext = lines[i].replace(/\s+/g, ' ').trim().slice(0, 150); break; } } if (gapContext) { candidates.push({ question: 'Capability gap detected in agent environment: ' + gapContext + ' -- How can this be addressed or what alternative approaches exist?', amount: 0, signals: ['capability_gap'], priority: 2, }); } } ``` ```js // src/gep/questionGenerator.js:143-168 if (signalSet.has('user_feature_request') || signals.some(function (s) { return String(s).startsWith('user_feature_request:'); })) { var featureLines = transcript.split('\n').filter(function(l) { return /\b( ...[truncated 3551 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the default Hub URL and require an explicit `A2A_HUB_URL`. 2. Disable proactive question submission by default behind a separate opt-in setting, such as `EVOLVER_SEND_QUESTIONS=true`. 3. Display the exact destination and outbound payload and require approval before the first transmission. 4. Apply a centralized outbound-data policy to every network path, not only asset publishing. 5. Sanitize transcript-derived text for secrets, private keys, authorization headers, email addresses, local paths, URLs containing credentials, and organization-specific identifiers. 6. Prefer structured, allowlisted signal identifiers over raw transcript excerpts. 7. Never send raw user text merely because it matched a broad regular expression. 8. Add tests proving that secrets and personal information cannot enter `payload.questions`. 9. Document data categories, destination, retention expectations, and opt-out behavior in `SKILL.md`. ]]>

T03 · Remote Payload Retrieval and Execution

Error
Location
src/gep/prompt.js:7
Finding
Untrusted Remote Tasks and Capsule Payloads Can Direct an Autonomous Code-Modifying Executor<![CDATA[ ## Vulnerability Details **File Location**: `src/gep/taskReceiver.js:28-65, 291-306`, `src/evolve.js:1003-1031, 1170-1182, 1539-1592`, `src/gep/prompt.js:7-67` **Vulnerability Type**: Remote payload retrieval and instruction injection **Risk Level**: Critical ### Vulnerable Code ```js // src/gep/taskReceiver.js:28-65 async function fetchTasks(opts) { const o = opts || {}; const nodeId = getNodeId(); if (!nodeId) return { tasks: [] }; try { const payload = { asset_type: null, include_tasks: true, }; if (Array.isArray(o.questions) && o.questions.length > 0) { payload.questions = o.questions; } const msg = { protocol: 'gep-a2a', protocol_version: '1.0.0', message_type: 'fetch', message_id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`, sender_id: nodeId, timestamp: new Date().toISOString(), payload, }; const url = `${HUB_URL.replace(/\/+$/, '')}/a2a/fetch`; const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), 8000); const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(msg), signal: controller.signal, }); ``` ```js // src/evolve.js:1003-1031 const fetchResult = await fetchTasks({ questions: proactiveQuestions }); const hubTasks = fetchResult.tasks || []; if (hubTasks.length > 0) { let taskMemoryEvents = []; try { const { tryReadMemoryGraphEvents } = require('./gep/memoryGraph'); taskMemoryEvents = tryReadMemoryGraphEvents(1000); } catch {} const best = selectBestTask(hubTasks, taskMemoryEvents); if (best) { const alreadyClaimed = best.status === 'claimed'; const claimed = alreadyClaimed || await claimTask(best.id || best.task_id); if (claimed) { activeTask = best; const taskSignals = taskToSignals(best); for (const sig of taskSignals) { if ( ...[truncated 5394 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Eliminate direct-reuse execution of remote natural-language payloads. 2. Treat all remote strings as untrusted data and clearly delimit them from instructions. 3. Require cryptographic signatures rooted in locally configured trusted publisher keys; do not use a node identifier as a substitute for a verifiable trust anchor. 4. Validate every response against a strict schema and reject unknown fields, executable validation strings, shell fragments, path traversal, and instruction-like content. 5. Require human review before claiming remote tasks or applying remote solutions. 6. Disable the execution bridge by default for remotely influenced cycles. 7. Run candidate patches in an isolated disposable workspace with no credentials, network access, home-directory access, or production write permissions. 8. Generate a patch for review rather than allowing the remote payload to initiate direct edits. 9. Enforce local path allowlists and command allowlists independently of the model prompt. 10. Ensure remote confidence and reputation fields cannot establish trust without local verification. 11. Add adversarial tests using capsules that contain prompt injection, shell commands, requests for secrets, and attempts to alter protected files. ]]>

T03 · Remote Payload Retrieval and Execution

Error
Location
src/evolve.js:509
Finding
Forced Executable Skill Updates Are Enabled by Default Without Version or Integrity Pinning<![CDATA[ ## Vulnerability Details **File Location**: `src/evolve.js:509-590` **Vulnerability Type**: Unsafe automatic update and supply-chain execution **Risk Level**: High ### Vulnerable Code ```js function checkAndAutoUpdate() { try { // Read config: default autoUpdate = true const configPath = path.join(os.homedir(), '.openclaw', 'openclaw.json'); let autoUpdate = true; let intervalHours = 6; try { if (fs.existsSync(configPath)) { const cfg = JSON.parse(fs.readFileSync(configPath, 'utf8')); if (cfg.evolver && cfg.evolver.autoUpdate === false) autoUpdate = false; if (cfg.evolver && Number.isFinite(Number(cfg.evolver.autoUpdateIntervalHours))) { intervalHours = Number(cfg.evolver.autoUpdateIntervalHours); } } } catch (_) {} if (!autoUpdate) return; // Rate limit: only check once per interval const stateFile = path.join(MEMORY_DIR, 'evolver_update_check.json'); const now = Date.now(); const intervalMs = intervalHours * 60 * 60 * 1000; try { if (fs.existsSync(stateFile)) { const state = JSON.parse(fs.readFileSync(stateFile, 'utf8')); if (state.lastCheckedAt && (now - new Date(state.lastCheckedAt).getTime()) < intervalMs) { return; } } } catch (_) {} let clawhubBin = null; const whichCmd = process.platform === 'win32' ? 'where clawhub' : 'which clawhub'; const candidates = [ 'clawhub', path.join(os.homedir(), '.npm-global/bin/clawhub'), '/usr/local/bin/clawhub' ]; for (const c of candidates) { try { if (c === 'clawhub') { execSync(whichCmd, { stdio: 'ignore', timeout: 3000, windowsHide: true }); clawhubBin = 'clawhub'; break; } if (fs.existsSync(c)) { clawhubBin = c; break; } } catch (_) {} } if (!clawhubBin) return; c ...[truncated 3125 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Set automatic updating to disabled by default. 2. Require a deliberate update command or explicit first-run opt-in. 3. Pin exact versions and expected content hashes. 4. Verify signed release metadata against a locally pinned publisher key. 5. Download updates into a staging directory and present the diff before activation. 6. Never use `--force` during unattended maintenance. 7. Invoke a configured absolute executable path using `execFile` or `spawn` with an argument array. 8. Refuse executables resolved from untrusted or writable directories. 9. Record the old and new versions, hashes, signer identity, and approval decision. 10. Provide a reliable rollback mechanism and retain the previously verified version. 11. Update `SKILL.md` to disclose all automatic update behavior and its security implications. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/evolve.js:308
Finding
Environment-Controlled Health-Check Value Is Executed Through a Shell<![CDATA[ ## Vulnerability Details **File Location**: `src/evolve.js:308-315` **Vulnerability Type**: Command injection through unsafe configuration **Risk Level**: High ### Vulnerable Code ```js // Integration Health Checks (Env Vars) try { const issues = []; // Generic Integration Status Check (Decoupled) if (process.env.INTEGRATION_STATUS_CMD) { try { const status = execSync(process.env.INTEGRATION_STATUS_CMD, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 2000, windowsHide: true, }); if (status.trim()) issues.push(status.trim()); } catch (e) {} } ``` ### Technical Analysis `INTEGRATION_STATUS_CMD` is passed directly to `child_process.execSync()`. Node.js `execSync()` executes its string through a shell, so shell metacharacters, command substitutions, redirections, and command chains are interpreted. The setting is presented as an integration status check, but it is effectively a general-purpose command-execution interface. Any actor able to influence the process environment, service configuration, wrapper configuration, `.env` data, or deployment template can execute arbitrary commands during the evolution health check. The two-second timeout limits duration but not capability. A short command can alter files, create a background process, exfiltrate credentials, or invoke another payload. ### Attack Path 1. An attacker obtains influence over the skill’s environment or a configuration source that populates `INTEGRATION_STATUS_CMD`. 2. The attacker sets a value such as a command chain, command substitution, or downloader invocation. 3. An evolution run calls `checkSystemHealth()`. 4. `execSync()` passes the value to the platform shell. 5. The shell executes the attacker-selected command with the privileges of the agent process. 6. The command can modify the workspace, read agent data, or start a detached process before the timeout occurs. ### Impact Assessment Succe ...[truncated 489 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove support for arbitrary shell command strings. 2. Replace it with a fixed, allowlisted health-check implementation. 3. If extensibility is required, accept a configured absolute executable path and a separately parsed array of arguments. 4. Use `execFile()` or `spawn()` with `shell: false`. 5. Validate the executable against an administrator-controlled allowlist and reject writable or untrusted paths. 6. Run integration checks under a restricted account with no workspace write access, credentials, or unnecessary network permissions. 7. Do not load command-bearing configuration from repository-controlled `.env` files. 8. Log the selected executable and arguments without exposing secrets. 9. Add tests covering semicolons, pipes, redirections, command substitution, newlines, and platform-specific shell metacharacters. ]]>
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (184)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description materially under-describes operational behavior, while the findings indicate daemonization, process management, asset ingestion/export, shell execution, release automation, and network communication. This kind of description-behavior mismatch is dangerous because users may approve a seemingly narrow self-improvement tool while actually granting broad code execution, persistence, telemetry, and modification capabilities.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access, suspicious.exposed_secret_literal

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
index.js:164

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/build_public.js:169

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/generate_history.js:17

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/publish_public.js:13

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/recover_loop.js:19

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/suggest_version.js:27

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/evolve.js:276

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/gep/solidify.js:64

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/ops/health_check.js:20

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/ops/lifecycle.js:27

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/ops/self_repair.js:17

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/ops/skills_monitor.js:96

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/gep/a2aProtocol.js:75

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/gep/hubSearch.js:18

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/gep/memoryGraphAdapter.js:77

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/gep/taskReceiver.js:11

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
test/sanitize.test.js:12