Back to skill

Security audit

Geopolitical Analyst

Security checks for vulnerabilities and agentic risk

Overview

This skill is related to geopolitical analysis, but it needs Review because it misstates its network use, credential requirements, packaged files, and includes operational dual-use sanctions-evasion guidance.

Install only if you are comfortable with live queries leaving your machine and with optional ACLED credentials being handled by the included script. Use a virtual environment, avoid passing secrets on the command line, and treat the sanctions-evasion and verification modules as analytical references that need human judgment and legal/compliance guardrails.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_intelligence.py:164
Finding

ACLED Credentials Exposed Through Request URLs and Error Output

Content
View full analysis
dict: try: req = urllib.request.Request(url, headers={"User-Agent": "geopolitical-analyst/2.0"}) with urllib.request.urlopen(req, timeout=timeout) as r: return json.loads(r.read().decode()) except Exception as e: return {"error": str(e), "url": url} ``` ```python def acled_events(country: str, api_key: str, email: str, limit: int = 20) -> dict: p = { "key": api_key, "email": email, "country": country, "limit": limit, "fields": "event_date|event_type|sub_event_type|actor1|actor2|location|admin1|fatalities|notes|source", "format": "json", } return _get(f"{ACLED_BASE}?{urllib.parse.urlencode(p)}") ``` ```python parser.add_argument("--acled-key", default=None) parser.add_argument("--acled-email", default=None) ``` ```python if args.acled_key and args.acled_email and args.country: results["sources"]["acled"] = acled_events( args.country, args.acled_key, args.acled_email ) ``` ```python print(json.dumps(results, indent=2, ensure_ascii=False)) ``` ### Technical Analysis The ACLED API key and account email are inserted directly into a GET request's query string. Credential-bearing URLs may be retained in intermediary proxy logs, HTTP diagnostic systems, process monitoring, application telemetry, or other URL-capturing infrastructure. The error-handling behavior creates a direct disclosure path. If `urlopen()` raises an exception, `_get()` returns the complete URL without redacting the `key` or `email` parameters. The returned object is inserted into `results` and subsequently printed as JSON. Consequently, ordinary failures such as timeouts, TLS err ...[truncated 2182 chars]
Remediation
View remediation
str: parsed = urllib.parse.urlsplit(url) params = urllib.parse.parse_qsl(parsed.query, keep_blank_values=True) redacted = [ (name, "[REDACTED]" if name.lower() in {"key", "email"} else value) for name, value in params ] return urllib.parse.urlunsplit( (parsed.scheme, parsed.netloc, parsed.path, urllib.parse.urlencode(redacted), parsed.fragment) ) ``` 3. **Do not include raw request URLs in user-visible errors** ```python except Exception as e: return { "error": str(e), "endpoint": "api.acleddata.com/acled/read/" } ``` 4. **Avoid command-line secret input** - Read the key from a protected environment variable, restricted configuration file, or secret-management facility. - If interactive entry is needed, use `getpass.getpass()` so the credential is not echoed. - Do not print secret values or include them in usage examples. 5. **Control output and logging** - Add centralized secret filtering before JSON serialization. - Ensure exception messages are sanitized because some HTTP exceptions can also contain the request URL. - Document that query topics, countries, app names, and optional ACLED account data are transmitted to third-party services. 6. **Credential response** - Advise users who have captured failed-request output to revoke or rotate the affected ACLED key. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unnecessary and Unpinned Third-Party Dependencies Expand the Supply-Chain Attack Surface

Content
View full analysis
=2.28.0 python-dateutil>=2.8.2 ``` The installation instructions execute dependency resolution: ```bash pip install -r requirements.txt ``` ### Technical Analysis The artifact's only executable Python file, `scripts/fetch_intelligence.py`, uses standard-library modules such as `urllib.request`, `urllib.parse`, and `datetime`. It does not import either `requests` or `python-dateutil`. Despite this, users are instructed to install both packages. This violates minimum-dependency principles and unnecessarily permits third-party installation and build logic to execute in the user's Python environment. The constraints specify only minimum versions. Therefore, package resolution may select arbitrary later releases available from the configured package index. The installation is not reproducible, and the project provides no hashes or lock file to verify package integrity. Although the named dependencies are established packages and no malicious dependency was identified in the reviewed artifact, the broad constraints unnecessarily expose users to future compromised releases, unsafe transitive dependencies, or untrusted package-index configuration. ### Attack Path 1. A user follows the documented setup procedure and runs `pip install -r requirements.txt`. 2. Pip contacts the package index configured in the user's environment. 3. The `>=` constraints allow pip to select any available compatible future version of each package and its dependencies. 4. Package installation or build logic executes in the user's Python environment. 5. If the selected index, release, distribution artifact, or transitive dependency is compromised, attacker-controlled installation code can execute with ...[truncated 824 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (35)

Harmful Content Injection

Critical
Category
Prompt Injection
Confidence
95% confidence
Finding

This content may contain harmful instructions that could cause physical harm if followed. CRITICAL: Review carefully before use.

Content

Scanner excerpt · references/game-theory.md (reported line 41)May include surrounding context.

md
**Why:** Defecting is always better for each actor individually, even though both cooperating is better for both together

**Real-world example:** Arms race
- Cooperate = both limit weapons → both safe, cheaper
- Defect = build weapons → you're stronger, but opponent responds
- Rational = both build (costly, but you're not left behind)
- Result = expensive arms race that benefits neither

**Escape route:** Repeated interactions (play again next round) → reputation becomes valuable → cooperation becomes rational

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documentation materially overstates and misrepresents behavior: it claims no API keys are required, broad live intelligence capabilities, and a 39-module framework, while the underlying implementation reportedly requires ACLED credentials and offers a narrower feature set. Security-relevant misrepresentation is dangerous because operators may trust the skill under false assumptions, leading to unexpected credential handling, data flows, or deployment in unsuitable environments.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The security section states that no data is sent to external servers, but the skill explicitly fetches live data from multiple public APIs. This contradiction is security-significant because users may rely on the statement when evaluating privacy, network exposure, or compliance requirements, and could deploy the skill in restricted environments under false premises.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

This document provides structured, operationally useful guidance on sanctions-evasion methods, including effectiveness, detection difficulty, cost, and example jurisdictions, without any legal/compliance framing or misuse guardrails. In a live geopolitical analysis skill, this can materially assist users in planning or optimizing evasion of sanctions, money movement, concealment, and proxy trade rather than merely understanding policy effects.

Content

No source excerpt is available for this finding.

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

Scanner excerpt · references/sources.md (reported line 20)May include surrounding context.

md
## Source Bias Matrix

All media outlets carry institutional perspectives shaped by ownership, funding, and political context. This matrix documents those perspectives without judging their legitimacy. Apply when evaluating GDELT article sources and when two sources contradict each other.

**Framing rule:** State-funded media from any country reflects that government's foreign policy positions. This is equally true for US, Russian, Chinese, Iranian, Gulf, and European state media. No state media is treated as more neutral than another by default.

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The template explicitly says worst-case assumptions are justified solely from refusal of verification. That is dangerous because it operationalizes a one-sided escalation heuristic, allowing missing access or non-cooperation to be converted directly into the most severe interpretation without proportional evidence.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill advertises network-backed functionality but does not declare any explicit tool scope or permissions boundary. That omission can mislead users and hosting agents about the skill’s external communication behavior, weakening informed consent and policy enforcement around network access.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger text, 'Triggered: In forward-looking assessments (Scenario modeling, Causal Chains)', is broad enough that this reference module could activate in many loosely related contexts. Overly broad activation conditions can cause unnecessary inclusion of speculative AI-geopolitics framing, which may bias outputs, expand the model's operating scope, or increase prompt-surface area for downstream instruction collisions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The line states the skill is 'Triggered' in workflow steps without specifying exact invocation conditions, boundaries, or negative examples. In a markdown skill file, this can create uncertainty about when the skill should activate versus when alliance-related content should not invoke it.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger text 'Triggered: In Step 5 (Actor Assessment) for regime stability analysis' is broad and underspecified, so an orchestrator or agent may invoke this module in loosely related contexts without clear boundaries. In a geopolitical intelligence skill, that can cause the model to over-apply coup and military-loyalty analysis to general political tasks, increasing the chance of scope creep, biased outputs, or inappropriate handling of sensitive political assessments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This section explicitly catalogs asymmetric retaliation options such as hacking infrastructure and supporting dissidents/disinformation, and presents them as effective strategic choices without any safety framing, legal/ethical caveats, or clear restriction to defensive risk assessment. In a live geopolitical intelligence skill, that omission increases the chance the material could be repurposed to justify, normalize, or operationalize harmful real-world retaliation tactics.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/credible-commitment.md (reported line 111)May include surrounding context.

md
- Other actor can't force compliance
- Mutual benefit evaporates

**Example:** Non-binding agreement with no verification

---

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 · references/economic-indicators.md (reported line 20)May include surrounding context.

bash
# Frankfurter API (ECB-backed, free, no key)
# Latest rate
GET https://api.frankfurter.app/latest?from=IRR&to=USD

# Historical (detect depreciation trend)
GET https://api.frankfurter.app/2024-01-01..?from=IRR&to=USD

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 · references/economic-indicators.md (reported line 23)May include surrounding context.

bash
# Frankfurter API (ECB-backed, free, no key)
# Latest rate
GET https://api.frankfurter.app/latest?from=IRR&to=USD

# Historical (detect depreciation trend)
GET https://api.frankfurter.app/2024-01-01..?from=IRR&to=USD

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 · references/economic-indicators.md (reported line 61)May include surrounding context.

Commodity Prices (Conflict-Relevant)

bash
# World Bank Commodity Data (free)
GET https://api.worldbank.org/v2/en/indicator/PNRG_MBD?format=json

# FRED (US Federal Reserve — free, no key for many series)
GET https://fred.stlouisfed.org/graph/fredgraph.csv?id=DCOILWTICO  # WTI crude oil

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

This markdown file includes a reusable template that explicitly asks users to define intelligence collection priorities and a recommended approach for gathering intelligence. Under the markdown-specific SQP-2 criteria, content that could affect privacy or system integrity should include warnings, but there is no disclosure about handling sensitive information lawfully, ethically, or with appropriate authorization.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The instruction to use the label "genocide" only after an ICJ ruling imposes a rigid terminology constraint that can bias outputs and suppress uncertainty or user-directed framing. In a geopolitical intelligence skill, this is risky because it can systematically shape analysis around a contested legal threshold, causing the agent to omit widely reported allegations or fail to present multiple legally relevant framings before a final adjudication exists.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/perspectives.md (reported line 56)May include surrounding context.

md
### Perspective 3: Regional Actor View
**Primary concern:** Regional balance of power, economic development, avoiding great-power domination, local legitimacy

**Threat definition:** Neighbor state aggression, great-power abandonment, exclusion from great-power deals made without consent

**Success criteria:**
- Territorial integrity and noninterference in internal affairs

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger text is broad and open-ended: it activates on major powers' reactions, compromise assessment, and alignment prediction without defining concrete input conditions or limits. In an agent skill, ambiguous activation boundaries can cause the module to run in unintended contexts, leading to over-application of geopolitical framing and potentially skewed or unnecessary analysis in downstream outputs.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The trigger is described only as 'Between assessments (proactive monitoring, not reactive),' which does not clearly define when the skill should or should not be used. This lacks specific activation phrases, scope boundaries, or exclusion conditions, increasing the risk of unintended invocation in ordinary monitoring contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Equating refusal of inspection or verification with guilt encourages the agent to collapse ambiguity into culpability without considering legitimate counter-explanations such as sovereignty concerns, operational security, or negotiation tactics. This can produce false accusations and adversarial escalation when the skill is used for live geopolitical assessment.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/verification-challenge.md (reported line 103)May include surrounding context.

md
When an actor makes **unverifiable claims**, what does that tell you?

### Signal 1: Claims Require No Verification
**Observation:** Actor makes claims about intentions, plans, internal politics
**Implication:** Claims are cheap talk; focus on actions not words

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The document ends with a blanket rule: if a claim cannot be verified, it should not be trusted. In geopolitical analysis, many important claims are uncertain rather than strictly unverifiable, so this framing can systematically bias the agent toward dismissing nuanced evidence and over-weighting only observable signals.

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

md
from pathlib import Path


GDELT_BASE = "https://api.gdeltproject.org/api/v2/doc/doc"
ACLED_BASE = "https://api.acleddata.com/acled/read/"
RELIEFWEB_BASE = "https://api.reliefweb.int/v2/reports"
FRANKFURTER_BASE = "https://api.frankfurter.app"

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/fetch_intelligence.py (reported line 21)May include surrounding context.

python
from pathlib import Path


GDELT_BASE = "https://api.gdeltproject.org/api/v2/doc/doc"
ACLED_BASE = "https://api.acleddata.com/acled/read/"
RELIEFWEB_BASE = "https://api.reliefweb.int/v2/reports"
FRANKFURTER_BASE = "https://api.frankfurter.app"

Static analysis

No suspicious patterns detected.