nas:一个面向 Synology DSM 7 的零依赖 Python CLI + MCP 服务器。一条命令即可审计并修复 C3RB3R / .L0CK3D 勒索软件攻击活动;把它交给你的 AI 代理即可。
用一条命令即可针对 C3RB3R / .L0CK3D 勒索软件活动审计 Synology NAS,再用第二条命令修复其发现的问题,之后便可继续从终端运行 DSM。
规范仓库、发布版本与问题追踪:https://gitlab.com/aa22396584/synology-nas-cli
nas 是一个零依赖的 Python CLI(仅使用标准库,Python 3.8+,因此也可直接在 DSM 本身上运行),同时也是一个面向 Synology DSM 7 Web API 的 stdio MCP 服务器:提供状态、健康检查、日志、软件包、卷、Tailscale、DSM 升级、推送到 webhook 的定时健康告警,以及一个事件审计与修复工具——该工具是在 2026 年 10 月针对暴露于互联网的 Synology NAS 设备的 C3RB3R / .L0CK3D 活动期间构建的(Synology-SA-24:20、SA-26:13、SA-26:14)。
与 Synology Inc. 无关联。"Synology"、"DSM" 和 "QuickConnect" 是 Synology Inc. 的商标。
nas incident fix将以下任一提示词粘贴到 Claude Code、Codex、Cursor、Gemini CLI、OpenCode、Grok Bot 或任何可使用工具的 AI 智能体中(Grok Bot 设置、技能与告警例程:docs/GROK-BOT.md):
英文提示词:
Use https://github.com/akari-sora/synology-nas-cli to audit and fix my Synology NAS at https://192.0.2.10:5001. Follow docs/AGENT-RUNBOOK.md.
繁体中文提示词:
使用 https://github.com/akari-sora/synology-nas-cli 檢查並修復我的 Synology NAS(位址:https://192.0.2.10:5001),照著 docs/AGENT-RUNBOOK.md 的步驟執行。
./bin/nas --version。nas setup:运行 nas setup --json --no-input ... 以写入 ~/.config/synology-nas-cli/config.json(权限 0600),登录一次以验证凭据,并在首次使用时固定 DSM 的 TLS 证书 SHA-256 指纹。nas doctor:运行 nas doctor --json 以验证配置、凭据、源可达性、TLS 固定、登录、DSM 版本是否符合 SA-26:13、两步验证状态、管理员能力以及时钟偏差。nas incident:运行 nas incident --json(可选 --probe --scan)对 DSM 版本、存在漏洞的软件包、防火墙、QuickConnect、UPnP 路由器规则、公网端口、外部及失败登录、AutoBlock、SMB1、内置 admin 账户、快照计划、不受支持型号的 WORM 锁定陷阱、勒索信以及 CVE-2024-10441 漏洞利用尝试进行只读审计。nas incident fix --dry-run --json --ransom-scan,显示每一项计划变更(before -> after)、确切的 DSM Web API 调用以及对应的 DSM Web UI 路径。nas incident fix --yes:按顺序应用已批准的计划(snapshot_worm → snapshots → packages → smb_min_protocol → quickconnect → router_port_forwarding → autoblock → admin_account → firewall,外加可选的 --rotate-password 和 --upgrade),回读每一项设置以进行验证,并重新运行审计。--deep 和 alert-deploy:运行 nas incident --deep --json(通过任务计划程序运行一个只读的 root 收集器,检查仅 root 可访问的日志、crontab、/bin 二进制文件、账户、SSH 密钥和 /proc)以及 nas alert-deploy --json --test(将 10 分钟一次的健康与安全监控推送到 webhook)。https://192.0.2.10:5001,如果使用 VPN/Tailscale,还需提供其 URL)。op://VAULT/ITEM/password、密码命令或操作系统钥匙串)。192.0.2.0/24)。/docker/.nas-cli-deploy,供 --deep 和 alert-deploy 使用)。nas setup 以退出码 3 退出并返回 "field": "otp" 时,提供当前的 6 位验证码;--trust-device 会存储 DSM 的受信任设备令牌(0600),以便后续命令无需验证码。nas incident fix --yes 之前审查 dry-run 计划(并选择是否包含 --rotate-password 或 --upgrade)。完整的代理规范:docs/AGENT-RUNBOOK.md。
nas incident 是只读的。每一项都会打印 PASS、WARN、FAIL 或 SKIP,并附带一行提示(--json 输出结构化 JSON;schema 见 schemas/incident.schema.json)。当任何一项为 FAIL 时,退出状态为 1。
| 项目 | nas incident 报告的内容 | nas incident fix 更改的内容 |
|---|---|---|
dsm_version | 如果 DSM 构建版本早于其分支的 SA-26:13 修复构建版本,或处于没有 SA-26:13 修复的分支(DSM 7.1 及更早版本),则报告 FAIL;如果已修补,则报告 PASS | 使用 --upgrade:下载该型号最新的官方 .pat,运行 PreCheck,安装并重启 |
sa_26_14_packages | 根据 Synology-SA-26:14(Calendar、MailStation、PHP 7.3–8.4)检查已安装的套件:如果正在运行易受攻击的版本,则报告 FAIL;如果已安装但已停止,则报告 WARN | 停止正在运行的易受攻击套件(--only packages) |
firewall | 当防火墙关闭且 NAS 自身持有公网 IP(例如拨号 PPPoE)时报告 FAIL;当防火墙关闭但位于 NAT 之后时报告 WARN;当接口接受未匹配的流量或规则允许任意来源(source_ip: all)时报告 FAIL/WARN | 启用防火墙,为本机的 /32(按 DSM 记录的方式)以及 LAN 接口上的 IPv4 allowed_networks 添加允许规则,将所有非 global 接口策略设置为 drop,并移除允许任意来源的规则(--only firewall) |
quickconnect | 当 QuickConnect 或 QuickConnect 自动路由器端口转发已启用时报告 FAIL | 关闭 QuickConnect 及其 UPnP 路由器端口转发(--only quickconnect) |
router_port_forwarding | 当 DSM 已在路由器上启用 UPnP/NAT-PMP 端口转发规则时报告 FAIL | 禁用所有由 DSM 管理的路由器端口转发规则(--only router_port_forwarding) |
public_ports | 仅在 --probe 时:从本机向 NAS 公网 IP 上的 DSM 和文件服务端口发起 TCP 连接(如果有任何端口响应,则报告 FAIL) | 由 firewall、quickconnect 和 router_port_forwarding 覆盖 |
external_signins | 当连接日志包含来自 allowed_networks 之外源地址的成功登录时报告 FAIL | 无(调查未经授权的访问;参见 docs/INCIDENT-C3RB3R.md) |
failed_signins | 当最近 --hours(默认 24)内的失败登录次数超过 --failed-threshold(默认 20)时报告 WARN | 由 firewall 和 autoblock 缓解 |
autoblock | 当 AutoBlock 已禁用时报告 FAIL | 启用 AutoBlock(5 分钟内 10 次尝试,永久封禁),并将本机 IP 以及 IPv4 allowed_networks(如果 incident.autoblock_allow_loopback 为 true,还包括 127.0.0.1)加入允许列表(--only autoblock) |
smb_min_protocol | 当 SMB 已启用且允许 SMB1(smb_min_protocol=0)时报告 FAIL;当 SMB 已关闭但最低协议为 SMB1 时报告 WARN | 将最低 SMB 协议提升至 SMB2(smb_min_protocol=1、smb_max_protocol=3)(--only smb_min_protocol) |
admin_account | 当内置 admin 账户已启用(expired: normal)时报告 FAIL | 在确认存在另一个已启用的管理员且当前会话不是 admin 后,通过临时 root 任务禁用内置 admin 账户(--only admin_account) |
snapshot_schedule:<share> | 按共享文件夹:如果不存在快照计划、计划已禁用,或最新的计划快照早于 snapshot_max_age_hours(默认 26 小时),则报告 FAIL | 在尚无计划的共享上创建每日快照计划(默认 03:30)和 14 天保留策略;需在同一次运行中通过 --ransom-scan 扫描,或使用 --i-know-snapshots-may-rotate(--only snapshots) |
snapshot_worm:<share> | 当在 SYNO.DisasterRecovery.Retention info 缺少 worm 的型号上启用了不可变快照(WORM)锁时报告 FAIL(DSM 接受 API 调用,但计划快照会静默停止) | 在受影响的共享上关闭不受支持的 WORM 锁,使计划快照恢复;与 snapshots 一样受相同条件限制(--only snapshot_worm) |
ransomware_files | 仅在 --scan 时:通过 File Station 在共享中搜索 *.L0CK3D、*.LOCK3D 和 read-me3.txt(如果找到任何匹配项,则报告 FAIL) | 无(需要事件响应;参见 docs/INCIDENT-C3RB3R.md) |
exploit_attempts | 扫描 DSM 连接日志,查找 CVE-2024-10441 登录注入标记(PLUGIN_VALUE_END、LD_PRELOAD=、LD_DEBUG_OUTPUT)以及 incident.ioc_ips(发现尝试时给出 WARN) | 无(使用 --deep 检查以确认是否有任何尝试成功) |
exploit_attempts_logs、ioc_cron、ioc_binaries、ioc_users、ioc_ssh_keys、ioc_processes | 仅在 --deep 下:运行一个只读 root 收集器,检查 /var/log/synoplugin.log*、/var/log/synoscgi.log*、/var/log/auth.log*、crontab(/etc/cron.d/synot*)、/bin/libgld、/bin/qnetd、/bin/l0ck.enc、xdy5*、额外的 uid-0 或未知账户、authorized_keys 以及 /proc 进程/连接(发现已知 C3RB3R 痕迹时给出 FAIL,发现未知条目时给出 WARN) | 无(需要事件响应;参见 docs/INCIDENT-C3RB3R.md) |
SKIP 始终会说明原因:该项需要某个标志(--probe、--scan),API 返回了错误,或者 NAS 不使用该功能(没有 Btrfs/Snapshot Replication,DSM 中未配置路由器)。
git clone https://gitlab.com/aa22396584/synology-nas-cli.git synology-nas-cli
cd synology-nas-cli
./bin/nas --help # runs directly from the checkout (Python 3.8+ stdlib only)
ln -s "$PWD/bin/nas" ~/bin/nas # optional: put `nas` on PATH
pip 从 GitLab 发布版本或本地检出安装pip install https://gitlab.com/aa22396584/synology-nas-cli/-/archive/v1.0.0/synology-nas-cli-v1.0.0.tar.gz
# or from a local checkout:
pip install -e . # or: pipx install .
nas --help
py)