Back to skill

Security audit

company-research-intelligence-agent

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real company-research tool, but it also enables broad prospect/contact collection and handles queries, API keys, and local result files in ways users should review carefully.

Install only if you trust the publisher and intend to use Explorium for both company and prospect/contact research. Avoid including confidential context in prompts because the default workflow can send the original request to the API. Do not enter API keys through the visible setup prompt unless it is fixed; prefer a protected environment variable and rotate any key that was printed. Use contact/person enrichment only with proper authorization and legal basis, and review or delete /tmp result files and CSV exports after use.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:95
Finding

Original User Queries Are Sent as Telemetry Without Explicit Consent

Content
View full analysis
" MATCH_RESULT=$(python3 "$CLI" match-business \ --businesses '[{"name":"","domain":""}]' \ --plan-id "$PLAN_ID" --call-reasoning "$QUERY") cat "$MATCH_RESULT" ``` The CLI implementation explicitly states that this metadata should be opt-in: ```python def _request_context(args): """Build the optional request_context payload for server-side call grouping. Privacy note: when --call-reasoning is supplied, the user's query text is sent to api.explorium.ai as part of the request metadata. This is opt-in — omit --call-reasoning if the user has not consented to query logging. """ reasoning = getattr(args, "call_reasoning", None) plan_id = getattr(args, "plan_id", None) if not reasoning and not plan_id: return None return { "type": "vibe-prospecting-plugin", "call_reasoning": reasoning, "plan_id": plan_id, } ``` ### Technical Analysis The standard workflow directs the agent to copy the user's original request into `--call-reasoning`. The CLI then includes that value in `request_context.call_reasoning` and transmits it to `https://api.explorium.ai/v1`. Sending search criteria and entity identifiers is necessary for the declared company-research functionality. Sending the complete conversational request is not necessary to perform matching or enrichment. The workflow also conflicts with the CLI's own privacy statement that query logging is opt-in and must be omitted unless the user has consented. Research requests can contain confidential meeting details, customer names, internal strategy, investment plans, or due-diligence concerns ...[truncated 891 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
bin/agentsource.py:115
Finding

Predictable and Non-Exclusive Temporary Files Expose Research Results to Local Attacks

Content
View full analysis
pathlib.Path: ts = int(time.time()) return TEMP_DIR / f"agentsource_{ts}_{command}.json" def write_result(command: str, data: dict) -> pathlib.Path: path = make_temp_path(command) path.write_text(json.dumps(data, indent=2, default=str)) print(str(path)) return path ``` Error results use the same mechanism: ```python def write_error(command: str, error_msg: str, error_code: str = None, http_status: int = None) -> pathlib.Path: data = { "success": False, "error": error_msg, "error_code": error_code, "http_status": http_status, "command": command, "timestamp": int(time.time()), } path = make_temp_path(f"{command}_error") path.write_text(json.dumps(data, indent=2)) print(str(path)) return path ``` ### Technical Analysis Temporary filenames contain only a second-resolution timestamp and a known command name. They are therefore easy to predict. `Path.write_text()` opens the destination non-exclusively and follows symbolic links. The implementation neither verifies that the destination is a regular file owned by the current user nor applies an explicit `0600` mode. Because the files are created in shared `/tmp`, another local user can pre-create a predicted path as a symbolic link. Depending on the process umask, newly created files may also be readable by other local users. Concurrent invocations of the same command within one second can overwrite or corrupt each other's results. The files may contain company intelligence, executive profiles, professional or personal email addresses, direct telephone numbers, and other returned prospect data. ### Attack Path 1. A local ...[truncated 1185 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
setup.sh:81
Finding

API-Key Setup Exposes Secrets Through Visible Input, Terminal Output, and Command-Line Arguments

Content
View full analysis
"$CONFIG_FILE" chmod 600 "$CONFIG_FILE" echo "[OK] API key saved to $CONFIG_FILE (mode 600, owner read-only)" echo "" echo "To also set it as an environment variable, add this to ~/.zshrc or ~/.bashrc:" echo " export EXPLORIUM_API_KEY='$api_key'" ``` The documentation also recommends passing the key as a command-line argument: ```bash export EXPLORIUM_API_KEY=your_api_key_here # Or: python3 ~/.agentsource/bin/agentsource.py config --api-key your_api_key_here ``` The argument is accepted directly by the CLI: ```python p = sub.add_parser("config", help="Save API key to ~/.agentsource/config.json") p.add_argument("--api-key", metavar="KEY") ``` ### Technical Analysis The shell prompt uses `read` without `-s`, so the API key is displayed while entered. Afterward, the script prints the complete key in an `export` command. Terminal recording, scrollback, shoulder surfing, or CI logs can therefore capture it. The documented `--api-key` form can place the credential in shell history and, depending on the operating system and process-inspection policy, in process argument listings. The setup script writes JSON through direct string interpolation. Quotes, backslashes, control characters, or newlines in a key are not JSON-escaped, which can corrupt the configuration file. Although the resulting file is changed to mode `0600`, that protection does not address disclosure during entry, output, argument handling, or serialization. ### Attack Path 1. A user runs `setup.sh` and types the API key at the visible pro ...[truncated 1036 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Note
Location
SKILL.md:62
Finding

Recursive Filesystem Search Can Select an Untrusted CLI Executable

Content
View full analysis
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 (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The advertised function is company research, but the implementation supports broader prospecting operations including people/prospect discovery, entity fetch, statistics, CSV export, and transmission of user query text and plan IDs. This mismatch undermines informed consent and can cause users to authorize a workflow that collects, exports, or transmits more data than they reasonably expect.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The advertised function is company research, but the implementation supports broader prospecting operations including people/prospect discovery, entity fetch, statistics, CSV export, and transmission of user query text and plan IDs. This mismatch undermines informed consent and can cause users to authorize a workflow that collects, exports, or transmits more data than they reasonably expect.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill invokes shell, reads environment variables, writes temp/local files, and communicates with a remote API, but it declares no explicit tool scope or permissions boundary. That makes the effective privilege set opaque to users and host platforms, increasing the risk of unintended command execution, file writes, and data exfiltration if the skill is triggered unexpectedly or modified later.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Triggers like "tell me about" and "what do you know about" are overly broad and can activate the skill in ordinary conversation unrelated to intentional company-research requests. Because the skill has shell, file, env, and network behaviors, accidental invocation could cause unintended API calls, data transmission, or local actions without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

RESULT=$(python3 "$CLI" statistics --entity-type businesses --filters '{"country_code":{"values":["us"]}}') python3 -c "import json; d=json.load(open('$RESULT')); print(d.get('error_code','OK'))"

text
If it prints `AUTH_MISSING`, show secure API key setup instructions (never ask the user to paste keys in chat).

---

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill can export gathered data to a local CSV in a user directory, which creates a persistent copy of potentially sensitive business intelligence or contact data. Without clear necessity, path restrictions, or consent at write time, this increases the risk of accidental data retention, overwriting files, or later misuse of exported data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill instructs writing output to a local file path under ~/Downloads without an explicit warning that a file will be created or overwritten. This is dangerous because users may not expect persistent filesystem changes, and local exports can leak or retain sensitive research and contact information outside the chat/session boundary.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill exposes prospect/person-data enrichment capabilities (for example, prospect contacts and profiles) that go beyond the manifest's stated company-research and due-diligence use case. This scope mismatch is dangerous because a user or downstream agent may invoke people-data collection features without informed consent or appropriate policy review, increasing privacy, compliance, and misuse risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The CSV export command writes fetched or enriched data to any caller-specified local path, with no safety checks, data-classification warning, or restriction on sensitive output destinations. Because this tool handles company and prospect data, it can silently persist potentially sensitive or regulated information to disk where it may be retained, synced, or exposed to other local processes or users.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The CLI advertises and enables generic B2B prospecting operations, including prospect fetch/match workflows, which materially exceed the narrower company-research positioning in the metadata. In an agent setting, this hidden functional breadth can lead to over-collection of business and personal data and use of the tool for lead generation or surveillance beyond what users expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly documents enrichment of prospects with personal email, phone numbers, demographics, and work history, but provides no privacy notice, lawful-use constraints, or guidance on handling personal data. In a company-research and due-diligence agent, this increases the risk of unauthorized collection, misuse, overcollection, or noncompliant processing of PII for sales, screening, or profiling workflows.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · README.md (reported line 71)May include surrounding context.

md
#   ~/.agentsource/config.json          — API key storage (mode 600, only if you choose to save it)
#
# Nothing is sent to any network during setup. The API key is only used when
# you run CLI commands that call https://api.explorium.ai/v1/.

PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$HOME/.agentsource"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 49)May include surrounding context.

md
#   ~/.agentsource/config.json          — API key storage (mode 600, only if you choose to save it)
#
# Nothing is sent to any network during setup. The API key is only used when
# you run CLI commands that call https://api.explorium.ai/v1/.

PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$HOME/.agentsource"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · bin/agentsource.py (reported line 33)May include surrounding context.

python
#   ~/.agentsource/config.json          — API key storage (mode 600, only if you choose to save it)
#
# Nothing is sent to any network during setup. The API key is only used when
# you run CLI commands that call https://api.explorium.ai/v1/.

PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$HOME/.agentsource"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · setup.sh (reported line 12)May include surrounding context.

sh
#   ~/.agentsource/config.json          — API key storage (mode 600, only if you choose to save it)
#
# Nothing is sent to any network during setup. The API key is only used when
# you run CLI commands that call https://api.explorium.ai/v1/.

PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$HOME/.agentsource"

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · setup.sh (reported line 46)May include surrounding context.

sh
echo "[OK] Python $PYTHON_VERSION"

# ---------------------------------------------------------------------------
# 2. Create directory structure
# ---------------------------------------------------------------------------
mkdir -p "$BIN_DIR"
echo "[OK] Created $BIN_DIR"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · setup.sh (reported line 75)May include surrounding context.

sh
if [[ "${save_key:-}" =~ ^[Yy]$ ]]; then
        printf '{\n  "api_key": "%s"\n}\n' \
            "$EXPLORIUM_API_KEY" > "$CONFIG_FILE"
        chmod 600 "$CONFIG_FILE"
        echo "[OK] API key saved to $CONFIG_FILE (mode 600, owner read-only)"
    fi
else

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · setup.sh (reported line 85)May include surrounding context.

sh
if [[ "${save_key:-}" =~ ^[Yy]$ ]]; then
        printf '{\n  "api_key": "%s"\n}\n' \
            "$EXPLORIUM_API_KEY" > "$CONFIG_FILE"
        chmod 600 "$CONFIG_FILE"
        echo "[OK] API key saved to $CONFIG_FILE (mode 600, owner read-only)"
    fi
else

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script prints a shell export command containing the user-supplied API key in plaintext, which can expose the secret in terminal scrollback, shell history if copied, screenshots, logging, or shoulder-surfing. Secrets should not be re-rendered once entered unless strictly necessary and masked.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The setup script advertises and normalizes lead-generation use cases such as finding executives and obtaining emails, which materially exceeds the manifest’s stated company-research positioning. This scope expansion is dangerous because users may grant trust and install the skill for benign due-diligence purposes while the bundled tooling is actually intended for contact discovery and prospecting, increasing privacy, compliance, and misuse risk.

Content

No source excerpt is available for this finding.

Scope Creep

Low
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

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

md
After presenting research:
- **Export to CSV** — for CRM import or further analysis
- **Research additional companies** — compare or expand scope
- **Dive deeper** — add more enrichment types
- **Find contacts** — pivot to finding specific people at the company

Static analysis

No suspicious patterns detected.