Back to skill

Security audit

Skylight

Security checks for vulnerabilities and agentic risk

Overview

This skill is mostly coherent for controlling a Skylight calendar, but it asks users to handle account passwords and reusable tokens in risky ways without enough guardrails.

Install only if you are comfortable giving the skill Skylight account-level access. Keep SKYLIGHT_URL fixed to the official app.ourskylight.com endpoint, treat SKYLIGHT_PASSWORD and SKYLIGHT_TOKEN like passwords, avoid storing them in shared shell history or source files, and avoid the proxy-capture method unless you fully understand the risks of trusting an interception certificate.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:22
Finding

Unrestricted API Base URL Can Exfiltrate Skylight Credentials and Authorization Tokens

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:22-63
Additional Documentation Location: README.md:7-22
Vulnerability Type: User-controlled credential transmission destination
Risk Level: High
Category: T09: Insecure Skill Coding Practices

Vulnerable Code

bash
Set environment variables:
- `SKYLIGHT_URL`: Base URL (default: `https://app.ourskylight.com`)
- `SKYLIGHT_FRAME_ID`: Your frame (household) ID — find this by logging into [ourskylight.com](https://ourskylight.com/), clicking your calendar, and copying the number from the URL (e.g., `4197102` from `https://ourskylight.com/calendar/4197102`)

**Authentication (choose one):**

Option A - Email/Password (recommended):
- `SKYLIGHT_EMAIL`: Your Skylight account email
- `SKYLIGHT_PASSWORD`: Your Skylight account password

Option B - Pre-captured token:
- `SKYLIGHT_TOKEN`: Full Authorization header value (e.g., `Basic abc123...`)

## Authentication

### Option A: Login with Email/Password (Recommended)

Generate a token by logging in with email and password:

```bash
# Login and get user credentials
LOGIN_RESPONSE=$(curl -s -X POST "$SKYLIGHT_URL/api/sessions" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "'"$SKYLIGHT_EMAIL"'",
    "password": "'"$SKYLIGHT_PASSWORD"'",
    "name": "",
    "phone": "",
    "resettingPassword": "false",
    "textMeTheApp": "true",
    "agreedToMarketing": "true"
  }')

# Extract user_id and user_token from response
USER_ID=$(echo "$LOGIN_RESPONSE" | jq -r '.data.id')
USER_TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.data.attributes.token')

# Generate Basic auth token (base64 of user_id:user_token)
SKYLIGHT_TOKEN="Basic $(echo -n "${USER_ID}:${USER_TOKEN}" | base64)"

# Now use $SKYLIGHT_TOKEN for all API requests
text

The same unsafe configuration model is documented in `README.md`:

```bash
export SKYLIGHT_EMAIL="your_email@example.com"
export SKYLIGHT_PASSWORD="your_password"
export SKYLIGHT_FRAME_ID="your_frame_id"
export 
...[truncated 3006 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove arbitrary origin configuration where possible. Hardcode the supported API origin:

    bash
    SKYLIGHT_URL="https://app.ourskylight.com"
    
  2. Strictly validate any necessary override. Parse and compare the complete destination before handling credentials. Require:

    • Scheme: https
    • Hostname: app.ourskylight.com
    • Expected default port only
    • No embedded username or password
    • No untrusted path prefix
    • No lookalike, suffix, or subdomain matching
  3. Constrain curl transport behavior. Use options such as:

    bash
    curl --proto '=https' --proto-redir '=https' --max-redirs 0 ...
    

    Redirects should remain disabled for requests containing passwords or authorization headers unless every redirect target is independently validated.

  4. Fail closed before accessing secrets. Validate the destination before expanding or reading SKYLIGHT_EMAIL, SKYLIGHT_PASSWORD, or SKYLIGHT_TOKEN.

  5. Prefer limited, revocable authentication. If supported by the service, use an official OAuth flow or narrowly scoped API token instead of collecting the account password or using a broad reusable token.

  6. Protect credentials operationally. Retrieve secrets from a dedicated secret manager, avoid printing responses or authorization headers, prevent shell tracing while handling secrets, and unset temporary variables after use.

  7. Document token handling clearly. State that Base64 is encoding rather than encryption, that the complete Basic authorization value must be treated as a password, and that users should revoke or rotate it after suspected disclosure.

  8. Harden the proxy-capture alternative. Recommend only trusted proxy software in an isolated environment, removal of the interception CA immediately afterward, and revocation of captured tokens when no longer needed.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README directs users to provide raw account credentials and even to capture reusable authentication tokens via an HTTPS proxy, but it does not clearly warn that these secrets grant account access and must be protected from logs, shell history, screenshots, shared terminals, or source control. In a reverse-engineered unofficial API context, encouraging manual token interception increases the chance of credential theft, session compromise, or accidental disclosure to third parties.

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 · SKILL.md (reported line 10)May include surrounding context.

md
emoji: 📅
    requires:
      bins:
        - curl
      env:
        - SKYLIGHT_FRAME_ID
    primaryEnv: SKYLIGHT_EMAIL

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill asks users to handle highly sensitive secrets including email/password and reusable Authorization tokens, but provides no warnings about secure storage, redaction, rotation, or the risks of intercepted credentials. In this context, the omission materially increases the chance of accidental exposure through shell history, logs, screenshots, copied commands, or insecure environment handling.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill explicitly instructs users to install a TLS-intercepting proxy, trust a custom root certificate, and capture live Authorization headers from app traffic. That encourages credential/token interception and weakens transport security on the device running the proxy, creating risk of account compromise and broader man-in-the-middle exposure beyond this service.

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 · SKILL.md (reported line 90)May include surrounding context.

List events

bash
curl -s "$SKYLIGHT_URL/api/frames/$SKYLIGHT_FRAME_ID/calendar_events?date_min=2025-01-27&date_max=2025-01-31" \
  -H "Authorization: $SKYLIGHT_TOKEN" \
  -H "Accept: application/json"

Static analysis

No suspicious patterns detected.