T09 · Insecure Skill Coding Practices
- Location
lib/map_helper.py:259- Finding
Google Maps API Key Disclosed in Returned Photo URLs
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Google Maps skill mostly does what it advertises, but it can print your Google API key inside returned place photo URLs.
Review before installing. Use a Google API key restricted to only the required Maps APIs, with quota and billing limits, and rotate it if this skill has already printed search/details results containing photo_url fields. Avoid sensitive home, work, medical, legal, or client locations unless you are comfortable sending them to Google. The publisher should fix the skill so it never returns API keys in URLs and should add clearer privacy disclosure for location data.
lib/map_helper.py:259Google Maps API Key Disclosed in Returned Photo URLs
SKILL.md:20Unpinned Third-Party Dependency Installation
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
Forward geocoding sends user-supplied addresses to Google, which can disclose sensitive location information to a third party without any explicit notice or consent flow in the skill path. In a mapping skill this data transfer is expected, but the absence of disclosure still creates a real privacy risk because addresses may reveal home, work, or other sensitive places.
Reverse geocoding transmits precise latitude/longitude, which is highly sensitive and can identify exact user whereabouts. Without explicit disclosure or consent, the skill may expose precise location data to an external provider in ways users do not expect.
Place search sends free-text queries plus optional location context to Google, which can reveal user interests, habits, and nearby position. In-context this is core functionality, but the lack of disclosure means users may unknowingly share sensitive contextual data with a third party.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"X-Goog-FieldMask": "routes.duration,routes.staticDuration,routes.distanceMeters,routes.legs.startLocation,routes.legs.endLocation"
}
response = requests.post(url, headers=headers, json=request_body)
if response.status_code != 200:
return {"error": f"API error: {response.status_code}", "details": response.text}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"X-Goog-FieldMask": "routes.duration,routes.staticDuration,routes.distanceMeters,routes.legs.startLocation,routes.legs.endLocation"
}
response = requests.post(url, headers=headers, json=request_body)
if response.status_code != 200:
return {"error": f"API error: {response.status_code}", "details": response.text}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"X-Goog-FieldMask": "routes.duration,routes.staticDuration,routes.distanceMeters,routes.legs.startLocation,routes.legs.endLocation"
}
response = requests.post(url, headers=headers, json=request_body)
if response.status_code != 200:
return {"error": f"API error: {response.status_code}", "details": response.text}
Route computation sends origin, destination, timing, and routing preferences to Google, which can expose travel plans and sensitive personal patterns. Because this skill is specifically built for navigation, the transmission is contextually expected, but lack of clear disclosure and consent still makes it a genuine privacy weakness.
Detailed directions requests may include origin, destination, waypoints, departure/arrival times, and transit details, creating an even richer picture of a user's movements and intent. This makes the privacy concern stronger than basic lookups if users are not clearly informed that this data is sent off-platform to Google.
Route matrix requests can transmit multiple origins and destinations in one call, potentially exposing a broader set of locations such as offices, homes, clients, or planned stops. The bulk nature of the request increases privacy sensitivity, and the code offers no user-facing notice before sending this data externally.
Place details sends a place identifier to Google; this is less sensitive than raw coordinates or free-text addresses, but it still discloses what place the user is interested in. The privacy impact is lower, yet a disclosure gap remains.
The manifest advertises distance/travel-time calculations with traffic prediction and avoid options, and the module documentation presents matrix support as part of the Routes API feature set. In the matrix method, departure_time is parsed and then explicitly discarded, and avoid is accepted in the signature but never used, so the implemented behavior falls short of the described capability.
The help text shows matrix ... [options], which in context suggests the same option style described above, including departure time and avoid settings. However, the matrix implementation does not apply avoid at all and deliberately ignores parsed departure_time, so the documentation overstates what the command actually does.
No suspicious patterns detected.