Back to skill

Security audit

Sorsa API

Security checks for vulnerabilities and agentic risk

Overview

This skill uses a disclosed Sorsa API key to retrieve public X data, with no evidence of hidden collection, account changes, or background activity.

Use a dedicated Sorsa key and understand that Sorsa receives your searches. Set page limits to control request charges, and use reviewed dependency versions. The supplied metadata does not establish publisher identity.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (31)

Tainted flow: 'API_KEY' from os.environ (line 14, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · examples/search_with_pagination.py (reported line 25)May include surrounding context.

python
if cursor:
        body["next_cursor"] = cursor

    resp = requests.post(
        URL,
        headers={"ApiKey": API_KEY, "Content-Type": "application/json"},
        json=body,

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .env.example (reported line 1)May include surrounding context.

text
# Copy this file to .env and fill in your key.
# Get a key at https://api.sorsa.io/overview
SORSA_API_KEY=your_api_key_here

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · README.md (reported line 84)May include surrounding context.

md
├── SKILL.md                       # the skill (frontmatter + instructions)
├── README.md
├── LICENSE
├── .env.example                   # copy to .env and add your key
├── requirements.txt
├── .gitignore
├── references/

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · .env.example (reported line 2)May include surrounding context.

text
# Copy this file to .env and fill in your key.
# Get a key at https://api.sorsa.io/overview
SORSA_API_KEY=your_api_key_here

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, network, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

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 64)May include surrounding context.

Search recent popular tweets (POST with a JSON body):

bash
curl -X POST "https://api.sorsa.io/v3/search-tweets" \
  -H "ApiKey: $SORSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "from:elonmusk min_faves:1000", "order": "popular"}'

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 · examples/curl_snippets.sh (reported line 3)May include surrounding context.

sh
#!/usr/bin/env bash
# Sorsa API v3 - common requests. Set SORSA_API_KEY first.
#   export SORSA_API_KEY=your_key   # https://api.sorsa.io/overview
set -euo pipefail

BASE="https://api.sorsa.io/v3"

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 · examples/quickstart.py (reported line 3)May include surrounding context.

python
"""Quickstart: fetch one X/Twitter profile via the Sorsa API.

    export SORSA_API_KEY=your_key   # from https://api.sorsa.io/overview
    python quickstart.py elonmusk
"""

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 4)May include surrounding context.

md
# Sorsa Twitter / X API Skill

A SKILL.md agent skill that lets Claude, Cursor, Codex, and other SKILL.md-compatible
AI agents pull public **Twitter / X data** through the [Sorsa API](https://api.sorsa.io/overview):
profiles, tweets, followers, search, mentions, Communities, Lists, and crypto-focused
influence analytics (Sorsa Score).

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 59)May include surrounding context.

Usage

  1. Get an API key at api.sorsa.io/overview.
  2. Expose it to your environment:
    bash
    export SORSA_API_KEY=your_key
    

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 100)May include surrounding context.

md
## Links

- API plans and dashboard: https://api.sorsa.io/overview
- Docs: https://docs.sorsa.io/ (LLM index: https://docs.sorsa.io/llms.txt)
- OpenAPI spec: https://docs.sorsa.io/v3/openapi.json
- Analytics app: https://app.sorsa.io

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 14)May include surrounding context.

md
## Setup

- **Base URL:** `https://api.sorsa.io/v3`
- **Auth:** every request needs an API key in the `ApiKey` header. There is no OAuth and no app registration.
- **Get a key:** sign up and pick a plan at https://api.sorsa.io/overview (the key appears in the dashboard under "Apikeys").
- **Convention:** read the key from the `SORSA_API_KEY` environment variable. Never hardcode it in committed code.

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 16)May include surrounding context.

md
- **Base URL:** `https://api.sorsa.io/v3`
- **Auth:** every request needs an API key in the `ApiKey` header. There is no OAuth and no app registration.
- **Get a key:** sign up and pick a plan at https://api.sorsa.io/overview (the key appears in the dashboard under "Apikeys").
- **Convention:** read the key from the `SORSA_API_KEY` environment variable. Never hardcode it in committed code.

Minimal check:

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 21)May include surrounding context.

Minimal check:

bash
curl -H "ApiKey: $SORSA_API_KEY" "https://api.sorsa.io/v3/info?username=elonmusk"

Choosing an endpoint

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 54)May include surrounding context.

md
user one of three ways.** Most user endpoints accept exactly ONE of: `username` (handle without @), `user_id` (numeric, stable), or `user_link` (profile URL). Prefer `user_id` when you have it, because usernames can change but IDs never do.

**2. Paginate via cursor.** List endpoints return `next_cursor`. If it is null or absent, you have reached the end. To get the next page, pass that value back. The parameter is named `next_cursor` in both cases: for GET list endpoints (`/followers`, `/follows`, `/verified-followers`, `/list-*`) it is a query parameter; for POST endpoints it goes in the JSON body. This matches the OpenAPI spec at https://api.sorsa.io/v3/swagger.json (there is no `cursor` parameter). Page sizes: tweets, comments and quotes up to 20; followers and following up to 200.

**3. Batch when you can.** For many users or tweets, use `GET /info-batch` (up to 100 accounts) or `POST /tweet-info-bulk` (up to 100 tweets) instead of looping single calls. It is cheaper and faster.

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 64)May include surrounding context.

Search recent popular tweets (POST with a JSON body):

bash
curl -X POST "https://api.sorsa.io/v3/search-tweets" \
  -H "ApiKey: $SORSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "from:elonmusk min_faves:1000", "order": "popular"}'

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 74)May include surrounding context.

python
import os, requests
r = requests.get(
    "https://api.sorsa.io/v3/info",
    headers={"ApiKey": os.environ["SORSA_API_KEY"]},
    params={"username": "elonmusk"},
)

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 111)May include surrounding context.

md
## Getting access

If the user does not have a key yet, point them to https://api.sorsa.io/overview to pick a plan (the entry tier starts at 10K requests). Pricing is per request and sits well below the official X API for the same volume.

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 · examples/curl_snippets.sh (reported line 6)May include surrounding context.

sh
#   export SORSA_API_KEY=your_key   # https://api.sorsa.io/overview
set -euo pipefail

BASE="https://api.sorsa.io/v3"
AUTH="ApiKey: ${SORSA_API_KEY}"
JSON="Content-Type: application/json"

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 · examples/quickstart.py (reported line 15)May include surrounding context.

python
username = sys.argv[1] if len(sys.argv) > 1 else "elonmusk"

resp = requests.get(
    "https://api.sorsa.io/v3/info",
    headers={"ApiKey": os.environ["SORSA_API_KEY"]},
    params={"username": username},
    timeout=60,

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 · examples/search_with_pagination.py (reported line 15)May include surrounding context.

python
QUERY = sys.argv[1] if len(sys.argv) > 1 else "ethereum"
MAX_PAGES = 3
API_KEY = os.environ["SORSA_API_KEY"]
URL = "https://api.sorsa.io/v3/search-tweets"

cursor = None
seen = 0

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 · references/api-reference.md (reported line 3)May include surrounding context.

md
# Sorsa API v3 Reference

- **Base URL:** `https://api.sorsa.io/v3`
- **Auth:** `ApiKey: YOUR_API_KEY` header on every request.
- **Docs:** https://docs.sorsa.io/ (LLM index: https://docs.sorsa.io/llms.txt)
- **OpenAPI:** https://docs.sorsa.io/v3/openapi.json (Swagger: https://api.sorsa.io/v3/swagger.json)

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 · references/api-reference.md (reported line 6)May include surrounding context.

md
- **Base URL:** `https://api.sorsa.io/v3`
- **Auth:** `ApiKey: YOUR_API_KEY` header on every request.
- **Docs:** https://docs.sorsa.io/ (LLM index: https://docs.sorsa.io/llms.txt)
- **OpenAPI:** https://docs.sorsa.io/v3/openapi.json (Swagger: https://api.sorsa.io/v3/swagger.json)

HTTP status codes (all endpoints): `200` OK, `400` bad params, `401` bad/missing key, `403` forbidden, `404` not found, `429` rate limited, `500` server error. Errors return `{"message": "..."}`.

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 · scripts/sorsa_client.py (reported line 7)May include surrounding context.

python
passed explicitly. Requires `requests` (pip install requests).

Docs: https://docs.sorsa.io/ (LLM index: https://docs.sorsa.io/llms.txt)
Get a key: https://api.sorsa.io/overview
"""

from __future__ import annotations

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 · scripts/sorsa_client.py (reported line 45)May include surrounding context.

python
if not self.api_key:
            raise RuntimeError(
                "No API key. Set SORSA_API_KEY or pass api_key=. "
                "Get one at https://api.sorsa.io/overview"
            )
        self.base_url = base_url.rstrip("/")
        self.max_retries = max_retries