release: nexus btpanel session fix and app-v2
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# 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 代理下载投递
|
||||
|
||||
```mermaid
|
||||
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 面板直链下载投递
|
||||
|
||||
```mermaid
|
||||
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. 验证记录
|
||||
|
||||
```bash
|
||||
.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. 下一步建议
|
||||
|
||||
1. 继续审查 `server/api/servers.py` 的 agent 安装/升级/回滚命令拼接与超时边界。
|
||||
2. 审查 `remote_shell.py` / `asyncssh_pool.py` 的 stdout/stderr 截断、敏感输出脱敏和 sudo fallback 一致性。
|
||||
3. 审查 API 鉴权覆盖:确认所有管理接口均有管理员依赖,公开下载类接口只暴露必要的 token 校验。
|
||||
Reference in New Issue
Block a user