Skip to content

feat: 工具沙箱和敏感操作拦截机制 #121

Closed

Description

@minorcell

问题描述

目前 memo 允许执行 shell 命令,但对于一些高风险操作(如 rm -rf /、rm -rf ~ 等)缺乏有效的拦截机制。虽然已有工具审批系统,但对于 session 级别审批或 --dangerous 模式,仍然存在误操作导致数据丢失的风险。

现状

  • 已有工具审批机制(once/session/deny)
  • --dangerous 模式会跳过所有审批
  • 但某些命令即使在审批后执行,也具有不可逆的高风险

建议方案

1. 敏感命令拦截(黑名单机制)

定义高危命令模式,在执行前强制拦截并额外确认:

- rm -rf /
- rm -rf ~
- rm -rf /*
- > /dev/sda
- mkfs.*
- dd if=/dev/zero of=/dev/sda
- 等等...

特点:

  • 即使使用 --dangerous 模式也需要额外确认
  • 支持配置是否完全禁止(不可覆盖)或仅额外警告

2. 工具沙箱(受限执行环境)

为 shell 命令执行提供可选的沙箱模式:

  • 文件系统沙箱: 限制命令只能在当前工作目录(或白名单目录)内操作
  • 网络沙箱: 限制网络访问
  • 资源限制: 限制 CPU/内存使用,防止 fork 炸弹

实现思路:

  • 使用 Linux namespace + cgroups
  • 或使用容器技术(如 Docker/Podman)
  • 或集成现有沙箱工具(如 bubblewrap, firejail)

3. 敏感路径保护

  • 自动识别并保护常见敏感路径(~/.ssh, ~/.config, 系统目录等)
  • 尝试操作这些路径时需要额外确认
  • 支持用户自定义保护路径

4. 操作可恢复性

对于某些操作,提供"软删除"或备份机制:

  • 删除文件时先移到回收站/临时目录
  • 修改文件前自动备份
  • 提供 undo 命令恢复最近的操作

配置示例

[security]
# 启用敏感命令拦截
block_dangerous_commands = true

# 完全禁止(不可覆盖)的命令
forbidden_commands = ["rm -rf /", "mkfs.ext4 /dev/sda"]

# 沙箱模式
sandbox_mode = "filesystem"  # none | filesystem | container

# 保护路径
protected_paths = ["~/.ssh", "~/.memo", "/etc"]

优先级

高 - 涉及数据安全,防止误操作导致不可挽回的损失

参考实现

  • GitHub Copilot CLI 的危险命令拦截
  • AWS CloudShell 的受限环境
  • VS Code 终端的链接信任机制
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:coreCore runtime and session statearea:securityApproval, sandbox, and security policyneeds-triageIssue needs initial triage

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions