Back to skill

Security audit

geoskill-telecom-coverage-optimization

Security checks across malware telemetry and agentic risk

Overview

The main telecom tool is mostly local and coherent, but the package includes under-disclosed credential and network helper code that is broader than the advertised offline purpose.

Review this package before installing in an environment with valuable credentials. The main coverage script appears local, but the bundled core should remove hardcoded Earthdata credentials, disable or clearly document local secret discovery and geocoding helpers, and correct vendored provenance metadata.

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
84% confidence
Finding
The skill declares no permissions, yet the documented/runtime capabilities reportedly include file access, shell execution, environment access, and network use. This mismatch weakens user consent and review controls because a seemingly local telecom-planning skill may access broader system resources than its description suggests.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The documented purpose is offline telecom coverage estimation, but the finding indicates unrelated behaviors including network geocoding, generic downloading, broad remote-sensing registries, credential handling for multiple third-party services, and embedded fallback credentials. That is a serious scope mismatch that can conceal data exfiltration, unauthorized external access, or secret misuse behind an innocuous scientific workflow.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The vendored metadata claims the embedded core came from a different skill ('landsat-download') than the published telecom coverage optimization skill. This breaks provenance and supply-chain traceability, making it harder to verify that the included files are the intended dependency set and increasing the risk of accidental component mix-ups or hidden code substitution. In a planning/geo skill that relies on vendored helper modules for downloads, credentials, and checks, incorrect provenance is more concerning because operators may trust the package identity when reviewing or deploying it.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
This credential manager is materially broader than the stated telecom coverage optimization purpose, exposing helpers for OpenAI, FIRMS, CMA, and EOG credentials in addition to Earthdata access. Scope expansion around credential handling increases the attack surface and creates unnecessary opportunities for a skill to access unrelated secrets from the host environment.

Context-Inappropriate Capability

Medium
Confidence
85% confidence
Finding
The code reads user-level secret stores and environment-sourced credentials from the host system even though the skill description is a narrow analytical telecom function. In this context, automatic access to ~/.geoskill/secrets.json and environment variables is risky because it lets the skill ingest sensitive secrets that are not clearly required for its advertised task.

Intent-Code Divergence

Low
Confidence
93% confidence
Finding
The docstring says passwords are not cached, but load_user_secrets mutates the module-level _DEFAULTS dictionary and retains loaded secret values in memory for later calls. This is a security-relevant mismatch because operators may rely on the stated behavior when assessing exposure in long-lived processes.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
User-supplied place names are sent to third-party geocoding services, which can disclose sensitive location intent or operational planning data to external providers. In a telecom coverage optimization skill, queried places may reveal network planning targets, customer sites, or internal geographic priorities, making the privacy exposure more meaningful than in a generic consumer app.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
Resolved AOI manifests are persisted under the user's home directory without clear disclosure or retention controls, potentially leaving sensitive location queries and derived bounding boxes on disk. On shared systems or developer workstations, this can expose operational geography, customer locations, or planning activity to other local users or later compromise.

Missing User Warnings

High
Confidence
99% confidence
Finding
The module contains hardcoded fallback credentials, including a plaintext username and password for Earthdata. Embedded secrets are highly dangerous because anyone with source access can recover and reuse them, and downstream deployments may unknowingly authenticate with a shared account.

Missing User Warnings

Medium
Confidence
83% confidence
Finding
User-supplied place queries are sent to third-party services without any disclosure, consent flow, or minimization controls visible in this file. Even if place names seem low sensitivity, queries may contain proprietary site names, internal project locations, or sensitive operational areas, causing unintended data exposure to external providers.

Natural-Language Policy Violations

Medium
Confidence
72% confidence
Finding
The code hard-codes an Accept-Language header of zh-CN for Nominatim requests, which silently imposes a locale preference without user choice or documented need. This can leak assumptions about deployment context, affect returned results, and produce confusing or biased behavior for users outside that locale.

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
83% 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
83% 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
83% 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
80% 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
86% 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
86% 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
86% 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
92% 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
92% 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
78% 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
84% 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
81% 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
77% 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
84% 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