Back to skill

Security audit

NAS Dashboard

Security checks for vulnerabilities and agentic risk

Overview

This NAS monitoring skill is coherent, but it needs review because it collects sensitive host/security data, can send reports to Telegram, relies on passwordless sudo, and prints risky privileged repair commands.

Install only if you are comfortable with a daily NAS report that may include sensitive infrastructure and security details, especially if sent to Telegram. Do not run the printed fix commands blindly; review storage, SSH, firewall, update, and backup commands manually, and use a tightly scoped sudoers policy instead of broad passwordless sudo.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
all-in-one.sh:7
Finding

Sensitive NAS telemetry can remain in a temporary file after abnormal termination

Content
View full analysis
/dev/null > "$TMPFILE" # ── 2. 格式化 ── python3 "$SCRIPT_DIR/scripts/format.py" "$TMPFILE" rm -f "$TMPFILE" ``` ### Technical Analysis The script securely creates a uniquely named file through `mktemp`, but cleanup only occurs at the end of the normal execution path. Because `set -e` is enabled, any failure in the collection or formatting command terminates the script before `rm -f "$TMPFILE"` executes. The temporary file can contain sensitive reconnaissance data, including: - Hostname and operating-system information - Local IP addresses and listening ports - Login history and failed-login counts - SSH daemon configuration - Process and service names - System and kernel logs - Disk models, serial numbers, and health information - ZFS datasets and snapshots - Docker container and image metadata Although `mktemp` normally creates the file with restrictive permissions, leaving this information on disk unnecessarily increases exposure to privileged local users, forensic recovery, backup processes, or later permission and configuration mistakes. ### Attack Path 1. A local attacker or malformed runtime condition causes `scripts/collect.sh` or `scripts/format.py` to fail. 2. `set -e` immediately terminates `all-in-one.sh`. 3. The explicit `rm -f` cleanup operation is never reached. 4. The completed or partially completed report remains under `/tmp/nas-collect.*`. 5. A privileged local attacker, backup service, forensic process, or other sufficiently authorized process retrieves the residual telemetry. 6. The exposed information is used to map storage, services, containers, SSH configuration, and network attack surfaces. ### Impact Asse ...[truncated 530 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/format.py:111
Finding

Action guide emits a hard-coded privileged ZFS device-removal command

Content
View full analysis
99 and l2s not in ('0','0B','?'): alerts.append(Alert('🟡','⚠️','L2ARC浪费SSD寿命', f'{l2s} 仅贡献 <1% 读取', 'sudo zpool remove tank nvme0n1p1 nvme1n1p1 # 移除L2ARC设备', 'ARC命中率99.9%,L2ARC几乎没用,白白消耗NVMe写入寿命')) except: pass ``` ### Technical Analysis The formatter presents a directly executable, privileged command that removes two devices from a ZFS pool. The pool name and device identifiers are hard-coded as `tank`, `nvme0n1p1`, and `nvme1n1p1`; they are not derived from and validated against the collected pool topology. The triggering condition only considers ARC hit rate and the presence of a nonzero L2ARC size. It does not establish that: - The named pool exists. - The named devices are L2ARC cache devices. - Removing them is supported in the current topology. - The devices do not serve another storage role. - Recent workload measurements justify permanent topology modification. - Backups and recovery procedures are available. The formatter does not execute this command itself. Exploitation therefore depends on an operator or automation system treating the generated action guide as trusted remediation and running it. ### Attack Path 1. The monitored host reports an ARC hit rate above 99% and a nonzero L2ARC size. 2. The formatter generates the hard-coded `sudo zpool remove` recommendation. 3. The report is delivered to an operator or an Agent capable of executing remediation commands. 4. The recipient treats the action guide as authoritative and runs the command with `sudo`. 5. If the hard-coded identifiers happen to exist but do not represent the intended disposable cache devices, ZFS topology is modified incorrectly. 6. The host may experience degraded storage performance, loss of redund ...[truncated 657 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/format.py:198
Finding

Action guide recommends deleting all Timeshift snapshots without confirmation

Content
View full analysis
300: alerts.append(Alert('🔴','❌',f'Timeshift {tc}个快照', '快照数量严重超标','sudo timeshift --delete-all 先清理,再调整策略', '大量快照会占满磁盘空间')) elif tc>100: alerts.append(Alert('🟡','⚠️',f'Timeshift {tc}个快照', '快照过多','sudo timeshift --delete 保留最近10个', '建议控制100以内')) except: pass ``` ### Technical Analysis When the snapshot count exceeds 300, the formatter recommends `sudo timeshift --delete-all`. This command can remove every Timeshift restore point, including recent or known-good recovery states. The recommendation is based only on a snapshot count threshold. It does not evaluate available disk capacity, snapshot ages, retention policy, backup status, snapshot labels, or recovery requirements. It also provides no dry run, selection step, or explicit confirmation gate. As with the ZFS recommendation, the formatter only prints the command. The destructive effect occurs if a user or remediation Agent executes the generated action guide. ### Attack Path 1. The collector reports more than 300 Timeshift snapshots. 2. The formatter marks the condition critical and presents `sudo timeshift --delete-all` as the remediation. 3. The report is sent to an operator or automation system. 4. The recipient executes the command with `sudo`, relying on the dashboard recommendation. 5. All Timeshift snapshots are deleted. 6. A later system failure, failed update, or configuration regression occurs. 7. Previously available Timeshift restore points are no longer available for recovery. ### Impact Assessment Execution requires root authorization and can permanently delete all Timeshift restore points visible to the command. The primary impact is loss of recovery capabili ...[truncated 309 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (42)

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · scripts/collect.sh (reported line 185)May include surrounding context.

sh
done

echo "=== FRIGATE ==="
frigate_stats=$(curl -s --max-time 5 http://localhost:5000/api/stats 2>/dev/null)
if [ -n "$frigate_stats" ]; then
    echo "$frigate_stats" | python3 -c "
import json,sys,os

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/format.py (reported line 46)May include surrounding context.

python
if is_lan:
        alerts.append(Alert('🟡','⚠️','防火墙未启用',
            'NAT后内网,外网无法直达',
            'sudo ufw enable && sudo ufw allow 22/tcp',
            '中危:路由器挡了外网,但内网设备可接触所有端口'))
    else:
        alerts.append(Alert('🔴','❌','防火墙未启用',

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/format.py (reported line 51)May include surrounding context.

python
if is_lan:
        alerts.append(Alert('🟡','⚠️','防火墙未启用',
            'NAT后内网,外网无法直达',
            'sudo ufw enable && sudo ufw allow 22/tcp',
            '中危:路由器挡了外网,但内网设备可接触所有端口'))
    else:
        alerts.append(Alert('🔴','❌','防火墙未启用',

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/format.py (reported line 58)May include surrounding context.

python
if is_lan:
        alerts.append(Alert('🟡','⚠️','防火墙未启用',
            'NAT后内网,外网无法直达',
            'sudo ufw enable && sudo ufw allow 22/tcp',
            '中危:路由器挡了外网,但内网设备可接触所有端口'))
    else:
        alerts.append(Alert('🔴','❌','防火墙未启用',

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/format.py (reported line 66)May include surrounding context.

python
if is_lan:
        alerts.append(Alert('🟡','⚠️','防火墙未启用',
            'NAT后内网,外网无法直达',
            'sudo ufw enable && sudo ufw allow 22/tcp',
            '中危:路由器挡了外网,但内网设备可接触所有端口'))
    else:
        alerts.append(Alert('🔴','❌','防火墙未启用',

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/format.py (reported line 188)May include surrounding context.

python
if is_lan:
        alerts.append(Alert('🟡','⚠️','防火墙未启用',
            'NAT后内网,外网无法直达',
            'sudo ufw enable && sudo ufw allow 22/tcp',
            '中危:路由器挡了外网,但内网设备可接触所有端口'))
    else:
        alerts.append(Alert('🔴','❌','防火墙未启用',

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The description advertises one-click collection of ZFS, SMART, Docker, security audit, network, and Telegram delivery, but does not clearly warn users that the skill gathers sensitive operational data and may transmit it off-host. Given the report includes hostname, IPs, open ports, login failures, camera identifiers, and service health, users may unknowingly expose internal infrastructure details.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad enough to match ordinary requests like 'server status' or 'system dashboard', which increases the chance the skill runs when a user did not intend to invoke a data-collection workflow. In this skill, accidental activation is more dangerous because execution leads to host inspection and possible outbound delivery of sensitive system information to Telegram.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
93% confidence
Finding

The skill explicitly depends on passwordless sudo for sensitive telemetry collection. While the apparent intent is operational monitoring rather than exploitation, this still creates a real privilege-escalation and data-exposure risk because an agent capable of invoking sudo-backed commands can access protected logs and storage health data without interactive approval.

Content

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

md
| upsc | UPS section | nut-client |
| journalctl | Logs | systemd (built-in) |

SMART, auth.log, and zpool events need `sudo -n` (passwordless sudo). Sections degrade gracefully if unavailable.

## Threshold Reference

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill notes that SMART, auth.log, and zpool events need 'sudo -n' passwordless sudo, but it does not clearly warn users about the security implications of granting such access. Passwordless sudo for disk, log, and pool inspection expands the agent's privilege boundary and can expose sensitive logs or enable abuse if the surrounding execution environment is compromised.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script’s usage comment explicitly instructs an agent to pipe the generated dashboard output to Telegram, which implies external transmission of collected system data without any built-in consent prompt, warning, redaction step, or destination validation. In the context of a NAS dashboard, the collected output may include sensitive host, storage, network, or operational details, making unintended disclosure plausible.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The header frames the script as a generic formatting/data collector, but the body performs security-sensitive enumeration such as failed logins, SSH configuration, firewall state, open ports, and fail2ban status. This mismatch can mislead users and reviewers about the scope of host inspection and the sensitivity of the collected output, increasing the chance of over-trusting or over-deploying the skill.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
87% confidence
Finding

The script invokes sudo to read SMART data from block devices, expanding execution into privileged hardware inspection. In skill/agent contexts, even non-interactive sudo can expose sensitive hardware metadata and normalize elevated execution without clear minimization or consent.

Content

Scanner excerpt · scripts/collect.sh (reported line 127)May include surrounding context.

sh
model=$(lsblk -ndo model "/dev/$disk" 2>/dev/null | xargs)
    size=$(lsblk -ndo size "/dev/$disk" 2>/dev/null | xargs)
    serial=$(lsblk -ndo serial "/dev/$disk" 2>/dev/null | xargs)
    smartinfo=$(sudo -n smartctl -A "/dev/$disk" 2>/dev/null)
    if [ -n "$smartinfo" ]; then
        temp_raw=$(echo "$smartinfo" | grep -E '^\s*194\s+Temperature_Celsius' | head -1 | awk '{print $10}' | tr -d '()')
        hours=$(echo "$smartinfo" | grep -i 'Power_On_Hours' | head -1 | awk '{print $NF}')

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
87% confidence
Finding

This second sudo call performs privileged SMART health inspection on disks. In aggregate with the rest of the script, it broadens host reconnaissance and may disclose detailed storage state that is unnecessary for a simple dashboard collector.

Content

Scanner excerpt · scripts/collect.sh (reported line 131)May include surrounding context.

sh
if [ -n "$smartinfo" ]; then
        temp_raw=$(echo "$smartinfo" | grep -E '^\s*194\s+Temperature_Celsius' | head -1 | awk '{print $10}' | tr -d '()')
        hours=$(echo "$smartinfo" | grep -i 'Power_On_Hours' | head -1 | awk '{print $NF}')
        status=$(sudo -n smartctl -H "/dev/$disk" 2>/dev/null | grep -i 'SMART overall-health\|SMART Health Status' | cut -d':' -f2 | xargs)
        # Critical SMART attributes
        realloc=$(echo "$smartinfo" | grep -E '^\s*5\s+Reallocated_Sector' | awk '{print $NF}')
        pending=$(echo "$smartinfo" | grep -E '^\s*197\s+Current_Pending' | awk '{print $NF}')

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
93% confidence
Finding

Reading failed SSH login records from auth logs via sudo collects sensitive security telemetry that can reveal attacker activity, usernames, and authentication patterns. In an agent skill, emitting this data as plain KEY=VALUE output increases the risk of unintended disclosure to the model, logs, or downstream systems.

Content

Scanner excerpt · scripts/collect.sh (reported line 273)May include surrounding context.

sh
echo "NFS_CLIENTS=${nfs_clients}"

echo "=== SECURITY ==="
failed_logins=$(sudo -n grep 'Failed password' /var/log/auth.log 2>/dev/null | wc -l || echo "?")
echo "FAILED_LOGINS=${failed_logins}"
last_login=$(last -n 3 2>/dev/null | head -3 | tr '\n' '|')
echo "LAST_LOGINS=${last_login}"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
89% confidence
Finding

Using sudo to inspect sshd_config for the SSH port contributes to privileged collection of service-hardening details. While the command is read-only, the resulting output helps profile the host's remote access surface and is more sensitive in an agent-operated environment.

Content

Scanner excerpt · scripts/collect.sh (reported line 281)May include surrounding context.

sh
# SSH config audit
sshd_cfg="/etc/ssh/sshd_config"
if [ -f "$sshd_cfg" ]; then
    ssh_port=$(sudo -n grep -E '^Port ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "22")
    ssh_root=$(sudo -n grep -E '^PermitRootLogin ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_pass=$(sudo -n grep -E '^PasswordAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_key=$(sudo -n grep -E '^PubkeyAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
90% confidence
Finding

The script uses sudo to inspect whether root login is permitted over SSH, exposing a high-value hardening setting. Disclosure of remote-access policy can materially aid reconnaissance if the output is logged, transmitted, or shown to less-trusted consumers.

Content

Scanner excerpt · scripts/collect.sh (reported line 282)May include surrounding context.

sh
sshd_cfg="/etc/ssh/sshd_config"
if [ -f "$sshd_cfg" ]; then
    ssh_port=$(sudo -n grep -E '^Port ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "22")
    ssh_root=$(sudo -n grep -E '^PermitRootLogin ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_pass=$(sudo -n grep -E '^PasswordAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_key=$(sudo -n grep -E '^PubkeyAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    echo "SSH_PORT=${ssh_port:-22}"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
90% confidence
Finding

PasswordAuthentication is a sensitive SSH hardening control; collecting it with sudo exposes whether password-based access is enabled. That information strengthens an attacker's targeting if the collector output leaves the host or is accessible to other components.

Content

Scanner excerpt · scripts/collect.sh (reported line 283)May include surrounding context.

sh
if [ -f "$sshd_cfg" ]; then
    ssh_port=$(sudo -n grep -E '^Port ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "22")
    ssh_root=$(sudo -n grep -E '^PermitRootLogin ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_pass=$(sudo -n grep -E '^PasswordAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_key=$(sudo -n grep -E '^PubkeyAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    echo "SSH_PORT=${ssh_port:-22}"
    echo "SSH_ROOT_LOGIN=${ssh_root:-?}"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
89% confidence
Finding

Inspecting PubkeyAuthentication via sudo is another privileged disclosure of SSH security posture. Although lower risk than password auth or root login, it still contributes to detailed host fingerprinting when aggregated with other outputs.

Content

Scanner excerpt · scripts/collect.sh (reported line 284)May include surrounding context.

sh
ssh_port=$(sudo -n grep -E '^Port ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "22")
    ssh_root=$(sudo -n grep -E '^PermitRootLogin ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_pass=$(sudo -n grep -E '^PasswordAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    ssh_key=$(sudo -n grep -E '^PubkeyAuthentication ' "$sshd_cfg" 2>/dev/null | awk '{print $2}' || echo "?")
    echo "SSH_PORT=${ssh_port:-22}"
    echo "SSH_ROOT_LOGIN=${ssh_root:-?}"
    echo "SSH_PASS_AUTH=${ssh_pass:-?}"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
88% confidence
Finding

Calling sudo ufw status collects privileged firewall posture data. In context, the script is marketed as a dashboard collector, so gathering security control state without strong disclosure increases risk of silent reconnaissance and sensitive environment leakage.

Content

Scanner excerpt · scripts/collect.sh (reported line 293)May include surrounding context.

sh
# Firewall status
if command -v ufw &>/dev/null; then
    fw_status=$(sudo -n ufw status 2>/dev/null | head -1 | awk '{print $2}' || echo "inactive")
    fw_rules=$(sudo -n ufw status numbered 2>/dev/null | grep -E '^\[' | wc -l || echo 0)
    echo "FW_UFW=${fw_status}"
    echo "FW_RULES=${fw_rules}"

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
88% confidence
Finding

Enumerating numbered UFW rules via sudo reveals more detailed firewall policy than a simple health check. Such policy details can expose internal services, allowed ports, and trust assumptions useful for post-compromise movement or external targeting.

Content

Scanner excerpt · scripts/collect.sh (reported line 294)May include surrounding context.

sh
# Firewall status
if command -v ufw &>/dev/null; then
    fw_status=$(sudo -n ufw status 2>/dev/null | head -1 | awk '{print $2}' || echo "inactive")
    fw_rules=$(sudo -n ufw status numbered 2>/dev/null | grep -E '^\[' | wc -l || echo 0)
    echo "FW_UFW=${fw_status}"
    echo "FW_RULES=${fw_rules}"
elif command -v iptables &>/dev/null; then

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
88% confidence
Finding

Using sudo iptables listing similarly exposes host network policy under elevated privileges. In an agent skill, this is more dangerous because the output may be consumed by systems outside the local administrative boundary.

Content

Scanner excerpt · scripts/collect.sh (reported line 298)May include surrounding context.

sh
echo "FW_UFW=${fw_status}"
    echo "FW_RULES=${fw_rules}"
elif command -v iptables &>/dev/null; then
    fw_rules=$(sudo -n iptables -L INPUT -n 2>/dev/null | grep -cE '^(ACCEPT|DROP|REJECT)' || echo 0)
    echo "FW_TYPE=iptables"
    echo "FW_RULES=${fw_rules}"
else

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
86% confidence
Finding

Querying fail2ban status with sudo discloses active intrusion-prevention controls. This contributes to attack-surface reconnaissance and reveals defensive tooling that may influence an adversary's tactics if exposed.

Content

Scanner excerpt · scripts/collect.sh (reported line 311)May include surrounding context.

sh
# fail2ban
if command -v fail2ban-client &>/dev/null; then
    f2b_active=$(sudo -n fail2ban-client status 2>/dev/null | grep -c 'Jail list' || echo 0)
    echo "F2B_ACTIVE=${f2b_active}"
fi

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
84% confidence
Finding

The script uses sudo to query Timeshift snapshot state, which requires elevated execution outside the originally advertised generic collection role. While not directly exposing credentials, it still normalizes privileged execution and may reveal backup/recovery posture useful to an attacker.

Content

Scanner excerpt · scripts/collect.sh (reported line 355)May include surrounding context.

sh
fi
    fi
done
# Method 2: try timeshift --list directly (works if sudo is configured)
if [ "$TS_COUNT" -eq 0 ] 2>/dev/null; then
    ts_list=$(sudo -n timeshift --list 2>/dev/null)
    if [ -n "$ts_list" ]; then

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script's natural-language strings, alerts, and action guidance are written in Chinese throughout, and there is no option for the user to select another language or locale. That is a language/locale policy concern under this rule because the skill enforces a specific language without opt-in or documented regional limitation.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.