T08 · Insecure Dependencies
- Location
SKILL.md:60- Finding
Mutable Git Installation and Unpinned Build Backend Permit Supply-Chain Code Execution
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill's weather lookup behavior is mostly coherent, but its documentation recommends an unpinned Git-based pip install that can run mutable external code.
Review this before installing. The local skill code is a simple MET Norway weather client, but avoid the documented unpinned Git install unless you trust that repository and build chain; prefer a reviewed commit hash or verified release artifact. Also be aware that latitude, longitude, and optional altitude are sent to MET Norway when fetching forecasts.
SKILL.md:60Mutable Git Installation and Unpinned Build Backend Permit Supply-Chain Code Execution
The documentation instructs installation directly from a remote Git repository via pip, which introduces a software supply-chain risk. If the referenced repository, tag, dependency chain, or transport context is compromised, users may fetch and run unreviewed code; in a skill context, normalizing remote bootstrap commands makes this pattern more dangerous.
35.6762 | 139.6503 |
scripts/
├── yr_service.py # API calls (tested/mocked)
├── utils.py # Emoji/symbol helpers
├── weather.py # Current + forecast CLI
├── tomorrow.py # Tomorrow summary CLI
└── tests/data/ # Sample JSON
tests/
├── test_weather.py
└── test_service.py
Install via pip: pip install git+https://github.com/brandoncrabpi/yr-weather.git
yr-weather -33.9288 18.4174Refactored for production: no defaults, tests, modular service.
The skill advertises and instructs use of network-capable scripts but does not declare any explicit tool scope or permissions boundary. In an agent ecosystem, this can lead to undeclared outbound requests being available to the skill, reducing transparency and making policy enforcement harder.
The manifest says to use the skill when the user asks for "weather information, forecasts, temperature, precipitation, wind conditions, or any weather-related queries for specific locations." This is a very broad activation description without explicit exclusions or narrower trigger boundaries, which could cause unintended invocation on common conversation about weather.
The file-level and function documentation say this script provides tomorrow's weather output, but the range calculation iterates over tomorrow_entries as if each item already contained a temp field. Earlier code shows tomorrow_entries contains raw API entries and temperature is nested under entry['data']['instant']['details'], so this line will fail instead of formatting the advertised forecast output.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
mock_response.__enter__.return_value = mock_response # Fix context manager
data = get_location_forecast(-33.9288, 18.4174)
expected_url = "https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=-33.9288&lon=18.4174"
self.assertIn(expected_url, mock_urlopen.call_args[0][0].get_full_url())
@unittest.mock.patch('urllib.request.urlopen')
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
mock_response.__enter__.return_value = mock_response # Fix context manager
data = get_location_forecast(-33.9288, 18.4174)
expected_url = "https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=-33.9288&lon=18.4174"
self.assertIn(expected_url, mock_urlopen.call_args[0][0].get_full_url())
@unittest.mock.patch('urllib.request.urlopen')
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
mock_response.__enter__.return_value = mock_response # Fix context manager
data = get_location_forecast(-33.9288, 18.4174)
expected_url = "https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=-33.9288&lon=18.4174"
self.assertIn(expected_url, mock_urlopen.call_args[0][0].get_full_url())
@unittest.mock.patch('urllib.request.urlopen')
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
This Python code file makes a network call via get_location_forecast(args.lat, args.lon), which likely transmits the user-provided location to an external service. While the module docstring and CLI description say the tool gets weather from Yr.no, there is no explicit runtime disclosure, confirmation, or warning that coordinates will be sent to a remote service.
This CLI sends user-supplied latitude/longitude to an external weather service without any explicit user-facing disclosure in this file. While expected for a weather skill, location data can still be privacy-sensitive, so the lack of notice is a real but low-severity privacy issue rather than a code-execution or system-compromise flaw.
No suspicious patterns detected.