Back to skill

Security audit

Sales Email Automation (IMAP/SMTP)

Security checks for vulnerabilities and agentic risk

Overview

This email skill has useful IMAP/SMTP features, but it also processes real mail through CRM, Discord, OpenRouter, local archives, and unsafe shell commands that create serious review concerns.

Review carefully before installing. Do not run this against a production mailbox until the execSync command injections are replaced with argument-safe APIs, live tests default to dry-run, external AI/CRM/Discord data flows are explicit opt-in, and local archives/drafts/logs have restrictive permissions and retention. If already installed, disable any cron job and rotate mail, Discord, OpenRouter, and CRM credentials after reviewing exposure.

Vulnerability Patterns
  • 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
  • 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 (6)

T09 · Insecure Skill Coding Practices

Error
Location
auto-capture.js:73
Finding
Remote Command Injection Through Attacker-Controlled Email Sender Data<![CDATA[ ## Vulnerability Details **File Location**: `auto-capture.js:73-110` **Vulnerability Type**: OS command injection **Risk Level**: Critical ### Vulnerable Code ```js async function searchOkkiCustomer(email, companyName) { const domain = extractDomain(email); try { const { execSync } = require('child_process'); if (domain) { try { const result = execSync( `python3 "${CONFIG.vectorSearchPath}" search "${domain}"`, { encoding: 'utf8', timeout: 10000 } ); if (result && result.trim()) { return { source: 'domain', data: result }; } } catch (e) { // Ignore errors and continue } } if (companyName) { try { const result = execSync( `python3 "${CONFIG.vectorSearchPath}" search "${companyName}"`, { encoding: 'utf8', timeout: 10000 } ); if (result && result.trim()) { return { source: 'company', data: result }; } } catch (e) { // Ignore errors } } } catch (err) { return null; } } ``` The values are populated from a received email at `auto-capture.js:263-266`: ```js const email = parsed.from?.value?.[0]?.address || ''; const companyName = parsed.from?.text?.replace(/<.*>/, '').trim() || ''; const okkiMatch = await searchOkkiCustomer(email, companyName); ``` ### Technical Analysis `execSync()` receives a command string that is interpreted by a shell. Both `domain` and `companyName` originate from an untrusted email `From` header and are interpolated directly inside double quotes. Double quotes do not neutralize shell command substitution, and an attacker can also inject a closing quote followed by shell operators. The filename of the vector-search script is configurable, but neither that path nor the untrusted query is passed as a discrete process argument. Because automatic capture can process remotely supplied messages, this flaw creates a remote-to- ...[truncated 1166 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Replace shell command construction with `execFile()` or `spawn()` and a fixed argument array: ```js const { execFile } = require('child_process'); execFile( 'python3', [CONFIG.vectorSearchPath, 'search', domain], { encoding: 'utf8', timeout: 10000, env: { PATH: process.env.PATH, PYTHONIOENCODING: 'utf-8' } }, callback ); ``` - Resolve the configured script path and require it to fall under an administrator-approved directory. - Validate sender addresses with a proper email parser instead of the permissive `@(.+)>?` expression. - Apply strict length and character limits to search terms. - Run automatic mail processing in a sandbox with no access to unrelated secrets or files. - Add regression tests containing quotes, semicolons, command substitutions, newlines, and shell operators. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
kb-retrieval.js:19
Finding
Command Injection Through Email- and LLM-Derived Knowledge-Base Queries<![CDATA[ ## Vulnerability Details **File Location**: `kb-retrieval.js:19-35` **Related Data Flow**: `kb-retrieval.js:130-163`, `intent-recognition.js:139-178` **Vulnerability Type**: OS command injection through untrusted derived data **Risk Level**: Critical ### Vulnerable Code ```js async function searchVectorDB(query, limit = 3) { console.log(`🔍 向量数据库检索:${query}`); try { const searchScript = path.join(CONFIG.vectorStorePath, 'search-customers.py'); const result = execSync( `${CONFIG.venvPython} "${searchScript}" "${query}" --limit ${limit}`, { encoding: 'utf8', timeout: 10000, stdio: ['pipe', 'pipe', 'ignore'] } ); if (result && result.trim()) { return { found: true, results: result.trim().split('\n').slice(0, limit), source: 'lancedb' }; } } catch (err) { console.log(`⚠️ Vector search unavailable or returned no result: ${err.message}`); } return { found: false, results: [], source: 'none' }; } ``` The query includes entities derived from email content: ```js const searchQueries = []; const baseQueries = intentQueries[intent] || []; searchQueries.push(...baseQueries); searchQueries.push(...keyEntities); const uniqueQueries = [...new Set(searchQueries)].slice(0, 5); const vectorResults = await searchVectorDB(uniqueQueries.join(' '), 3); ``` ### Technical Analysis The vector-search query is interpolated into a shell command passed to `execSync()`. `keyEntities` are returned by an LLM after processing untrusted email content. LLM output must not be considered sanitized or trustworthy: a malicious email can instruct or influence the model to return an entity containing quote characters, command substitutions, or shell operators. Even if the model usually returns ordinary product terms, there is no deterministic validation before the value enters the shell. The `limit` parameter is also interpolated and should be constrained, although current internal callers use ...[truncated 1069 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Replace `execSync()` with an argument-safe API: ```js const { execFile } = require('child_process'); execFile( CONFIG.venvPython, [searchScript, query, '--limit', String(validatedLimit)], { encoding: 'utf8', timeout: 10000, windowsHide: true }, callback ); ``` - Treat all LLM responses as untrusted input. - Validate `keyEntities` against strict type, length, count, and character rules. - Convert `limit` to an integer and enforce a small allowed range. - Pin and validate the Python executable and search-script paths. - Execute retrieval workers with a minimal environment rather than forwarding all secrets. - Add adversarial tests in which entities contain shell control characters and multiline content. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/smtp-wrapper.js:20
Finding
Command Injection in the SMTP Wrapper<![CDATA[ ## Vulnerability Details **File Location**: `scripts/smtp-wrapper.js:20-49` **Vulnerability Type**: OS command injection **Risk Level**: Critical ### Vulnerable Code ```js function sendEmail(options) { const args = ['node', SMTP_SCRIPT, 'send']; if (options.to) { args.push('--to', options.to); } if (options.subject) { args.push('--subject', options.subject); } if (options.html) { args.push('--html'); args.push('--body', options.html); } else if (options.body) { args.push('--body', options.body); } if (options.attach) { args.push('--attach', options.attach); } if (options.cc) { args.push('--cc', options.cc); } try { const output = execSync(args.join(' '), { encoding: 'utf-8' }); return { success: true, output: output }; } catch (error) { return { success: false, error: error.message }; } } ``` ### Technical Analysis The wrapper first constructs an argument-like array, but then destroys the argument boundaries with `args.join(' ')`. The resulting string is passed to `execSync()` and interpreted by a shell. No quoting or validation is applied to recipient, subject, HTML, body, attachment, or CC fields. Spaces can alter parsing, while shell operators, substitutions, redirections, and quote characters can execute additional commands. This is not necessary for SMTP operation because Node can invoke the child script directly without a shell. ### Attack Path 1. A caller supplies a malicious value in `options.subject`, `options.body`, `options.html`, `options.to`, `options.attach`, or `options.cc`. 2. `sendEmail()` appends the raw value to `args`. 3. `args.join(' ')` creates a shell command string. 4. `execSync()` asks the shell to parse that string. 5. Injected shell syntax executes before, after, or instead of the intended SMTP command. ### Impact Assessment Any component able to call this wrapper with untrusted data can obtain arbitrary command ...[truncated 448 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Use `execFileSync()` with discrete arguments and no shell: ```js const { execFileSync } = require('child_process'); const output = execFileSync( process.execPath, [SMTP_SCRIPT, 'send', ...smtpArgs], { encoding: 'utf8', shell: false, env: process.env } ); ``` Additional hardening should include: - Validate recipient and CC values as email addresses. - Enforce maximum lengths for subjects and bodies. - Resolve and validate attachment paths against `ALLOWED_READ_DIRS`. - Avoid logging full command arguments because they may contain sensitive message data. - Prefer importing a safe SMTP function directly instead of creating a child process. - Add tests for quotes, backticks, substitutions, redirections, semicolons, and newlines. ]]>

other

Error
Location
intent-recognition.js:94
Finding
Undisclosed Transmission of Customer Email and Knowledge-Base Data to OpenRouter<![CDATA[ ## Vulnerability Details **File Locations**: - `intent-recognition.js:94-135` - `reply-generation.js:178-214, 233-271` - `reply-generator.js:58-93, 105-143` **Vulnerability Type**: Sensitive information disclosure to a third-party AI service **Risk Level**: High ### Vulnerable Code Intent classification sends the email subject and up to 2,000 body characters: ```js const prompt = `You are an email intent classifier for a B2B electronics company. Email to classify: Subject: ${subject} Body: ${body.slice(0, 2000)} Classification:`; const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`, 'HTTP-Referer': 'https://farreach-electronic.com', 'X-Title': 'Farreach EmailIntent', }, body: JSON.stringify({ model: 'anthropic/claude-sonnet-4', messages: [ { role: 'system', content: 'You are an email intent classifier. Return ONLY valid JSON.' }, { role: 'user', content: prompt } ], temperature: 0.1, max_tokens: 200 }) }); ``` Reply generation sends sender identity, subject, body, and retrieved knowledge: ```js let prompt = `Generate a professional email reply based on: ORIGINAL EMAIL: Subject: ${email.subject || 'No subject'} From: ${email.from || 'Unknown'} Content: ${email.body?.slice(0, 1500) || 'No content'} INTENT: ${intent} `; if (kbResults?.found && kbResults.results?.length > 0) { prompt += `KNOWLEDGE BASE CONTEXT:\n`; kbResults.results.forEach((r, i) => { prompt += `\n[${i + 1}] Source: ${r.source || 'Unknown'}\n${r.content?.slice(0, 300) || r}\n`; }); } const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`, 'HTTP-Referer': ' ...[truncated 2497 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Make external AI processing disabled by default and require explicit administrator opt-in. - Clearly document: - The external endpoint. - The selected model provider. - Which email and knowledge-base fields are transmitted. - Retention, training, regional-processing, and deletion policies. - Add deterministic redaction for email addresses, phone numbers, signatures, credentials, order numbers, and other identifiers. - Send only the minimum text required for classification. - Do not include sender addresses in reply-generation prompts unless strictly necessary. - Maintain an allowlist of knowledge-base sources permitted to leave the system. - Provide local keyword classification and local-model reply generation as privacy-preserving alternatives. - Add per-mailbox and per-message controls to prohibit external processing. - Record auditable consent and disclosure events without logging the sensitive prompt itself. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
integration-test.js:33
Finding
Integration Test Defaults to Processing Real Mailbox Data and Live Discord Publication<![CDATA[ ## Vulnerability Details **File Location**: `integration-test.js:33-43, 47-126, 214-225, 253-260` **Vulnerability Type**: Unsafe live-test behavior and sensitive data disclosure **Risk Level**: High ### Vulnerable Code Live mode is the default: ```js const args = process.argv.slice(2); const DRY_RUN = args.includes('--dry-run'); const LIMIT = parseInt(args.find(a => a.startsWith('--limit='))?.split('=')[1]) || 3; console.log('Integration test started'); console.log(`Mode: ${DRY_RUN ? 'DRY-RUN' : 'LIVE'}`); ``` The test reads recent messages from the real inbox: ```js imap.openBox('INBOX', false, (err, box) => { imap.search(['ALL'], (err, results) => { const fetchSeq = results.slice(-limit).reverse(); const f = imap.fetch(fetchSeq, { bodies: '', markSeen: false }); f.on('message', (msg) => { msg.on('body', (stream) => { simpleParser(stream, (err, parsed) => { if (!err && parsed) { emailData = { uid: msg.seqno, from: parsed.from?.text || parsed.from?.value?.[0]?.address || 'unknown', to: parsed.to?.text || '', subject: parsed.subject || 'No Subject', body: parsed.text || parsed.html || '', receivedAt: parsed.date?.toISOString() || new Date().toISOString(), attachments: parsed.attachments?.map(a => a.filename) || [] }; } }); }); }); }); }); ``` It publishes the generated result to Discord unless `--dry-run` is explicitly supplied: ```js if (result.draft && !DRY_RUN) { console.log('\nStep 4: Discord publication'); try { const reviewResult = await sendForReview(result.draft); result.discord_sent = true; result.discord_message_id = reviewResult.message_id; } catch (err) { result.errors.push(`Discord send failed: ${err.message}`); } } ``` It also searches for credentials in a parent workspace: ```js const envPath = path.join(__dirname, ...[truncated 2059 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Make fixture-based dry-run behavior the unconditional default. - Require an explicit `--live` flag plus interactive confirmation before accessing IMAP, OpenRouter, or Discord. - Refuse live mode in CI unless a dedicated test-environment variable is set. - Use isolated test mailbox, Discord channel, and API credentials. - Load configuration only from a dedicated test environment file inside an approved path. - Do not use `ALL` against production mailboxes; select messages bearing a unique test label or mailbox. - Redact report content and save test output with mode `0600`. - Print a clear list of external destinations before executing any live test. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
auto-capture.js:128
Finding
Automatic Plaintext Archiving of Complete Email and CRM Data<![CDATA[ ## Vulnerability Details **File Location**: `auto-capture.js:128-191` **Vulnerability Type**: Insecure persistent storage of sensitive information **Risk Level**: Medium ### Vulnerable Code ```js function saveEmail(emailData, okkiMatch) { const date = new Date(emailData.date); const dateStr = date.toISOString().split('T')[0]; const timeStr = date.toTimeString().split(' ')[0].replace(/:/g, '-'); const filename = `${dateStr}_${timeStr}_${sanitizeFilename(emailData.subject || 'no-subject')}.md`; const filepath = path.join(CONFIG.outputDir, dateStr, filename); const dir = path.dirname(filepath); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } let content = `---\n`; content += `date: ${emailData.date.toISOString()}\n`; content += `from: ${emailData.from}\n`; content += `to: ${emailData.to || ''}\n`; content += `subject: ${emailData.subject}\n`; if (okkiMatch) { content += `okki_matched: true\n`; content += `okki_source: ${okkiMatch.source}\n`; } if (emailData.intent) { content += `intent: ${emailData.intent}\n`; content += `intent_confidence: ${emailData.intentConfidence}\n`; content += `auto_draft: ${emailData.autoDraft}\n`; } content += `---\n\n`; content += `# ${emailData.subject || 'No subject'}\n\n`; content += `**Sender:** ${emailData.from}\n`; content += `**Recipient:** ${emailData.to || ''}\n`; if (okkiMatch) { content += `\n\`\`\`\n${okkiMatch.data}\n\`\`\`\n`; } content += `\n${emailData.text || emailData.html?.replace(/<[^>]*>/g, '') || 'No body'}\n`; if (emailData.attachments && emailData.attachments.length > 0) { emailData.attachments.forEach((att, i) => { content += `${i + 1}. ${att.filename} (${(att.size / 1024).toFixed(2)} KB)\n`; }); } fs.writeFileSync(filepath, content, 'utf8'); return filepath; } ``` ### Technical Analysis The capture workflow stores complete email bodies, sender and recipient identities, ...[truncated 1731 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Disable full-body archiving by default and require explicit configuration. - Create archive directories with mode `0700` and files with mode `0600`: ```js fs.mkdirSync(dir, { recursive: true, mode: 0o700 }); fs.writeFileSync(filepath, content, { encoding: 'utf8', mode: 0o600, flag: 'wx' }); ``` - Resolve and validate `MAIL_OUTPUT_DIR` against an approved write-directory allowlist. - Encrypt archives at rest using an operating-system key store or managed encryption key. - Store only required metadata rather than complete message bodies. - Redact personal data, credentials, quoted message history, and signatures. - Define retention limits and implement automatic deletion. - Avoid storing raw CRM command output. - Protect against symbolic-link races by using safe file-opening flags and a private archive directory. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (134)

Intent-Code Divergence

High
Confidence
98% confidence
Finding
The document explicitly forbids sending example quotation files to customers, yet the provided command example attaches a file from the examples directory. This contradiction creates a high likelihood of operator error that can leak incorrect, non-customer-specific, or test materials to real recipients, causing data integrity, privacy, and reputational harm.

Intent-Code Divergence

High
Confidence
97% confidence
Finding
Later attachment guidance labels examples/QT-*.pdf as acceptable quotation attachments, directly conflicting with earlier warnings that example files must never be sent to customers. In an email-sending skill, contradictory guidance around attachments is dangerous because it can operationalize accidental disclosure of sample or wrong-customer sales documents.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Undeclared OKKI sync of outgoing email data would be a meaningful privacy and integrity concern in an email skill. Syncing outgoing communications into CRM systems expands data exposure beyond the mail provider and can leak sensitive commercial data if users are not clearly informed.

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- OKKI sync: `okki-sync.js`
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- Discord review: `discord-review.js`
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code invokes external local programs via execSync to perform vector/OKKI searches using email-derived data. This creates a dangerous trust boundary expansion: sensitive email metadata is sent into other local tools outside the advertised mail functionality, increasing exposure risk and making the skill capable of triggering unintended local code paths or data access.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
auto-capture.js:88

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
kb-retrieval.js:29

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
okki-sync.js:65

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/smtp-wrapper.js:45

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
auto-capture.js:18

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
integration-test.js:57

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
intent-recognition.js:116

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
reply-generation.js:184

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
reply-generator.js:64

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/imap.js:16

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
test-read.js:8