Back to skill

Security audit

geoskill-noise-pollution-mapping

Security checks across malware telemetry and agentic risk

Overview

The main noise-mapping tool appears local, but the package includes undisclosed network, download, and credential-handling code that users should review before installing.

Install only if you are comfortable with a package that ships extra shared geospatial helper code beyond the advertised offline mapper. Before use, remove or disable the credential helpers and geocoding/download modules if you do not need them, and do not rely on the offline privacy claim for every file in the package.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (35)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill declares an offline/local-only noise-mapping function, yet static analysis detected capabilities for environment access, file I/O, network, and shell without any declared permissions. Even if some of these capabilities are legitimate for geospatial processing, the undeclared capability surface reduces transparency and can enable unexpected data access or command execution in environments that trust the manifest.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
This is a serious description-behavior mismatch: the skill claims to run fully offline and only process local/synthetic traffic-noise inputs, but the analyzed behavior includes geocoding, HTTP downloads, remote-service access, credential handling, and hardcoded fallback credentials. That combination can expose secrets, exfiltrate user data, or perform unauthorized network activity under the guise of a benign local geospatial tool, making the deceptive context especially dangerous.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The vendored core metadata claims the packaged core belongs to a different skill ('landsat-download') than the declared noise-pollution mapping skill. This kind of provenance mismatch is dangerous because it can indicate the wrong dependency bundle was copied in, integrity checks are unreliable, or the skill is disguising reused code with different behavior than reviewers expect.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The AOI helper sends user-supplied place names to external geocoding services (Open-Meteo and Nominatim), which is behavior not disclosed by the skill description focused on local noise mapping outputs. This creates an information disclosure and supply-chain/trust-boundary issue because potentially sensitive locations are transmitted off-device to third parties.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The code persists query-derived AOI resolution data under the user's home directory without disclosure in the manifest. Even if the cache key is hashed, the cached manifest content includes the original query and resolved location data, which can expose sensitive places across sessions and to other local processes or users with filesystem access.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
This credential module is far broader than the stated traffic-noise-mapping purpose and exposes access paths for multiple unrelated external services, including OpenAI, CMA, FIRMS, EOG, and Earthdata. In a skill context, that unnecessary capability expansion increases attack surface and creates a ready-made mechanism for later code to harvest or misuse credentials unrelated to the advertised functionality.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code reads general user secrets from environment variables, ~/.geoskill/secrets.json, and ~/.netrc across several services without strong evidence that all are required for this noise-mapping skill. In this context, broad secret discovery is dangerous because any downstream code in the skill can call these helpers and obtain sensitive credentials from the user's machine.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
User place queries are transmitted to third-party services without any user-facing disclosure in this code path. In a geospatial workflow, queried locations may reveal sensitive operational sites, residences, or planned projects, so silent transmission increases privacy risk and may violate user expectations or policy requirements.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The code writes persistent cache files containing AOI resolution data to the user's home directory without warning. This can leak sensitive place queries and derived locations through local artifact retention long after the task completes, especially on shared systems or managed environments.

Missing User Warnings

High
Confidence
100% confidence
Finding
The module hardcodes fallback credentials, including a non-empty Earthdata username and password, directly in source. Embedded credentials are a direct secret exposure risk and can be abused by anyone with source access, while also training the system to silently authenticate with shipped accounts when the user did not intend to provide credentials.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The functions `_open_meteo_search` and `_nominatim_search` send user-supplied place queries to external services without any visible consent or warning path in this file. Even if the data is 'just a place name,' queries can contain sensitive locations, creating a privacy leak to third parties that users may not expect from the skill description.

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
95% 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
95% 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
95% 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
94% 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
96% 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
96% 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
96% 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
98% 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
98% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _resolve(name: str) -> str:
    """env > 用户 secrets > .netrc > 默认. 空字符串视为未设."""
    env_val = os.environ.get(name, "").strip()
    if env_val:
        return env_val
Confidence
94% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _resolve_with_netrc(env_name: str, netrc_host: str, field_index: int) -> str:
    """env > 用户 secrets > .netrc > 默认."""
    env_val = os.environ.get(env_name, "").strip()
    if env_val:
        return env_val
Confidence
95% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
解析顺序:
    1. env: EARTHDATA_USERNAME / EARTHDATA_PASSWORD
    2. ~/.geoskill/secrets.json
    3. .netrc: machine urs.earthdata.nasa.gov
    4. _DEFAULTS 兜底
    """
    u = _resolve_with_netrc("EARTHDATA_USERNAME", "urs.earthdata.nasa.gov", 0)
Confidence
95% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
解析顺序:
    1. env: EARTHDATA_TOKEN
    2. ~/.geoskill/secrets.json
    3. .netrc: machine urs.earthdata.nasa.gov account <TOKEN>
    4. _DEFAULTS(通常为空)
    """
    return _resolve("EARTHDATA_TOKEN")
Confidence
90% 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
96% confidence
Finding
secrets.json

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