Back to skill

Security audit

Dex CRM

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a disclosed Dex CRM integration, but it includes broad mutation authority and a bulk contact-archiving script that can change many CRM records without confirmation.

Install only if you are comfortable giving the agent a Dex API key that can read and modify CRM data. Use dry-run first for cleanup, review matched contacts manually, and avoid running the bulk archive script without an explicit confirmation or allowlist. Be especially careful with delete and update examples because they can permanently alter CRM history.

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

Warning
Location
scripts/dex-cleanup.py:160
Finding

Bulk CRM Contact Archival Without Required Confirmation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (31)

Tainted flow: 'req' from os.environ.get (line 75, credential/environment) → urllib.request.urlopen (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 · scripts/dex-cleanup.py (reported line 70)May include surrounding context.

python
def api_get(path):
    req = urllib.request.Request(f"{BASE}{path}", headers=HEADERS)
    with urllib.request.urlopen(req) as resp:
        return json.loads(resp.read())

def api_put(path, data):

Tainted flow: 'req' from os.environ.get (line 75, credential/environment) → urllib.request.urlopen (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 · scripts/dex-cleanup.py (reported line 76)May include surrounding context.

python
def api_get(path):
    req = urllib.request.Request(f"{BASE}{path}", headers=HEADERS)
    with urllib.request.urlopen(req) as resp:
        return json.loads(resp.read())

def api_put(path, data):

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a broad personal CRM management skill focused on contact lookup, notes, and reminders. The supplied code instead performs a narrow, destructive/administrative cleanup task: enumerating contacts and archiving those classified as junk. That is a materially different primary purpose and includes an undeclared capability—bulk archiving contacts. While both involve Dex contacts and the same API key/resource, the behavior does not match the user-facing CRM functions described.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

Copy the SKILL.md file to your Clawdbot skills directory:

bash
cp SKILL.md ~/.clawdbot/skills/dex-crm/SKILL.md
# or for workspace installs:
cp SKILL.md ~/clawd/skills/dex-crm/SKILL.md

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

Copy the SKILL.md file to your Clawdbot skills directory:

bash
cp SKILL.md ~/.clawdbot/skills/dex-crm/SKILL.md
# or for workspace installs:
cp SKILL.md ~/clawd/skills/dex-crm/SKILL.md

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest describes the skill as managing contacts, notes, and reminders, with enumerated use cases limited to searching/browsing contacts, adding notes, creating/checking reminders, and looking up contact details. The README adds materially broader behaviors: creating entirely new contacts and archiving existing contacts, which are write operations not reflected in the manifest’s stated use cases.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest frames the skill around routine CRM tasks like searching contacts, adding notes, creating/checking reminders, and viewing details. The README documents an included script that automatically identifies and archives 'junk/newsletter contacts' in bulk, which is a separate cleanup/triage capability not described in the manifest.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill requires both network access and a secret from the environment (DEX_API_KEY) but does not declare any explicit tool scope or permissions boundary. That omission increases the chance the skill can be invoked with broader capabilities than intended, reducing reviewability and making misuse of the API key or remote operations harder to govern.

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

bash
# List contacts (paginated)
curl -s -H "Content-Type: application/json" \
  -H "x-hasura-dex-api-key: $DEX_API_KEY" \
  "https://api.getdex.com/api/rest/contacts?limit=10&offset=0"

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest frames the skill as a manager for lookup/search, notes, and reminders, but the documented contact endpoints include create, update, and delete operations. This broader destructive capability is security-relevant because a user or agent may invoke the skill expecting read-oriented CRM assistance while the skill can also alter or permanently remove records.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest advertises adding notes and creating/checking reminders, but the documented behavior also supports updating and deleting notes and reminders. Hidden destructive/editing functionality can lead to unintended modification or loss of CRM history if a caller assumes the skill is limited to additive actions.

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

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 31)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 36)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 41)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 47)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 53)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 58)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 67)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 72)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 78)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 84)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 89)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 98)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_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 · SKILL.md (reported line 104)May include surrounding context.

md
print("ERROR: DEX_API_KEY not set")
    sys.exit(1)

BASE = "https://api.getdex.com/api/rest"
HEADERS = {
    "Content-Type": "application/json",
    "x-hasura-dex-api-key": API_KEY

Static analysis

No suspicious patterns detected.