Back to skill

Security audit

Nyne Enrichment

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it says, but it enables broad third-party enrichment of people and disclosure of sensitive personal details without enough built-in privacy controls.

Review before installing. Use this only where you have a legitimate basis to enrich a person, prefer lite mode and the minimum fields needed, avoid newsfeed or AI-enhanced search unless clearly necessary, and replace the example temp-file and credential-check commands with safer versions that do not expose secrets or leave PII in /tmp.

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

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:43
Finding
API Credential Prefixes Are Exposed in Shell Output## Vulnerability Details **File Location**: `SKILL.md`, lines 43-46 **Vulnerability Type**: Partial secret disclosure through terminal and log output **Risk Level**: Medium ```bash Verify they're set: ```bash echo "Key: ${NYNE_API_KEY:0:8}... Secret: ${NYNE_API_SECRET:0:6}..." ``` ``` ### Technical Analysis The credential verification procedure prints the first eight characters of `NYNE_API_KEY` and the first six characters of `NYNE_API_SECRET`. Although these are not the complete credentials, secret prefixes remain sensitive authentication material. Shell output may be retained in CI logs, agent transcripts, terminal recording systems, support bundles, or centralized observability platforms. Revealing known prefixes reduces the unknown credential space and can assist credential correlation, targeted brute-force attempts, or identification of credentials exposed through another source. Sending the complete credentials to the declared Nyne HTTPS API in authentication headers is necessary for the skill's stated enrichment functionality. Printing credential fragments locally is not necessary and exceeds the minimum disclosure required to verify that the variables are configured. ### Attack Path 1. A user or automation system follows the setup instructions and executes the verification command. 2. The API key and secret prefixes are written to standard output. 3. The output is captured in an agent transcript, CI job log, terminal recording, or shared support artifact. 4. An attacker with access to that output obtains both credential prefixes. 5. The attacker correlates the prefixes with credentials from another leak or uses them to reduce the search space for weak or predictably generated credentials. 6. If the complete credentials are recovered, the attacker can authenticate to the Nyne API under the victim's account. ### Impact Assessment Direct execution privileges are not obtained from the prefixes alone. The ...[truncated 445 chars]
Remediation
## Remediation Suggestions - Do not print any portion of either credential. - Verify only whether each variable is defined: ```bash if [ -n "${NYNE_API_KEY:-}" ] && [ -n "${NYNE_API_SECRET:-}" ]; then echo "Nyne API credentials are configured." else echo "NYNE_API_KEY and NYNE_API_SECRET must be configured." >&2 return 1 2>/dev/null || exit 1 fi ``` - Configure CI and agent environments to mask the complete values of both variables. - Avoid enabling shell tracing with `set -x` while handling credentials. - Rotate credentials if their prefixes have already been published in broadly accessible logs, particularly when another portion of the same credentials may have been exposed.

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:79
Finding
Sensitive Enrichment Results Are Written to a Predictable Shared Temporary Path## Vulnerability Details **File Location**: `SKILL.md`, lines 79-94 **Vulnerability Type**: Unsafe temporary-file handling and plaintext PII storage **Risk Level**: High ```bash # Submit enrichment request curl -s -X POST "https://api.nyne.ai/person/enrichment" \ -H "Content-Type: application/json" \ -H "X-API-Key: $NYNE_API_KEY" \ -H "X-API-Secret: $NYNE_API_SECRET" \ -d '{"email": "someone@example.com"}' | nyne_parse > /tmp/nyne_enrich.json REQUEST_ID=$(jq -r '.data.request_id' /tmp/nyne_enrich.json) echo "Request submitted: $REQUEST_ID" # Poll until complete (checks every 3s, times out after 6 min) SECONDS_WAITED=0 while [ $SECONDS_WAITED -lt 360 ]; do curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \ -H "X-API-Key: $NYNE_API_KEY" \ -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json ``` ### Technical Analysis The documented workflow repeatedly writes API responses to the fixed path `/tmp/nyne_enrich.json` using shell redirection. The completed response can contain personal and sensitive information, including personal and work email addresses, phone numbers, locations, gender, social profiles, employment history, education, and social-media content. A fixed filename in a shared temporary directory creates two distinct risks: 1. **Confidentiality risk:** Depending on the invoking process's `umask` and operating-system configuration, the resulting file may be readable by other local users. The file is also left behind after the workflow completes. 2. **Symlink and file-clobbering risk:** Shell redirection follows an existing symbolic link. A local attacker who can create `/tmp/nyne_enrich.json` before the skill runs may point it to another file writable by the invoking account. Each response overwrite would then replace that target with API response data. Concurrent executions also use the same path, allowing one run to overwrite or consume a ...[truncated 2159 chars]
Remediation
## Remediation Suggestions - Create a unique private temporary directory with `mktemp -d` instead of using a fixed filename. - Set a restrictive `umask` before creating files that may contain PII. - Remove temporary data reliably with a shell trap. - Validate that temporary-file creation succeeded before sending or storing data. - Avoid retaining the full enrichment result on disk when it can be processed through a pipeline or held in memory. - Use a separate temporary location for every concurrent request. Example hardened pattern: ```bash umask 077 NYNE_TMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/nyne.XXXXXXXX") || exit 1 NYNE_RESULT="$NYNE_TMP_DIR/enrichment.json" trap 'rm -rf -- "$NYNE_TMP_DIR"' EXIT HUP INT TERM curl --fail-with-body --silent --show-error \ -X POST "https://api.nyne.ai/person/enrichment" \ -H "Content-Type: application/json" \ -H "X-API-Key: $NYNE_API_KEY" \ -H "X-API-Secret: $NYNE_API_SECRET" \ -d '{"email":"someone@example.com"}' | nyne_parse > "$NYNE_RESULT" ``` Where feasible, add explicit user confirmation before transmitting a person's identifier to the external enrichment provider, disclose the categories of returned data, and apply an appropriate retention policy to all stored results.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (21)

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill is designed to collect and disclose extensive personal data from a third-party enrichment service, but it provides no warning, consent check, or guidance on lawful/appropriate use. In this context, the omission materially increases privacy and compliance risk because users may unknowingly submit third-party identifiers and receive sensitive personal details without minimization or notice.

Ssd 3

Medium
Confidence
98% confidence
Finding
The instructions explicitly tell the agent to show all available data, including personal emails, phones, social profiles, work history, education, and posts, with no need-based filtering. That creates a clear over-disclosure risk and can expose sensitive or unnecessary personal data to users who did not need all fields, amplifying privacy harm and misuse potential.

External Transmission

Medium
Category
Data Exfiltration
Content
}

# Submit enrichment request
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
87% confidence
Finding
This POST example sends personal identifiers to an external enrichment API, which is expected functionality but still a real data-transmission risk. In this skill's context, the danger is elevated because the transmitted inputs can be third-party personal data and the service returns broad profile enrichment, so consent and minimization controls are important.

External Transmission

Medium
Category
Data Exfiltration
Content
}

# Submit enrichment request
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
87% confidence
Finding
This POST example sends personal identifiers to an external enrichment API, which is expected functionality but still a real data-transmission risk. In this skill's context, the danger is elevated because the transmitted inputs can be third-party personal data and the service returns broad profile enrichment, so consent and minimization controls are important.

External Transmission

Medium
Category
Data Exfiltration
Content
# Poll until complete (checks every 3s, times out after 6 min)
SECONDS_WAITED=0
while [ $SECONDS_WAITED -lt 360 ]; do
  curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \
    -H "X-API-Key: $NYNE_API_KEY" \
    -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json
  STATUS=$(jq -r '.data.status' /tmp/nyne_enrich.json)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Poll until complete (checks every 3s, times out after 6 min)
SECONDS_WAITED=0
while [ $SECONDS_WAITED -lt 360 ]; do
  curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \
    -H "X-API-Key: $NYNE_API_KEY" \
    -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json
  STATUS=$(jq -r '.data.status' /tmp/nyne_enrich.json)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Poll until complete (checks every 3s, times out after 6 min)
SECONDS_WAITED=0
while [ $SECONDS_WAITED -lt 360 ]; do
  curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \
    -H "X-API-Key: $NYNE_API_KEY" \
    -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json
  STATUS=$(jq -r '.data.status' /tmp/nyne_enrich.json)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Poll until complete (checks every 3s, times out after 6 min)
SECONDS_WAITED=0
while [ $SECONDS_WAITED -lt 360 ]; do
  curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \
    -H "X-API-Key: $NYNE_API_KEY" \
    -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json
  STATUS=$(jq -r '.data.status' /tmp/nyne_enrich.json)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Poll until complete (checks every 3s, times out after 6 min)
SECONDS_WAITED=0
while [ $SECONDS_WAITED -lt 360 ]; do
  curl -s "https://api.nyne.ai/person/enrichment?request_id=$REQUEST_ID" \
    -H "X-API-Key: $NYNE_API_KEY" \
    -H "X-API-Secret: $NYNE_API_SECRET" | nyne_parse > /tmp/nyne_enrich.json
  STATUS=$(jq -r '.data.status' /tmp/nyne_enrich.json)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
**By email:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
86% confidence
Finding
This example transmits an email address to an external third-party service for enrichment. Although aligned with the skill's purpose, it is still a privacy-relevant vulnerability because it operationalizes disclosure of personal data to an external processor without embedded consent, notice, or eligibility checks.

External Transmission

Medium
Category
Data Exfiltration
Content
**By email:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
86% confidence
Finding
This example transmits an email address to an external third-party service for enrichment. Although aligned with the skill's purpose, it is still a privacy-relevant vulnerability because it operationalizes disclosure of personal data to an external processor without embedded consent, notice, or eligibility checks.

External Transmission

Medium
Category
Data Exfiltration
Content
**By LinkedIn URL:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
85% confidence
Finding
This example sends a LinkedIn URL to a third-party enrichment endpoint. Even though a profile URL may be public, using it to aggregate and expand identity, contact, and activity data increases privacy impact beyond the original public context.

External Transmission

Medium
Category
Data Exfiltration
Content
**By LinkedIn URL:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
85% confidence
Finding
This example sends a LinkedIn URL to a third-party enrichment endpoint. Even though a profile URL may be public, using it to aggregate and expand identity, contact, and activity data increases privacy impact beyond the original public context.

External Transmission

Medium
Category
Data Exfiltration
Content
**By name + company:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
88% confidence
Finding
This example transmits name, company, and city to an external service for identity disambiguation and enrichment. The combination can uniquely identify a person and trigger broad data retrieval, making misuse for profiling or stalking more plausible if not controlled.

External Transmission

Medium
Category
Data Exfiltration
Content
**By name + company:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
88% confidence
Finding
This example transmits name, company, and city to an external service for identity disambiguation and enrichment. The combination can uniquely identify a person and trigger broad data retrieval, making misuse for profiling or stalking more plausible if not controlled.

External Transmission

Medium
Category
Data Exfiltration
Content
**With newsfeed:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
93% confidence
Finding
This example requests newsfeed data from multiple social platforms, which expands the scope from basic enrichment into collection of behavioral and activity data. In context, that materially increases sensitivity and misuse risk because recent posts and engagement metrics can reveal beliefs, habits, and other personal inferences.

External Transmission

Medium
Category
Data Exfiltration
Content
**With newsfeed:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
93% confidence
Finding
This example requests newsfeed data from multiple social platforms, which expands the scope from basic enrichment into collection of behavioral and activity data. In context, that materially increases sensitivity and misuse risk because recent posts and engagement metrics can reveal beliefs, habits, and other personal inferences.

External Transmission

Medium
Category
Data Exfiltration
Content
**Lite mode (3 credits):**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
82% confidence
Finding
This lite-mode example still sends a personal identifier to an external service, so the transmission risk remains even if the response is more limited. The context makes it somewhat less dangerous than full enrichment because output is constrained, but privacy and authorization issues still apply.

External Transmission

Medium
Category
Data Exfiltration
Content
**Lite mode (3 credits):**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
82% confidence
Finding
This lite-mode example still sends a personal identifier to an external service, so the transmission risk remains even if the response is more limited. The context makes it somewhat less dangerous than full enrichment because output is constrained, but privacy and authorization issues still apply.

External Transmission

Medium
Category
Data Exfiltration
Content
**With AI-enhanced search:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
90% confidence
Finding
This example enables AI-enhanced deep search, which explicitly broadens the search scope and can discover additional social profiles and data. That increases the chance of excessive profiling, inaccurate correlation, and collection of data beyond what the user reasonably expects.

External Transmission

Medium
Category
Data Exfiltration
Content
**With AI-enhanced search:**
```bash
curl -s -X POST "https://api.nyne.ai/person/enrichment" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $NYNE_API_KEY" \
  -H "X-API-Secret: $NYNE_API_SECRET" \
Confidence
90% confidence
Finding
This example enables AI-enhanced deep search, which explicitly broadens the search scope and can discover additional social profiles and data. That increases the chance of excessive profiling, inaccurate correlation, and collection of data beyond what the user reasonably expects.

Static analysis

No suspicious patterns detected.