Back to skill

Security audit

Weather Aqi

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it says: it fetches weather and air-quality data for a requested location using disclosed external APIs.

Install only if you are comfortable sending searched locations to Open-Meteo and WAQI and providing a WAQI API token through the environment. Treat the token as a secret and avoid running the skill in environments where request URLs may be broadly logged.

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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

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 · weather_aqi_claw.js (reported line 11)May include surrounding context.

js
const geo = { name: r.name, country: r.country, lat: r.latitude, lon: r.longitude };

  const [weatherRes, aqiRes] = await Promise.all([
    web_fetch(`https://api.open-meteo.com/v1/forecast?latitude=${geo.lat}&longitude=${geo.lon}&current=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,windspeed_10m,wind_direction_10m&wind_speed_unit=kmh&timezone=auto`),
    web_fetch(`https://api.waqi.info/feed/geo:${geo.lat};${geo.lon}/?token=${process.env.WAQITOKEN}`)
  ]);

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 · weather_aqi_claw.js (reported line 12)May include surrounding context.

js
const [weatherRes, aqiRes] = await Promise.all([
    web_fetch(`https://api.open-meteo.com/v1/forecast?latitude=${geo.lat}&longitude=${geo.lon}&current=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,windspeed_10m,wind_direction_10m&wind_speed_unit=kmh&timezone=auto`),
    web_fetch(`https://api.waqi.info/feed/geo:${geo.lat};${geo.lon}/?token=${process.env.WAQITOKEN}`)
  ]);

  const c = weatherRes.current;

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

With no manifest available, the skill's purpose is unknown, so credential access should be justified by explicit scope or documentation. This file reads process.env.WAQITOKEN to call a third-party AQI service, which is a capability beyond simple local computation and introduces external-secret usage not otherwise documented in the file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The WAQI API token is placed directly into the request URL query string, which can be captured in proxy logs, server logs, browser/history equivalents, or telemetry even when sent over HTTPS. This unnecessarily increases exposure of a sensitive credential because URLs are commonly logged more broadly than headers or request bodies.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The geocoding API call forces language=en, which imposes a specific language choice in the skill behavior. The file does not offer a user opt-in or document why English is required, matching the language/locale policy concern described by this rule.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.