Back to skill

Security audit

Super Personasiled Search

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent Connectify development skill, but the included app needs review because it can expose contact data without login checks and sends detailed contact records to OpenAI.

Install only in a development or tightly controlled environment until the API has authentication, tenant-scoped data access, rate limits, request size limits, dependency updates, and clear disclosure/controls for sending contact notes to OpenAI. Do not deploy the current backend publicly with real network data.

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 (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server.js:39
Finding
Unauthenticated Network Query Endpoint Exposes Contact Data and Paid AI Operations<![CDATA[ ## Vulnerability Details **File Location**: `server.js:39-92` **Vulnerability Type**: Missing authentication, authorization, rate limiting, and tenant isolation **Risk Level**: High ### Vulnerable Code ```js app.post('/api/query', async (req, res) => { try { const { query, sessionId } = req.body || {}; if (!query || typeof query !== 'string' || !sessionId || typeof sessionId !== 'string') { return res.status(400).json({ error: 'Both query and sessionId are required strings.', }); } const cachedContext = await getQueryContext(sessionId); if (cachedContext && cachedContext.query === query) { return res.json({ results: cachedContext.results || [], }); } const connections = await getAllConnections(); const scoredConnections = await scoreConnections(query, connections); const topResults = await Promise.all( scoredConnections.slice(0, 5).map(async (connection) => { let actions = []; try { actions = await suggestActions(connection); } catch { actions = ['Draft intro email', 'Send quick follow-up']; } return { name: connection.name, role: connection.role, company: connection.company, platforms: connection.platforms, relevanceScore: connection.relevanceScore, reason: connection.reason, suggestedActions: actions, }; }) ); await saveQueryContext(sessionId, { query, results: topResults, createdAt: new Date().toISOString(), }); return res.json({ results: topResults }); } catch (error) { console.error('Query handling failed:', error); return res.status(500).json({ error: 'Unable to process query right now. Please try again.', }); } }); ``` ### Technical Analysis The `/api/query` route performs no authentication or authorization before loading the complete Redis-backed conne ...[truncated 2421 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require authentication on `/api/query` using a validated server-side session, signed token, or equivalent identity mechanism. 2. Enforce authorization and tenant ownership before loading connections. Replace the global `getAllConnections()` call with a query scoped to the authenticated user or organization. 3. Derive cache keys from the authenticated principal on the server, for example: ```text query-context:{authenticatedUserId}:{serverGeneratedSessionId} ``` 4. Do not trust a client-provided `sessionId` as proof of identity. Generate high-entropy identifiers server-side and verify their ownership. 5. Add IP- and account-based rate limiting, concurrency limits, and daily AI cost quotas. 6. Define strict request schemas and impose reasonable maximum lengths for `query` and `sessionId`. 7. Add abuse monitoring for repeated cache misses, high OpenAI usage, and broad contact-enumeration queries. 8. Return only the minimum contact fields required by the frontend and apply authorization checks to every returned record. 9. Retain CORS as a browser defense-in-depth control, but do not treat it as authentication or authorization. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
agent.js:44
Finding
Complete Contact Records and Free-Form Notes Are Transmitted to OpenAI Without Data Minimization<![CDATA[ ## Vulnerability Details **File Location**: `agent.js:44-68` and `agent.js:107-126` **Vulnerability Type**: Excessive third-party disclosure of contact and relationship data **Risk Level**: Medium ### Vulnerable Code ```js const userPrompt = JSON.stringify( { query, connections: connections.map((connection) => ({ id: connection.id, name: connection.name, role: connection.role, company: connection.company, location: connection.location, platforms: connection.platforms, tags: connection.tags, notes: connection.notes, lastInteraction: connection.lastInteraction, })), }, null, 2 ); const completion = await client.chat.completions.create({ model: MODEL, temperature: 0.2, messages: [ { role: 'system', content: SCORE_SYSTEM_PROMPT }, { role: 'user', content: userPrompt }, ], response_format: { type: 'json_object' }, }); ``` ```js const completion = await client.chat.completions.create({ model: MODEL, temperature: 0.4, messages: [ { role: 'system', content: ACTION_SYSTEM_PROMPT }, { role: 'user', content: JSON.stringify( { name: connection.name, role: connection.role, company: connection.company, tags: connection.tags, notes: connection.notes, }, null, 2 ), }, ], response_format: { type: 'json_object' }, }); ``` ### Technical Analysis For every cache miss, `scoreConnections()` serializes every Redis connection and sends it to OpenAI. The transmitted fields include direct identifiers, location, platform membership, free-form notes, and interaction dates. After ranking, selected contacts are transmitted again by `suggestActions()`. Third-party AI processing is consistent with the declared ranking functionality, so this is not hidden credential exfiltration. However, sending the complete collection and all free-form notes exceeds strict least-d ...[truncated 2244 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Perform local filtering before invoking OpenAI so only a small set of plausibly relevant contacts is transmitted. 2. Remove fields that are not essential to scoring. In particular, omit free-form notes and interaction dates by default. 3. Replace names and internal IDs with per-request pseudonymous identifiers, then map model results back to records locally. 4. Redact email addresses, phone numbers, credentials, financial information, and other sensitive patterns from free-form fields. 5. Require explicit administrator and user consent before sending contact information to a third-party AI provider. 6. Document the external processing purpose, data categories, retention policy, model-provider settings, and deletion process. 7. Configure provider-side privacy and retention controls appropriate for confidential contact data. 8. Introduce field-level data classifications and prevent restricted fields from entering AI prompts. 9. Treat all imported fields as untrusted data. Delimit them clearly and instruct the model that contact content is data rather than executable instructions. 10. Consider local ranking or embeddings for the initial search, using external generation only for the minimum selected records. 11. Add tests that assert prohibited fields are absent from outbound AI requests. ]]>
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (40)

Credential Access

High
Category
Privilege Escalation
Content
node_modules/
.env
.DS_Store
dist/
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
Copy `.env.example` to `.env` and set real values:

```bash
cp .env.example .env
```

Required:
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Ae1

High
Category
analysis-evasion
Content
- `src/components/AIChatPanel.jsx`: chat UX and `/api/query` client call.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `src/components/AIChatPanel.jsx`: chat UX and `/api/query` client call.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Known Vulnerable Dependency: adm-zip==0.5.16 — 2 advisory(ies): CVE-2026-76845 (adm-zip extraction follows destination symlinks, allowing arbitrary file overwri); CVE-2026-39244 (adm-zip: Crafted ZIP file triggers 4GB memory allocation)

High
Category
Supply Chain
Confidence
89% confidence
Finding
The lockfile includes adm-zip 0.5.16, and the cited issues affect ZIP extraction and malformed ZIP handling. In this repository, the risk is indirect because it is a transitive dependency, but if any code path processes attacker-controlled ZIP archives, it could enable arbitrary file overwrite via symlink traversal or denial of service via memory exhaustion.

Known Vulnerable Dependency: axios==1.13.6 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding
Axios 1.13.6 is present and is directly relevant because this skill integrates external services such as Apify and OpenAI, making outbound HTTP behavior security-sensitive. If the reported proxy normalization, header handling, or prototype-pollution-related issues are reachable, they could enable SSRF, credential leakage, request manipulation, or response hijacking in a network-connected backend.

Known Vulnerable Dependency: basic-ftp==5.2.0 — 4 advisory(ies): GHSA-6v7q-wjvx-w8wg (basic-ftp: Incomplete CRLF Injection Protection Allows Arbitrary FTP Command Exe); CVE-2026-39983 (basic-ftp has FTP Command Injection via CRLF); CVE-2026-41324 (basic-ftp vulnerable to denial of service via unbounded memory consumption in Cl) +1 more

High
Category
Supply Chain
Confidence
84% confidence
Finding
basic-ftp is present transitively via networking/proxy tooling and the cited CRLF injection and memory exhaustion issues can be serious when attacker-controlled FTP URLs or endpoints are used. In this skill, FTP is not an obvious core feature, so exploitability is reduced, but if untrusted proxy/PAC/URI inputs are ever accepted, it could become a practical command-injection or DoS vector.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
brace-expansion has known algorithmic complexity and resource-exhaustion issues, but here it is only a transitive utility used by tooling and matching libraries. In this project that makes it primarily a build/developer-environment risk unless untrusted glob-like patterns are processed at runtime, which is not evident from the lockfile alone.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: event-stream (Malicious package (credential theft))

High
Category
Supply Chain
Confidence
95% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
80% confidence
Finding
form-data 4.0.5 has CRLF injection risk in multipart field names and filenames. In a platform that may upload or relay data to external APIs, attacker-controlled multipart metadata could produce request smuggling-like effects or malformed outbound requests if this library is used with untrusted field names or filenames.

Known Vulnerable Dependency: ip-address==10.1.0 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: lodash==4.17.23 — 2 advisory(ies): CVE-2025-13465 (lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and ); CVE-2021-23337 (lodash vulnerable to Code Injection via `_.template` imports key names)

High
Category
Supply Chain
Confidence
86% confidence
Finding
Lodash 4.17.23 carries well-known prototype pollution and template/code-injection risks depending on which APIs are used. Because this is a backend handling structured data from external sources, prototype pollution is especially relevant if untrusted objects are merged, unset, or otherwise transformed using vulnerable patterns.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill instructs use of environment-backed secrets (`OPENAI_API_KEY`, `REDIS_URL`, `APIFY_TOKEN`) but does not declare any explicit tool scope, permissions, or allowed-tools boundary. In an agent ecosystem, that omission can cause overbroad access assumptions and makes it harder to constrain or audit what the skill may read from the environment.

External Transmission

Medium
Category
Data Exfiltration
Content
```
3. Smoke test query endpoint:
   ```bash
   curl -X POST http://localhost:3001/api/query \
     -H "Content-Type: application/json" \
     -d "{\"query\":\"Who in my network works in AI and is based in SF?\",\"sessionId\":\"local-test-session\"}"
   ```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The code sends detailed connection profile data, including names, roles, companies, locations, tags, notes, and interaction history, to a third-party OpenAI API for ranking. Even if functionally intended, this creates a real privacy and data-governance risk when users or contacts have not been clearly informed or the data has not been minimized before external transmission.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The action-generation flow transmits professional contact attributes and notes to OpenAI, which may expose personal or confidential relationship information to an external processor. Because notes can contain sensitive free-form content, this is more dangerous than strictly structured fields and can lead to unintended disclosure or compliance issues.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
This code persists connection records and query context to Redis using set/get operations, which can affect user data and privacy. Although there is error logging for client failures, there is no confirmation prompt, user disclosure, or inline documentation warning that session-related data is being stored in external infrastructure.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
This code saves the user's query, result set, and timestamp to Redis, which affects user data/privacy. Although the route has error logging, there is no visible confirmation prompt, user-facing notice, or explanatory comment/docstring warning that query activity is being retained.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This code performs a POST request to /api/query containing the user's typed query and sessionId, which transmits user and session data off the client. While there is an internal comment about the backend call, there is no user-visible warning, confirmation, or disclosure in the component UI indicating that entered content will be sent to a server.

Known Vulnerable Dependency: baseline-browser-mapping==2.10.10 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
60% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: body-parser==2.2.2 — 1 advisory(ies): CVE-2026-12590 (body-parser vulnerable to denial of service when invalid limit value silently di)

Low
Category
Supply Chain
Confidence
60% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: fflate==0.8.2 — 1 advisory(ies): CVE-2026-45820 (fflate unzipSync can enter an infinite loop when parsing malformed ZIP64 archive)

Low
Category
Supply Chain
Confidence
60% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: file-type==20.5.0 — 2 advisory(ies): CVE-2026-31808 (file-type affected by infinite loop in ASF parser on malformed input with zero-s); CVE-2026-32630 (file-type: ZIP Decompression Bomb DoS via [Content_Types].xml entry)

Low
Category
Supply Chain
Confidence
81% confidence
Finding
file-type 20.5.0 has denial-of-service issues on malformed media/archive inputs. Because this skill includes ingestion and external data processing, handling attacker-controlled files or responses is plausible, so malformed content could hang parsing or trigger excessive resource use if this package is used on untrusted data.

Static analysis

No suspicious patterns detected.