4.1 KiB
4.1 KiB
Nexus SSH 命令执行安全巡检阶段 3:跨服务器文件传输与项目专用 Skill
日期:2026-07-07
分支:audit/security-review
范围:跨服务器文件传输、BT 面板直链下载投递、远程归档压缩/解压、项目专用审查 Skill。
1. 本阶段结论
本阶段补齐了跨服务器文件传输链路中遗留的高风险边界:
- 传输包在目标服务器解压时,复用了统一的安全解压流程,先列成员、校验路径和类型,再解压。
- 远程
mkdir、mv、rm、归档 staging move 增加--参数终止符,避免以-开头的路径被当成命令选项。 pull_transfer_package与 BT 直链投递目标路径改为统一normalize_remote_abs_path校验,拒绝..与反斜杠。- 新增
.skills/下 Nexus 专用安全巡检规范,后续每轮审查可按固定规则执行。
完整测试结果:748 passed, 1 skipped。
2. 调用链
2.1 Nexus 代理下载投递
flowchart TD
A["API: transfer package/deliver"] --> B["server_file_transfer_service.create_transfer_package"]
B --> C["run_remote_compress(source)"]
C --> D["Redis transfer_package_store: token/meta/ttl"]
D --> E["pull_transfer_package(dest)"]
E --> F["curl Nexus signed transfer URL to /tmp staging"]
F --> G["mv -- staging -> dest archive path"]
G --> H["run_remote_decompress(dest): list members"]
H --> I["validate names/types"]
I --> J["safe tar/unzip extract"]
J --> K["apply_transfer_permissions"]
2.2 BT 面板直链下载投递
flowchart TD
A["deliver_transfer_package"] --> B["source has BT API credentials"]
B --> C["_deliver_via_btpanel_download"]
C --> D["run_remote_compress(source)"]
D --> E["signed_download_url(BT)"]
E --> F["dest curl BT download URL to /tmp staging"]
F --> G["mv -- staging -> dest archive path"]
G --> H["run_remote_decompress(dest)"]
H --> I["validate archive member names/types"]
I --> J["extract + permissions"]
3. 修复点
| 文件 | 修复 |
|---|---|
server/application/services/server_file_transfer_service.py |
_extract_archive_on_server() 改为调用 run_remote_decompress(),解压前校验归档成员;目标路径使用 normalize_remote_abs_path();mkdir/mv/rm 增加 --。 |
server/infrastructure/ssh/remote_archive.py |
tar/zip staging 压缩后的 mv 改为 mv -f -- ...。 |
tests/test_server_file_transfer.py |
新增安全解压委托、解压校验错误、目标路径穿越拒绝、下载 staging move/rm 参数终止符测试;更新旧的 tar overwrite 行为测试。 |
tests/test_remote_archive_commands.py |
新增 tar/zip staging move 参数终止符测试。 |
.skills/nexus-security-review/SKILL.md |
固化 Nexus 安全巡检总规则。 |
.skills/nexus-ssh-safety/SKILL.md |
固化 SSH 命令、路径、归档安全规则。 |
.skills/nexus-btpanel-review/SKILL.md |
固化宝塔一键登录/凭据/会话修复审查规则。 |
4. 边界说明
script_service是管理员显式远程 shell 能力,本阶段没有把它作为命令注入漏洞处理;后续只审查鉴权、审计、超时、输出截断和脱敏。- 文件传输仍允许管理员选择任意绝对目标路径,但不允许路径字符串中包含
..、反斜杠或非绝对路径。 - 归档解压会拒绝绝对路径、父目录穿越、Windows 反斜杠、符号链接、硬链接和设备/FIFO/socket 等特殊条目。
- 未在报告中记录任何密码、token、cookie、SSH key 或 BT API key。
5. 验证记录
.venv/bin/python -m pytest tests/test_server_file_transfer.py tests/test_remote_archive_commands.py -q
# 40 passed
.venv/bin/python -m pytest -q
# 748 passed, 1 skipped
git diff --check
# pass
6. 下一步建议
- 继续审查
server/api/servers.py的 agent 安装/升级/回滚命令拼接与超时边界。 - 审查
remote_shell.py/asyncssh_pool.py的 stdout/stderr 截断、敏感输出脱敏和 sudo fallback 一致性。 - 审查 API 鉴权覆盖:确认所有管理接口均有管理员依赖,公开下载类接口只暴露必要的 token 校验。