Back to skill

Security audit

geoskill-stream-flow-simulation

Security checks across malware telemetry and agentic risk

Overview

The main simulator is local, but the package also includes undisclosed credential and network helper code unrelated to runoff modeling.

Install only if you trust this publisher and are comfortable with extra bundled helper code beyond the advertised simulator. Prefer running it in an isolated environment, avoid exposing sensitive ~/.netrc or ~/.geoskill/secrets.json credentials to the runtime, and ask the publisher to remove or clearly document the unused credential, geocoding, and download helpers before broad deployment.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (27)

Lp3

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding
The skill documentation declares no permissions, yet the analyzed capability set includes shell, file read/write, environment access, and network access. This is dangerous because it prevents users and platforms from making informed trust decisions and can hide data access or command execution surfaces that exceed the stated offline hydrology purpose.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared purpose is watershed runoff simulation, but the finding indicates additional behavior including online geocoding/weather access, generic HTTP download tooling, credential harvesting from environment/.netrc/secrets files, and even built-in fallback Earthdata credentials. This mismatch is high risk because hidden credential access and unrelated network/download functionality materially expand the attack surface and could enable data exfiltration, unauthorized remote access, or abuse of third-party accounts.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The vendored core metadata claims this skill packages code for 'landsat-download', which does not match the declared stream-flow simulation purpose. This indicates a supply-chain/integrity problem: the skill may include unintended or incorrect core logic, creating risk of hidden capabilities, broken security assumptions, or execution of code unrelated to the advertised function.

Context-Inappropriate Capability

Medium
Confidence
83% confidence
Finding
The module sends user-supplied place names to third-party geocoding services (Open-Meteo and optionally Nominatim), which creates an external data flow not clearly implied by a local runoff-simulation skill. Even if the data is not highly sensitive by default, AOI/place queries can reveal project locations or analyst interests, and the code does this automatically without an in-file consent or clear boundary.

Context-Inappropriate Capability

Low
Confidence
74% confidence
Finding
The code persists AOI query results under the user's home directory, which creates local data retention beyond the immediate simulation task. Cached place names and resolved bounding boxes may expose sensitive locations to other local users, backups, or later processes, especially on shared systems.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
This credential module is broader than the stated stream-flow simulation purpose and exposes access paths for multiple external services, including OpenAI, CMA, FIRMS, and EOG. Expanding a narrowly scoped skill into a general credential broker increases attack surface and makes secret misuse or unintended outbound access more plausible if other code in the skill calls these helpers.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The code intentionally reads secrets from user-home stores such as ~/.geoskill/secrets.json and ~/.netrc/_netrc, which is sensitive local credential access. For a skill advertised as hydrologic simulation, this is a capability mismatch that raises the risk of harvesting unrelated credentials from the host environment.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
Queries are transmitted to external services without any user-facing warning in this file, so operators may unknowingly disclose location inputs to third parties. In a geospatial workflow, place names can correspond to sensitive infrastructure, study areas, or customer sites, making silent transmission a meaningful privacy and supply-chain concern.

Missing User Warnings

Low
Confidence
77% confidence
Finding
The module writes resolved location data to a cache file in the user's home directory without visible disclosure here, creating silent persistence of potentially sensitive AOI information. This is a privacy issue rather than code execution, but it can still leak operational context through local filesystem artifacts.

Missing User Warnings

High
Confidence
99% confidence
Finding
The module hardcodes a real-looking fallback username and password in source code. Hardcoded credentials are dangerous because anyone with code access can reuse them, and the skill may silently authenticate with unintended accounts without user knowledge or consent.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
User-provided place strings are transmitted to third-party geocoding services, which can leak potentially sensitive location intent without clear disclosure or consent in this module. Even if the data seems low sensitivity, place queries can reveal operational, personal, or business-relevant geographic interests and create avoidable data sharing with external providers.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
Forcing the Accept-Language header to zh-CN,zh;q=0.9 without user choice can disclose locale assumptions and influence service responses in ways the user did not request. While not severe on its own, it is unnecessary metadata leakage and may reduce transparency, especially for non-Chinese users or mixed deployment contexts.

Credential Access

High
Category
Privilege Escalation
Content
/ `EARTHDATA_TOKEN` / `FIRMS_MAP_KEY` / `OPENAI_API_KEY` /
  `CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
Confidence
92% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
/ `EARTHDATA_TOKEN` / `FIRMS_MAP_KEY` / `OPENAI_API_KEY` /
  `CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
Confidence
92% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
`CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
  **不** push 到 GitHub;用于把个人真实凭证(NASA Earthdata bearer
Confidence
91% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
(2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
  **不** push 到 GitHub;用于把个人真实凭证(NASA Earthdata bearer
  token 等)放在 skill 之外。
- **不缓存密码**:每次调用读环境或 .netrc(避免长寿命进程泄露)。
- **统一接口**:`get_earthdata_creds()` / `get_earthdata_token()` /
  `get_firms_key()` / `get_cma_key()` / `get_openai_key()` /
  `get_eog_creds()` 六个 helper。
Confidence
90% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
"EOG_PASSWORD": "",
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
Confidence
90% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
"EOG_PASSWORD": "",
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
Confidence
90% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
    "firms.modaps.eosdis.nasa.gov": ("FIRMS_MAP_KEY",),
Confidence
90% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _read_netrc(host: str) -> Optional[Tuple[str, ...]]:
    """从 ~/.netrc 读指定 host 的凭证(无 token 格式)。"""
    for path in (Path.home() / ".netrc", Path.home() / "_netrc"):
        if not path.is_file():
            continue
Confidence
97% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _read_netrc(host: str) -> Optional[Tuple[str, ...]]:
    """从 ~/.netrc 读指定 host 的凭证(无 token 格式)。"""
    for path in (Path.home() / ".netrc", Path.home() / "_netrc"):
        if not path.is_file():
            continue
        try:
Confidence
97% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
  **不** push 到 GitHub;用于把个人真实凭证(NASA Earthdata bearer
  token 等)放在 skill 之外。
Confidence
93% confidence
Finding
secrets.json

Credential Access

High
Category
Privilege Escalation
Content
# 用户级 secrets 文件位置(在用户 home,**不** vendor 到 skill 内部)。
# Phase 7 (2026-07-27): 包含 NASA Earthdata bearer token 等真实凭证。
USER_SECRETS_PATH = Path.home() / ".geoskill" / "secrets.json"

# 是否已加载过用户级 secrets(避免每次调用都重读)
_user_secrets_loaded = False
Confidence
95% confidence
Finding
secrets.json

Credential Access

High
Category
Privilege Escalation
Content
def load_user_secrets(path: Optional[Path] = None, *, force: bool = False) -> bool:
    """从 ``~/.geoskill/secrets.json`` 加载用户级凭证到 _DEFAULTS.

    Phase 7 (2026-07-27): 第一次调用自动加载(lazy)。之后每个 helper
    调用也会 lazy 加载,除非显式 ``force=True`` 强制重读。返回 True
Confidence
97% confidence
Finding
secrets.json

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
Confidence
94% confidence
Finding
numpy

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
tests/conftest.py:15