Back to skill

Security audit

AlphaLens API

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its AlphaLens research purpose, but some workflow templates can put user-controlled text into shell commands and should be reviewed before installation.

Install only if you are comfortable giving the agent an AlphaLens API key and sending selected company, product, feature, and possible document/pipeline data to AlphaLens. Before running workflows, require the agent to validate domains, URL-encode all query text, avoid copying raw user input into shell commands, clean temporary directories, and avoid printing any part of the API key. Prefer pinned install sources and avoid opening generated reports that load remote scripts unless you accept that dependency.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
workflows/white-space.md:65
Finding
Command Injection Through Unsafe Shell Interpolation<![CDATA[ ## Vulnerability Details **File Location**: `workflows/white-space.md:65-75`; `workflows/white-space-phase3.md:25-47` **Vulnerability Type**: Shell command injection through unvalidated and improperly encoded input **Risk Level**: High ### Vulnerable Code `workflows/white-space.md:65-75`: ```bash WORKDIR=$(mktemp -d) API="https://api-production.alphalens.ai" curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/by-domain/{domain}" # → get organization_id, active_domain, logo_url ``` `workflows/white-space-phase3.md:25-47`: ```bash # Full combo (A+B+C — anchor's full feature set) curl -s -H "API-Key: $KEY" "$API/api/v1/search/products/search?description={feature_A}%20{feature_B}%20{feature_C}&limit=50&is_headquarters=true" > $WORKDIR/p1_abc.json & # Omit A (B+C) curl -s -H "API-Key: $KEY" "$API/api/v1/search/products/search?description={feature_B}%20{feature_C}&limit=50&is_headquarters=true" > $WORKDIR/p1_bc.json & # Omit B (A+C) curl -s -H "API-Key: $KEY" "$API/api/v1/search/products/search?description={feature_A}%20{feature_C}&limit=50&is_headquarters=true" > $WORKDIR/p1_ac.json & # Omit C (A+B) curl -s -H "API-Key: $KEY" "$API/api/v1/search/products/search?description={feature_A}%20{feature_B}&limit=50&is_headquarters=true" > $WORKDIR/p1_ab.json & # Swap: replace C with new feature D curl -s -H "API-Key: $KEY" "$API/api/v1/search/products/search?description={feature_A}%20{feature_B}%20{feature_D}&limit=50&is_headquarters=true" > $WORKDIR/p1_abd.json & wait ``` ### Technical Analysis The workflows direct an agent to substitute domain and feature values directly into shell command templates. The initial domain originates from the user, while the feature-swap workflow explicitly permits the user to provide `feature_D`. No mandatory domain validation or URL-encoding operation is specified before generating the shell source. Double quotes do not prevent shell command substitution. If an agent reproduces an attacker-controlled value ...[truncated 1735 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Never construct executable shell source by directly replacing placeholders with user-controlled text. 2. Validate domains with a strict allowlist before use. Accept only normalized public DNS names and reject whitespace, control characters, URL schemes, paths, ports, and shell metacharacters. 3. Pass dynamic values as positional arguments or environment variables rather than embedding them into generated commands. 4. Use curl's encoding support for query values: ```bash curl --fail-with-body --silent --show-error --get \ -H "API-Key: $KEY" \ --data-urlencode "description=$FEATURE_QUERY" \ --data "limit=50" \ --data "is_headquarters=true" \ "$API/api/v1/search/products/search" ``` 5. For domain resolution, validate and URL-encode the path component using a trusted language or library before invoking curl. 6. Add an explicit rule that agents must not copy raw user input into shell commands. 7. Quote temporary paths consistently, for example: ```bash > "$WORKDIR/p1_abc.json" ``` 8. Add adversarial tests covering command substitutions, backticks, quotes, newlines, ampersands, semicolons, Unicode separators, and percent-encoded control characters. ]]>

T08 · Insecure Dependencies

Warning
Location
README.md:19
Finding
Unpinned Executable Installation and Unverified Remote JavaScript<![CDATA[ ## Vulnerability Details **File Location**: `README.md:19-24`, `README.md:45-51`; `workflows/peer-benchmark.md:88-91` **Vulnerability Type**: Supply-chain exposure through mutable installation sources and CDN-hosted executable content **Risk Level**: Medium ### Vulnerable Code `README.md:19-24`: ```bash ### Cross-tool (recommended) — `npx skills add` Vercel Labs' `skills` CLI auto-detects which agents you have installed (Claude Code, Cursor, Codex, etc.) and copies the skill into the right place for each: ```bash npx skills add alphalens-intelligence/alphalens-skills ``` ``` `README.md:45-51`: ```bash ### OpenClaw ```bash openclaw skills install WalidMustapha/alphalens-api ``` Set `ALPHALENS_API_KEY` in your OpenClaw secret store; the runtime injects it into the execution environment automatically. ``` `workflows/peer-benchmark.md:88-91`: ```html Use **Chart.js** (not D3) — simpler for static comparison charts. Load from CDN: ```html <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> ``` ``` ### Technical Analysis The recommended `npx` invocation does not pin the installer CLI to an immutable version. The requested skill repository is also not pinned to a release or commit. The OpenClaw installation command similarly does not identify an immutable package version or digest. The benchmark workflow directs generated reports to execute JavaScript from jsDelivr when the report is opened. Although the URL specifies Chart.js version `4.4.0`, no Subresource Integrity hash is provided. Consequently, browser execution depends on the integrity of the package publisher, package registry, CDN, DNS, and TLS delivery path at report-viewing time. This remote script behavior also qualifies the README's description of generated output as “self-contained”: the benchmark remains dependent on externally hosted executable content. ### Attack Path #### Installation path 1. A package registry account, repository publis ...[truncated 1329 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the `npx` CLI to a reviewed version rather than relying on the registry's current resolution: ```bash npx skills@<reviewed-version> add <repository>@<reviewed-commit-or-release> ``` 2. Pin Skill installation sources to signed releases, immutable commit hashes, or verified content digests. 3. Ensure the documented GitHub and OpenClaw publisher identities are consistent and explicitly explain any legitimate difference between them. 4. Prefer bundling a reviewed Chart.js file into the generated report or Skill package. 5. If CDN loading remains necessary, publish and verify an exact SRI hash: ```html <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js" integrity="sha384-REPLACE_WITH_VERIFIED_HASH" crossorigin="anonymous"></script> ``` 6. Apply a restrictive Content Security Policy to generated reports, allowing scripts only from explicitly approved sources and disallowing unexpected network destinations. 7. Document that the benchmark report is not fully self-contained while remote JavaScript remains enabled. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
workflows/peer-benchmark.md:39
Finding
Sensitive API Responses Persist in Uncleaned Temporary Directories<![CDATA[ ## Vulnerability Details **File Location**: `workflows/market-map-org.md:21-35`; `workflows/investor-network.md:12-25`; `workflows/peer-benchmark.md:39-51`; `workflows/white-space.md:65-75` **Vulnerability Type**: Residual sensitive data and unsafe temporary-data lifecycle **Risk Level**: Low ### Vulnerable Code `workflows/peer-benchmark.md:39-51`: ```bash WORKDIR=$(mktemp -d) API="https://api-production.alphalens.ai" # Growth metrics for anchor + all peers curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/{anchor_id}/growth-metrics" > $WORKDIR/gm_anchor.json & curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/{peer1_id}/growth-metrics" > $WORKDIR/gm_peer1.json & # ... all peers in same block ... # Funding for anchor + all peers (already fetched for investor network — reuse) curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/{anchor_id}/funding" > $WORKDIR/fn_anchor.json & # ... wait ``` `workflows/investor-network.md:12-25`: ```bash WORKDIR=$(mktemp -d) API="https://api-production.alphalens.ai" # Fetch funding for each company curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/{org_id1}/funding" > $WORKDIR/fn1.json & curl -s -H "API-Key: $KEY" "$API/api/v1/entities/organizations/{org_id2}/funding" > $WORKDIR/fn2.json & # ... one call per company in the same block ... # Base64-encode each company favicon in the same block curl -s "https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://{domain1}&size=128" | base64 -w0 > $WORKDIR/favicon_domain1.txt & curl -s "https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://{domain2}&size=128" | base64 -w0 > $WORKDIR/favicon_domain2.txt & # ... one curl | base64 per company in the same block ... wait ``` The reviewed workflows create temporary directories and write API responses into them, but do not specify an EXIT trap or other cleanup operation. ### Technical Ana ...[truncated 1715 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Install an EXIT trap immediately after creating the directory: ```bash WORKDIR="$(mktemp -d)" trap 'rm -rf -- "$WORKDIR"' EXIT HUP INT TERM ``` 2. Quote every temporary path: ```bash curl --fail-with-body --silent --show-error \ -H "API-Key: $KEY" \ "$API/api/v1/entities/organizations/$anchor_id/growth-metrics" \ > "$WORKDIR/gm_anchor.json" ``` 3. Explicitly enforce restrictive permissions when runtime defaults cannot be guaranteed: ```bash umask 077 WORKDIR="$(mktemp -d)" ``` 4. Reuse already-fetched data where practical instead of producing duplicate temporary copies. 5. Avoid placing raw API responses in long-lived output directories. 6. Document the data-retention behavior and ensure container snapshots and logs do not capture temporary API data. 7. Add cleanup tests for normal completion, curl failure, user cancellation, and process interruption. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The page advertises ingestion of PDFs, PPTX, DocSend links, email forwarding, and API submissions, but provides no visible disclosure about whether uploaded documents are stored, retained, reused for model training, or shared with subprocessors. In a deal-origination context, users may upload highly sensitive pitch decks and investor materials, so lack of notice creates a meaningful privacy and data-governance risk even if it is not an exploit in the classic code-execution sense.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The enrichment and screening workflow explicitly references web agents, people data, contact data, and compliance/pricing agents, but does not warn users that company data may be sent to third-party services or processed externally. Because this skill is for competitive intelligence and private-market research, undisclosed outbound processing can expose confidential targets, pipeline contents, or proprietary screening criteria.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The CRM sync and browser-extension sections promote mapping data into Salesforce/HubSpot/Affinity and extracting context while browsing, but they do not clearly warn that these features can modify downstream systems or access page/context data from visited sites. In practice this can lead to unintended writes into business systems or over-collection of sensitive browsing context, especially when analysts review confidential company pages or internal web apps.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
This markdown file explicitly tells users to include `API-Key: $KEY` on every request, which is a credential-bearing network operation. The reference does not include any warning or disclosure about handling secrets carefully, avoiding logging the key, or understanding that requests transmit authenticated data to an external service.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The workflow explicitly says to use this for generic 'competitive landscape' or 'market map' requests, while the manifest says the skill should not fire on those generic phrases without an AlphaLens context marker. This broadens invocation scope and can cause the skill to activate on unrelated user requests, leading to unnecessary external API calls and unintended data sharing to AlphaLens/Google.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The broad trigger wording overlaps with common user requests and increases the chance of accidental invocation outside the intended AlphaLens-specific scope. In this skill's context, accidental triggering is more dangerous because the workflow immediately fans out multiple external requests in parallel and may process 20-30 organizations at once.

Intent-Code Divergence

Low
Confidence
91% confidence
Finding
The README claims the API key is never logged or persisted beyond curl usage, yet it instructs operators to print the first four characters with `echo "$KEY" | head -c 4`. Even partial secret disclosure can leak into terminal history, CI logs, chat transcripts, or shared agent output, undermining the stated secret-handling guarantees.

Context-Inappropriate Capability

Low
Confidence
83% confidence
Finding
The workflow instructs fetching favicons from Google's public service, which sends company domains to a third party outside the stated AlphaLens capability. Even if the data is public, this expands outbound data exposure and creates an unnecessary dependency that may surprise users or violate least-privilege/data-minimization expectations.

Static analysis

No suspicious patterns detected.