Back to skill

Security audit

Server Monitor Collector

Security checks for vulnerabilities and agentic risk

Overview

This monitoring skill is purpose-aligned, but it needs review because it handles infrastructure credentials and sends reports with insecure defaults and weak scoping.

Install only in a controlled monitoring environment. Use read-only or narrowly scoped Zabbix and cloud credentials, require HTTPS for Zabbix, restrict SMTP to approved recipients, avoid enabling the daily cron until you are comfortable with automatic report sending, and prefer a version with spreadsheet sanitization and pinned dependencies.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/zabbix_cron.py:292
Finding

Spreadsheet Formula Injection Through Zabbix-Controlled Fields

Content
View full analysis

Vulnerability Details

File Location: scripts/zabbix_cron.py, lines 292-306
Vulnerability Type: CSV/XLSX formula injection
Risk Level: High

Vulnerable Code

python
with open(CSV_PATH, "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["主机组", "主机名", "IP", "内存总量(GB)",
                     "内存可用(GB)", "内存占用率(%)", "CPU占用率(%)"])
    for r in rows:
        writer.writerow([
            r["group"],
            r["name"],
            r["ip"],
            f"{r['mem_total_gb']:.1f}" if r['mem_total_gb'] is not None else "N/A",
            f"{r['mem_avail_gb']:.1f}" if r['mem_avail_gb'] is not None else "N/A",
            f"{r['mem_used_pct']:.1f}" if r['mem_used_pct'] is not None else "N/A",
            f"{r['cpu_pct']:.1f}"      if r['cpu_pct'] is not None else "N/A",
        ])

The same untrusted host and group values are also assigned directly to XLSX cells during report generation, and both generated files are subsequently attached to an email:

python
atts = [f for f in [XLSX_PATH, CSV_PATH] if os.path.exists(f)]
send_email(subject, html, atts)

Equivalent behavior is present in scripts/zabbix_monitor.py and references/zabbix_cron.py.

Technical Analysis

The fields group, name, and ip originate from Zabbix API responses and are written into spreadsheet files without neutralizing spreadsheet control characters. Values beginning with =, +, -, or @ may be interpreted as formulas when the CSV or XLSX report is opened in spreadsheet software.

Quoting a field with Python's csv.writer does not prevent formula interpretation. For XLSX output, assigning a string beginning with = through openpyxl may explicitly create a formula cell.

An attacker who can create or rename a Zabbix host, alter a visible host name, or influence host-group names can therefore persist a spreadsheet payload in the generated report. Depending on spreadsheet software and security settings, formu ...[truncated 1654 chars]

Remediation
View remediation

Remediation Suggestions

  • Neutralize every externally sourced spreadsheet string before writing CSV or XLSX output.
  • Prefix values beginning with =, +, -, @, tab, carriage return, or line feed with an apostrophe.
  • For XLSX output, force untrusted values to the string data type instead of allowing formula inference.
  • Apply the same protection to host names, host groups, addresses, instance identifiers, service names, and any future metadata columns.
  • Consider using a centralized helper:
python
def safe_spreadsheet_text(value):
    text = str(value)
    if text.startswith(("=", "+", "-", "@", "\t", "\r", "\n")):
        return "'" + text
    return text
  • Escape values separately for HTML email output using html.escape; spreadsheet neutralization does not protect HTML.
  • Add automated tests containing formula prefixes and verify that generated XLSX cells have string type rather than formula type.
  • Apply the fix consistently to scripts/zabbix_cron.py, scripts/zabbix_monitor.py, and references/zabbix_cron.py.

T09 · Insecure Skill Coding Practices

Error
Location
scripts/zabbix_cron.py:389
Finding

SMTP Certificate Verification Is Not Explicitly Enforced

Content
View full analysis

Vulnerability Details

File Location: scripts/zabbix_cron.py, lines 389-397
Vulnerability Type: Insufficient TLS hardening for SMTP authentication
Risk Level: High

Vulnerable Code

python
try:
    if smtp_port == "465":
        with smtplib.SMTP_SSL(smtp_host, int(smtp_port)) as s:
            s.login(smtp_from, smtp_token)
            s.sendmail(smtp_from, target, msg.as_string())
    else:
        with smtplib.SMTP(smtp_host, int(smtp_port)) as s:
            s.starttls()
            s.login(smtp_from, smtp_token)
            s.sendmail(smtp_from, target, msg.as_string())

The same pattern appears in scripts/send_zabbix_report.py and references/zabbix_cron.py.

Technical Analysis

The code authenticates to SMTP immediately after creating an implicit-TLS connection or issuing STARTTLS, but it does not supply an explicit certificate-validating SSLContext. Relying on library defaults makes certificate and hostname verification dependent on the Python runtime and platform behavior rather than an enforced application security policy.

The SMTP credential is a sensitive token or password. The transmitted message also contains host names, internal addresses, resource-utilization data, and complete CSV/XLSX report attachments. A TLS downgrade, improperly validated certificate, or hostile network intermediary could therefore expose both credentials and infrastructure inventory.

For the non-465 branch, the code also does not verify that the server advertised STARTTLS under a validated server identity before authentication beyond relying on starttls() behavior.

Attack Path

  1. An attacker gains a network interception position, compromises DNS resolution, or controls a gateway between the collector and SMTP server.
  2. The collector connects to the attacker-selected endpoint or intercepted server.
  3. If the runtime does not perform strict certificate and hostname validation, the attacker presents an untrusted certificate an ...[truncated 1111 chars]
Remediation
View remediation

Remediation Suggestions

  • Create and pass an explicit certificate-validating context:
python
import ssl

tls_context = ssl.create_default_context()

if int(smtp_port) == 465:
    with smtplib.SMTP_SSL(
        smtp_host,
        int(smtp_port),
        context=tls_context,
        timeout=30,
    ) as server:
        server.login(smtp_from, smtp_token)
        server.sendmail(smtp_from, target, msg.as_string())
else:
    with smtplib.SMTP(smtp_host, int(smtp_port), timeout=30) as server:
        server.ehlo()
        if not server.has_extn("starttls"):
            raise RuntimeError("SMTP server does not support STARTTLS")
        server.starttls(context=tls_context)
        server.ehlo()
        server.login(smtp_from, smtp_token)
        server.sendmail(smtp_from, target, msg.as_string())
  • Reject plaintext SMTP configurations and unsupported ports.
  • Use a dedicated, revocable, send-only application token rather than a mailbox password.
  • Restrict the SMTP account to the intended sender and recipient where the provider supports it.
  • Add connection timeouts and avoid exposing detailed server exceptions containing infrastructure information.
  • Apply the same correction to all three SMTP implementations.

T09 · Insecure Skill Coding Practices

Error
Location
references/zabbix-config.md:3
Finding

Zabbix Credentials and Session Tokens Can Be Sent Over Plaintext HTTP

Content
View full analysis

Vulnerability Details

File Location: references/zabbix-config.md, lines 3-10
Vulnerability Type: Plaintext transmission of authentication credentials
Risk Level: High

Vulnerable Configuration

bash
ZABBIX_URL=http://zabbix.example.com/api_jsonrpc.php
ZABBIX_USER=Admin
ZABBIX_PASSWORD=your_password
# 可选:API Token(优先级高于用户名密码)
ZABBIX_TOKEN=optional_api_token

The executable scripts accept the URL without enforcing HTTPS. For example, scripts/zabbix_cron.py constructs and sends the authentication request directly to the configured URL:

python
data = json.dumps(payload).encode("utf-8")
req = Request(ZABBIX_URL, data=data, headers={"Content-Type": "application/json"})
try:
    with urlopen(req, timeout=60) as resp:
        result = json.loads(resp.read().decode("utf-8"))

The login request contains the password:

python
auth = api_call("user.login", {
    "user": ZABBIX_USER,
    "password": ZABBIX_PASSWORD,
})

Equivalent behavior exists in scripts/zabbix_monitor.py and references/zabbix_cron.py.

Technical Analysis

The supplied configuration reference explicitly recommends an http:// Zabbix API URL, and the scripts do not reject that scheme. When this configuration is followed, the Zabbix username and password are serialized into a JSON-RPC request and transmitted without transport encryption. The returned Zabbix session token is then included in subsequent API requests over the same plaintext connection.

A passive observer can recover credentials and monitoring data. An active intermediary can modify JSON-RPC requests or responses, substitute fabricated monitoring results, or steal a session token. The collected responses reveal host identifiers, host names, groups, and performance data.

The use of network access and Zabbix authentication is necessary for the Skill's purpose. Plaintext HTTP is not necessary and violates least exposure for those credentials.

Attack Path

  1. An operator follows the docum ...[truncated 1319 chars]
Remediation
View remediation

Remediation Suggestions

  • Change all examples to https://.
  • Reject non-HTTPS URLs in executable code unless an explicit, clearly named local-development override is enabled.
  • Validate the destination before sending credentials:
python
from urllib.parse import urlparse

parsed = urlparse(ZABBIX_URL)
if parsed.scheme != "https":
    raise ValueError("ZABBIX_URL must use HTTPS")
if not parsed.hostname:
    raise ValueError("ZABBIX_URL has no valid hostname")
  • Use a certificate issued by a trusted internal or public CA and retain normal hostname verification.
  • Prefer a narrowly scoped Zabbix API token over an administrator username and password.
  • Implement the documented ZABBIX_TOKEN option consistently; the primary installed scripts currently require username/password despite documentation claiming token support.
  • Rotate any credentials that may previously have been used with HTTP.
  • Restrict the Zabbix account to read-only access for host groups, hosts, and required item values.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:133
Finding

Runtime Dependencies Are Downloaded Without Version or Integrity Pinning

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 133-141
Vulnerability Type: Unpinned runtime dependency installation
Risk Level: Medium

Vulnerable Instructions

bash
uv run --with aliyun-python-sdk-core --with aliyun-python-sdk-cms \
  python3 cloud_monitor.py
bash
uv run --with httpx python3 cloud_monitor.py

Technical Analysis

The documented execution commands resolve and download unspecified current versions of third-party packages at runtime. No exact versions, lockfile, hashes, or verified artifact source are provided.

Consequently, the effective code executed by the Skill can change after the Skill itself has been reviewed. A newly compromised package release, package-maintainer account compromise, malicious dependency update, or registry compromise could introduce code that runs with the cron task's user privileges.

The package names appear legitimate, and the audit found no evidence of intentional typosquatting or a malicious package source. The risk is therefore an avoidable supply-chain exposure rather than evidence that the current dependencies are malicious.

Attack Path

  1. An attacker compromises a maintainer account, dependency package, or package registry used by uv.
  2. A malicious new version is published under one of the unpinned dependency names or a transitive dependency.
  3. An operator or scheduled environment executes the documented uv run --with ... command after publication.
  4. uv resolves and installs the malicious version because no approved version or hash is enforced.
  5. Package initialization or imported code executes under the monitoring user's account.
  6. The malicious dependency can read environment variables containing Zabbix, SMTP, Alibaba, Tencent, and Huawei credentials and transmit them externally.

Impact Assessment

A compromised dependency would execute with the same privileges as the monitoring script. This can include:

  • Reading all credentials exported to t ...[truncated 447 chars]
Remediation
View remediation

Remediation Suggestions

  • Pin every direct dependency to an audited exact version.
  • Commit a uv.lock or equivalent lockfile containing resolved transitive versions.
  • Use hash-verified installations where supported.
  • Install dependencies during a controlled deployment phase rather than resolving new versions on every monitoring run.
  • Use an approved package index and block fallback to untrusted indexes.
  • Run dependency vulnerability and provenance checks in CI.
  • Review updates before regenerating the lockfile.
  • Execute the collector under a dedicated low-privilege account with only read-only cloud and Zabbix permissions.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (46)

Tainted flow: 'req' from os.environ.get (line 36, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · references/zabbix_cron.py (reported line 38)May include surrounding context.

python
data = json.dumps(payload).encode("utf-8")
    req = Request(ZABBIX_URL, data=data, headers={"Content-Type":"application/json"})
    try:
        with urlopen(req, timeout=60) as resp:
            result = json.loads(resp.read().decode("utf-8"))
    except URLError as e:
        print(f"API 请求失败: {e}"); sys.exit(1)

Tainted flow: 'req' from os.environ.get (line 59, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/zabbix_cron.py (reported line 61)May include surrounding context.

python
data = json.dumps(payload).encode("utf-8")
    req = Request(ZABBIX_URL, data=data, headers={"Content-Type": "application/json"})
    try:
        with urlopen(req, timeout=60) as resp:
            result = json.loads(resp.read().decode("utf-8"))
    except URLError as e:
        print(f"API 请求失败: {e}")

Tainted flow: 'req' from os.environ.get (line 65, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

The script sends Zabbix credentials and API requests to a URL fully controlled by the ZABBIX_URL environment variable, with no validation that the scheme is HTTPS or that the destination is an approved host. In environments where this skill runs with attacker-influenced configuration, credentials and monitoring data could be exfiltrated to an arbitrary endpoint or sent over insecure transport.

Content

Scanner excerpt · scripts/zabbix_monitor.py (reported line 68)May include surrounding context.

python
req = Request(ZABBIX_URL, data=data, headers={"Content-Type": "application/json"})

    try:
        with urlopen(req, timeout=60) as resp:
            result = json.loads(resp.read().decode("utf-8"))
    except URLError as e:
        print(f"API 请求失败: {e}", file=sys.stderr)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

If the skill can send email via SMTP or otherwise transmit data externally without clearly declaring those capabilities in a permission model, users may unknowingly authorize exfiltration of internal monitoring data. The risk is amplified because the skill handles infrastructure telemetry and credentials, so documentation that understates networked behavior materially affects safe deployment decisions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

If the skill can send email via SMTP or otherwise transmit data externally without clearly declaring those capabilities in a permission model, users may unknowingly authorize exfiltration of internal monitoring data. The risk is amplified because the skill handles infrastructure telemetry and credentials, so documentation that understates networked behavior materially affects safe deployment decisions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the skill can send email via SMTP or otherwise transmit data externally without clearly declaring those capabilities in a permission model, users may unknowingly authorize exfiltration of internal monitoring data. The risk is amplified because the skill handles infrastructure telemetry and credentials, so documentation that understates networked behavior materially affects safe deployment decisions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

If the skill can send email via SMTP or otherwise transmit data externally without clearly declaring those capabilities in a permission model, users may unknowingly authorize exfiltration of internal monitoring data. The risk is amplified because the skill handles infrastructure telemetry and credentials, so documentation that understates networked behavior materially affects safe deployment decisions.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
87% confidence
Finding

The skill is explicitly designed to consume numerous high-value credentials from ~/.hermes/.env, including cloud API keys, SMTP tokens, and monitoring-system authentication. While using environment variables is common, this greatly raises the sensitivity of the skill: any overbroad trigger, hidden network behavior, or downstream script weakness could expose credentials or use them to access infrastructure and send data externally.

Content

Scanner excerpt · SKILL.md (reported line 49)May include surrounding context.

md
"id": "hermes-skill",
              "kind": "file",
              "src": "references/zabbix-config.md",
              "label": "Configure data sources in ~/.hermes/.env"
            },
            {
              "id": "cloud-config",

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/cloud_monitor.py (reported line 16)May include surrounding context.

python
import csv
import json
from dotenv import load_dotenv
load_dotenv()  # 加载 ~/.hermes/.env
import smtplib
from datetime import datetime
from urllib.request import urlopen, Request

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_cron.py (reported line 11)May include surrounding context.

python
import csv
import json
from dotenv import load_dotenv
load_dotenv()  # 加载 ~/.hermes/.env
import smtplib
from datetime import datetime
from urllib.request import urlopen, Request

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_monitor.py (reported line 12)May include surrounding context.

python
import csv
import json
from dotenv import load_dotenv
load_dotenv()  # 加载 ~/.hermes/.env
import smtplib
from datetime import datetime
from urllib.request import urlopen, Request

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/zabbix_cron.py (reported line 174)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_cron.py (reported line 28)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_cron.py (reported line 32)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_cron.py (reported line 350)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_monitor.py (reported line 26)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/zabbix_monitor.py (reported line 30)May include surrounding context.

python
ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD", "")

if not ZABBIX_URL:
    print("[ERROR] ZABBIX_URL is not set. Please configure it in ~/.hermes/.env", file=sys.stderr)
    sys.exit(1)

if not ZABBIX_USER or not ZABBIX_PASSWORD:

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares capabilities that clearly require environment-variable access, local file output, and network communication, but it does not declare any explicit tool scope or permissions boundary. That makes it easier for the skill to operate with broader-than-expected access and reduces user visibility into sensitive actions such as reading credentials and transmitting monitoring data externally.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Overly broad triggers such as generic server-health or reporting requests can cause the skill to activate in contexts where the user did not intend to run a data-collecting, credential-using, network-capable workflow. Because this skill can read secrets from environment configuration and send telemetry externally, overmatching materially increases the chance of unintended execution and data disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill description does not prominently warn users that execution may send monitoring data outside the local environment via email or Feishu. This is dangerous because infrastructure status, hostnames, IPs, and utilization metrics are often sensitive operational data, and silent external delivery can violate policy or leak internal details.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The auto-detection model collects from any source whose environment variables are present, which can silently expand the scope from one intended system to multiple infrastructure providers. In environments where many credentials are preconfigured, a single invocation may aggregate and transmit more monitoring data than the user expected.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This markdown file includes multiple credential examples such as access keys and secret keys for cloud providers, but it does not warn users that these values are sensitive or should not be committed, logged, or shared. Because markdown files should disclose behaviors affecting privacy or system integrity, the omission of a credential-handling warning is a meaningful safety gap.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file provides TENCENT_SECRET_KEY and HUAWEI_SECRET_KEY configuration examples, but gives no warning that these credentials are sensitive or that misuse could expose cloud resources. In markdown guidance that directs users to supply secrets, the absence of an explicit caution about storage, leakage, and least-privilege use is a missing user warning.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The document instructs users to send server monitoring summaries and an Excel report via Feishu and email, but it does not warn that these channels may transmit sensitive operational metadata outside the monitored environment. Host inventories, utilization hotspots, timestamps, and group structure can aid attackers or violate internal data-handling policies if sent to external SaaS or email systems without review.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.