Back to skill

Security audit

Weather (Open-Meteo 全免费能力版)

Security checks for vulnerabilities and agentic risk

Overview

This weather skill is a coherent Open-Meteo CLI that sends requested locations to weather APIs and keeps a short local cache, with no evidence of hidden control, credential access, or persistence beyond caching.

Install only if you are comfortable sending queried city names or coordinates to Open-Meteo and storing recent API responses in a local cache. Use coarse locations when privacy matters, keep WEATHER_CACHE_DIR in a trusted path, and consider removing the unused marine pollen request if minimizing outbound calls is important.

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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (12)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill documentation describes capabilities that include environment access, file read/write, and network use, but it does not declare any explicit tool scope or permission boundaries. That increases the chance the runtime grants broader access than users expect, making misuse or overreach harder to audit and constrain.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The natural-language instructions and operational guidance in this file are presented in Chinese, which can amount to a forced language choice if users are not given an alternative or opt-in. The policy allows locale constraints when clearly documented and justified, but this file does not indicate that the skill is region-specific or Chinese-only by design.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill sends user-supplied city names or precise coordinates to third-party Open-Meteo endpoints, but the documentation does not clearly warn users that this data leaves the local environment. Location data can be sensitive, especially when coordinates, batch queries, or historical lookups reveal travel patterns or places of interest.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This endpoint use represents real external data transmission to a third-party service. In context, outbound requests are the skill's intended function, but they still expose user-provided location queries and metadata to an external provider, which matters for privacy and compliance.

Content

Scanner excerpt · SKILL.md (reported line 85)May include surrounding context.

md
## 数据源(全部免 key)

- `https://geocoding-api.open-meteo.com/v1/search`
- `https://api.open-meteo.com/v1/forecast`
- `https://api.open-meteo.com/v1/elevation`
- `https://archive-api.open-meteo.com/v1/archive`
- `https://historical-forecast-api.open-meteo.com/v1/forecast`

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This second documented endpoint likewise confirms external transmission to Open-Meteo infrastructure. The behavior is contextually expected for a weather skill, but without explicit disclosure and scoping it still creates privacy exposure and dependency on third-party handling of user location data.

Content

Scanner excerpt · SKILL.md (reported line 86)May include surrounding context.

md
- `https://geocoding-api.open-meteo.com/v1/search`
- `https://api.open-meteo.com/v1/forecast`
- `https://api.open-meteo.com/v1/elevation`
- `https://archive-api.open-meteo.com/v1/archive`
- `https://historical-forecast-api.open-meteo.com/v1/forecast`
- `https://air-quality-api.open-meteo.com/v1/air-quality`

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The module docstring and CLI-facing text are written entirely in Chinese, and the skill behavior is also hard-coded to request Chinese geocoding results via language: "zh". There is no user-selectable language/locale option or documentation that this is a region-specific Chinese-only tool, which conflicts with the policy against forcing a language without opt-in.

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

python
from datetime import datetime, timedelta, timezone

GEO_URL = "https://geocoding-api.open-meteo.com/v1/search"
WX_URL = "https://api.open-meteo.com/v1/forecast"
ARCHIVE_URL = "https://archive-api.open-meteo.com/v1/archive"
PRES_URL = "https://historical-forecast-api.open-meteo.com/v1/forecast"
AQ_URL = "https://air-quality-api.open-meteo.com/v1/air-quality"

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

python
from datetime import datetime, timedelta, timezone

GEO_URL = "https://geocoding-api.open-meteo.com/v1/search"
WX_URL = "https://api.open-meteo.com/v1/forecast"
ARCHIVE_URL = "https://archive-api.open-meteo.com/v1/archive"
PRES_URL = "https://historical-forecast-api.open-meteo.com/v1/forecast"
AQ_URL = "https://air-quality-api.open-meteo.com/v1/air-quality"

Tainted flow: 'tmp' from os.environ.get (line 131, credential/environment) → open (file write)

Medium
Category
Data Flow
Confidence
88% confidence
Finding

The cache file path is derived from WEATHER_CACHE_DIR, an environment-controlled value, and the code writes JSON files into that location without constraining it to a safe directory or checking for symlink/path abuse. In environments where untrusted users can influence process environment variables, this can be used to overwrite files accessible to the process or redirect writes into sensitive locations.

Content

Scanner excerpt · scripts/weather.py (reported line 132)May include surrounding context.

python
data = json.loads(resp.read().decode("utf-8"))
            os.makedirs(CACHE_DIR, exist_ok=True)
            tmp = path + ".tmp"
            with open(tmp, "w", encoding="utf-8") as fh:
                json.dump(data, fh)
            os.replace(tmp, path)
            return data

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The geocoding request unconditionally sets "language": "zh", which forces a specific locale for returned place names and related user-visible output. Because the skill does not expose a language choice or clearly justify a Chinese-only regional scope, this is a natural-language locale policy violation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill's stated purpose includes marine waves and pollen as separate capabilities, but the marine-specific code makes an additional air-quality API call for pollen and then never returns or uses that pollen data. This is an unjustified extra network capability for the marine command rather than an obvious implementation detail of wave reporting.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The module documentation says current-time handling 'absolutely never reads the local machine clock', but target_now() computes the reference time with datetime.now(timezone.utc) when no injected reference is provided. Although it uses UTC rather than local timezone, it still depends on the host clock, so the documentation overstates what the code avoids.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.