alejandroqh/sudo39
GitHub: alejandroqh/sudo39
一个基于 MPC 的 sudo 提升桥接服务器,通过 MCP 协议安全委派特权操作。
Stars: 0 | Forks: 0
# sudo39
sudo39 是一个使用 [TurboMCP](https://github.com/Epistates/turbomcp) 构建的小型 MCP 服务器。其主要工具是:
```
sudo_run(command, arguments?, mode?)
```
无害示例 MCP 工具参数:
```
{
"command": "id",
"mode": "auto"
}
```
优先使用结构化参数(如果可能):
```
{
"command": "systemctl",
"arguments": ["restart", "nginx"],
"mode": "sudo"
}
```
## 提升模型
`sudo39` 故意不接受密码参数。通过 MCP 客户端发送的密码可能最终出现在模型上下文、日志、跟踪、shell 历史记录和转录中。请在主机上配置提升权限:
- Linux:在 `auto` 模式下使用 `sudo`,如果 `sudo` 无法运行则使用 `pkexec`。设置 `SUDO39_ASKPASS` 以让 `sudo -A` 通过 askpass 助手请求凭据。
- macOS:`auto` 使用 `osascript` 并调用原生管理员提示。
- Windows:`auto` 使用 PowerShell `Start-Process -Verb RunAs` 触发 UAC。
默认情况下,所有程序都被拒绝。在启动前配置以下选项之一:
```
# 更安全:仅允许命名程序。
export SUDO39_ALLOWED_PROGRAMS=id,whoami,systemctl
# 不安全:允许任意提升的程序。
export SUDO39_ALLOW_UNSAFE=1
```
启动环境会初始化运行时策略。你也可以通过 MCP 管理工具更改活动策略:
- `sudo39_policy()`
- `sudo39_add_allowed_program(program, confirmation)`
- `sudo39_remove_allowed_program(program, confirmation)`
- `sudo39_set_allow_unsafe(enabled, confirmation)`
- `sudo39_reload_policy_from_env(confirmation)`
每个修改型管理工具都需要一个确切的确认短语。使用以下 MCP 提示生成显示给用户的短语:
- `confirm_add_allowed_program(program)`
- `confirm_remove_allowed_program(program)`
- `confirm_set_allow_unsafe(enabled)`
- `confirm_reload_policy_from_env()`
示例流程:
```
prompt: confirm_add_allowed_program("id")
tool: sudo39_add_allowed_program(program: "id", confirmation: "ADD PROGRAM id")
```
不安全模式也受到限制:
```
prompt: confirm_set_allow_unsafe("true")
tool: sudo39_set_allow_unsafe(enabled: true, confirmation: "ENABLE UNSAFE")
```
这些更改仅存在于内存中。重启服务器会恢复到 `SUDO39_ALLOWED_PROGRAMS` 和 `SUDO39_ALLOW_UNSAFE` 的策略。
`sudo39_reload_policy_from_env` 会用服务器进程环境替换内存中的策略。这仅在 supervisor 或启动器更改了进程环境时有用;在别处编辑 shell 变量不会修改已运行进程的环境。
在执行依赖调用时,请在调用 `sudo_run` 或 `sudo39_policy` 前等待管理工具响应。JSON-RPC 请求可能并发处理,因此同时发送多个请求无法保证策略更新顺序。
运行时限制默认为 30 秒和每个输出流 4 KiB(约 1000 个 LLM token):
```
export SUDO39_TIMEOUT_SECS=30
export SUDO39_OUTPUT_LIMIT_BYTES=4096
```
对于 `sudo` 密码提示,请设置 `SUDO39_ASKPASS` 为与 MCP 服务器相同信任边界的 askpass 助手:
```
export SUDO39_ASKPASS=/absolute/path/to/askpass
```
模式:
- `auto`
- `sudo`
- `pkexec`
- `macos_osascript`
- `windows_uac`
## 安装
```
cargo install sudo39
```
### 为任意 AI CLI / IDE 安装
安装二进制文件并自动配置所有检测到的 MCP 客户端:**Claude Code**、**Claude Desktop**、**Codex**、**OpenCode**、**OpenClaw**。
```
curl -fsSL https://raw.githubusercontent.com/alejandroqh/marketplace/main/h39.sh | sh
```
## 构建
```
cargo build --release
```
## MCP 客户端配置
对于 stdio MCP 客户端:
```
{
"mcpServers": {
"sudo39": {
"command": "/absolute/path/to/sudo39",
"args": []
}
}
}
```
## 注意事项
任何被授予访问权限的 MCP 客户端都可以请求活动策略允许的提升操作。如果客户端可以调用管理工具,它还可以在确认步骤后扩展活动策略。请将客户端、服务器进程环境和 askpass 助手视为管理信任边界。
由于 stdin/stdout 已被用作协议传输,`sudo` 无法在 MCP stdio 上安全地提示输入密码。如果未配置 askpass 助手,`sudo39` 会运行 `sudo -n`,这会直接失败而不是提示输入。这是故意设计的。
命令在不使用 shell 的情况下执行(Linux 和 Windows)。在 macOS 上,管理员提示路径使用 AppleScript 的 `do shell script`;`sudo39` 在传递给 AppleScript 前会对程序和参数向量进行 shell 转义。请使用 `arguments` 数组传递参数;`command` 必须是单个程序路径。
返回的 `launcher_exit_status`、`stdout` 和 `stderr` 来自提升启动器,并受 `SUDO39_OUTPUT_LIMIT_BYTES` 限制:在 Linux 上通常是通过 `sudo` 或 `pkexec` 执行的提升命令;在 macOS 上是 `osascript`;在 Windows 上是 PowerShell `Start-Process` 启动器,而不是对提升子进程输出的可靠捕获。
每次执行或策略更改都会向 stderr 写入一条包含时间戳和相关策略或命令字段的最小审计事件。不会记录 stdout 或 stderr。
标签:AI合规, GitHub Advanced Security, MCP 服务器, SEO: Elevation bridge, SEO: sudo39, sudo, SUDO39_ASKPASS, TurboMCP, 主机配置, 协议分析, 受控执行, 可控运行, 可视化界面, 安全加固, 安全策略, 提示词设计, 服务器监控, 权限提升, 特权 escalation, 确认机制, 管理员工具, 通知系统