Back to skill

Security audit

Go Stargazing Trip

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches stargazing route planning, but it needs review because real-weather retries disable HTTPS certificate checks and the install uses an unpinned Python package.

Review before installing if you will use real-weather mode for actual travel decisions. The skill should keep certificate verification enabled on every weather request and pin lunarcalendar to a reviewed version. Treat its recommendations as planning support, not final safety or route advice.

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

Error
Location
scripts/go_stargazing_engine/weather.py:75
Finding

TLS Certificate Verification Disabled During Weather API Retries

Content
View full analysis
dict: context = ssl._create_unverified_context() if insecure else None req = urllib.request.Request( url, headers={ "User-Agent": "go-stargazing/1.x (+Open-Meteo client)", "Accept": "application/json", }, ) with urllib.request.urlopen(req, timeout=30, context=context) as resp: return _extract_first_json_object(resp.read().decode("utf-8")) def fetch_openmeteo_payload(point: SamplePoint, target_dt: datetime, timezone: str, model: Optional[str] = None, max_retries: int = 2, retry_delay_s: float = 0.8) -> dict: # Query target date + next date, so the night window can include next-morning hours. end_date = (target_dt.date() + timedelta(days=1)).isoformat() params = { "latitude": point.lat, "longitude": point.lng, "hourly": "cloud_cover,relative_humidity_2m,visibility,wind_speed_10m,dew_point_2m,precipitation,cloud_base_height,weather_code", "timezone": timezone, "start_date": target_dt.date().isoformat(), "end_date": end_date, } if model and model != "best_match": params["models"] = model url = OPEN_METEO_FORECAST_URL + "?" + urllib.parse.urlencode(params) last_exc: Optional[Exception] = None total_attempts = max(1, max_retries + 1) for attempt in range(total_attempts): point.fetch_attempts = attempt + 1 insecure = attempt > 0 try: payload = _fetch_json_via_urllib(url, insecure=insecure) point.fetch_recovered = attempt > 0 point.fetch_error_type = None point.fetch_error_message = None return payload except Exception as exc: last ...[truncated 2475 chars]
Remediation
View remediation
dict: req = urllib.request.Request( url, headers={ "User-Agent": "go-stargazing/1.x (+Open-Meteo client)", "Accept": "application/json", }, ) with urllib.request.urlopen(req, timeout=30) as resp: return _extract_first_json_object(resp.read().decode("utf-8")) ``` 3. Preserve certificate and hostname verification during all retry attempts. 4. Treat TLS failures as hard failures rather than retrying with weaker security. 5. Retain bounded exponential backoff for transient timeout and server errors, but distinguish those conditions from certificate-validation errors. 6. If a custom trust store is required, construct a verified context using `ssl.create_default_context(cafile=...)` and maintain the CA bundle securely. 7. Add a regression test that replaces the endpoint with a server using an untrusted certificate and verifies that every attempt fails closed. 8. Consider validating the expected response schema before forecast values enter the scoring engine. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:6
Finding

Unpinned Third-Party Python Dependency

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (40)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed external network access to a weather API materially changes the risk profile of the skill. Even if network calls are legitimate for weather retrieval, hiding them behind a description focused on route continuity can lead to over-permissioning, unexpected data egress, and review failures.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The docstring says the function returns the UTC datetime when the sun reaches the requested altitude, but the implementation converts to local time, discards the computed sunrise fields, and finally returns sunset_local, which is forced to local midnight. This is an active contradiction between the documented intent and the actual behavior, not merely an incomplete comment.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

On retry, the code sets insecure = attempt > 0 and _fetch_json_via_urllib then uses ssl._create_unverified_context(), disabling certificate verification for HTTPS requests. This allows a man-in-the-middle attacker to intercept or tamper with forecast responses, causing route recommendations to be based on forged data and undermining transport security.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The retry path silently disables HTTPS certificate verification without any user warning, which weakens security exactly when connection problems occur. An active network attacker can exploit this fallback to present an invalid certificate and still supply attacker-controlled weather data, defeating the protections users expect from HTTPS.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest describes a skill for evaluating multi-night route continuity, transfer distance, lodging benefits, executability, and producing main/alternate/remote route recommendations with risk notes. This file instead performs date conversion and moon-phase estimation from command-line arguments, with no route-planning, continuity analysis, or itinerary recommendation logic present.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill advertises executable capabilities (file read, network, shell via referenced scripts/dependencies) but does not declare any tool scope such as permissions or allowed-tools. That creates an unnecessary trust gap: a caller cannot tell what the skill may invoke, and a broad runtime may grant more access than the itinerary-planning use case needs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest description and the entire user-facing markdown content are written exclusively in Chinese, with no indication that users may choose another language or that the skill is intentionally restricted to a Chinese-only regional context. This creates a natural-language locale policy concern because it implicitly enforces one language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file title and all operative instructions are written as mandatory guidance in Chinese, establishing a fixed language for the skill's behavior. There is no indication that users may choose another language or that the Chinese-only constraint is optional or justified as a region-specific requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The file presents the skill specification entirely in Chinese and gives no indication that users may choose another language or locale. Under the policy, forcing a specific language without user opt-in is a natural-language locale violation unless the constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest says this skill is for combining per-night candidate results into multi-night main/backup/remote routes and feasibility judgments. But this file defines a much broader go-stargazing pipeline including nationwide coarse screening, second-round weather querying, polygon sampling, clustering, and regional recommendation generation, which goes beyond merely consuming nightly candidates for route continuity.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown document is entirely written as a Chinese-only output schema and repeatedly instructs user-facing layers to use Chinese labels and phrasing. There is no indication that users can choose another language or that the Chinese-only constraint is limited to a justified region-specific deployment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

These lines prescribe specific Chinese translations for user-facing output fields such as '可拍窗口' and '推荐级别'. This is a natural-language locale requirement imposed by the skill documentation, but no user opt-in or alternative locale path is provided.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The file’s natural-language instructions are entirely in Chinese, including the title and all operational guidance. Under the policy, forcing a specific language without user opt-in or a documented regional justification is a language/locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

This markdown file is entirely written as a Chinese-language operating specification and does not indicate that the user may choose another language or locale. Under the language/locale policy rule, a skill that effectively constrains interaction to a specific language without opt-in can be a natural-language policy concern unless the regional limitation is explicitly justified.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The entire skill content, including the required output format, is written as Chinese-only guidance and does not indicate that users may choose another language. Under the policy rule for natural-language constraints, this can be a locale/language policy violation because it implicitly fixes the interaction language without opt-in or justification.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/check_reply_regressions.py (reported line 168)May include surrounding context.

python
def run_json(command: List[str]) -> Dict[str, Any]:
    proc = subprocess.run(command, capture_output=True, text=True)
    if proc.returncode != 0:
        raise RuntimeError(f"command failed ({proc.returncode}): {' '.join(command)}\nSTDERR:\n{proc.stderr[-1200:]}")
    try: