
OliveTin 是一个自托管的 Web UI,用于向最终用户公开预定义的 shell 命令。此存储库包含一个概念验证,演示 OliveTin Shell 模式执行路径中的两个独立的 OS 命令注入向量,两者都绕过了应用程序预期的 shell 参数安全检查。
| CVE ID | CVE-2026-27626 |
| 组件 | OliveTin |
| 漏洞类别 | CWE-78:OS命令中特殊元素的不当中和 |
| CVSS 3.1 | 9.9–10.0(严重)— AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 受影响版本 | 所有版本 ≤ 3000.10.0(0.0.0-20260222101908-4bbd2eab1532 之前的提交) |
| 修复版本 | 0.0.0-20260222101908-4bbd2eab1532 或更高版本 |
| 安全公告 | GHSA-49gm-hh7w-wfvf |
| 披露日期 | 2026-02-22(公告),2026-02-25(NVD) |
OliveTin 是一个自托管的 Web UI,用于向最终用户暴露预定义的 shell 命令。该仓库提供了一个概念验证,演示了 OliveTin 的 Shell 模式执行路径中存在两个独立的 OS 命令注入向量,这两个向量均绕过了应用程序预期的 shell 参数安全检查。
OliveTin 允许管理员定义 Actions —— 带有参数化参数的 shell 命令 —— 经身份验证(或根据配置,匿名)的用户可以通过 Web UI 或 Webhook 触发这些命令。为防止用户通过参数值突破预期命令,OliveTin 在将用户提供的每个参数模板化到命令字符串并传递给 sh -c 之前,会通过 checkShellArgumentSafety() 对其进行处理。
这正是漏洞突破的安全边界。OliveTin 明确区分了“管理员定义命令”和“用户提供值”——安全检查存在的目的就是防止用户将参数值转变为执行任意命令的方式。
password 参数类型未经检查checkShellArgumentSafety() 仅对固定的允许参数类型列表进行清理:
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// BUG: "password" 类型未检查
return true // 假定安全
}
password 是一种已记录的、用于接收敏感用户输入的预期参数类型——但它不在 dangerousTypes 中,因此会直接落到 return true 而未被清理。任何能够填充 Shell 模式 Action 的 password 类型参数的用户,都可以注入 shell 元字符(;、|、`、$() 等),从而以 OliveTin 进程用户的身份执行任意命令。
此处的可利用性因 OliveTin 的默认设置而放大:自注册功能默认开启,且默认情况下 authType: none。因此,在许多实际部署中,“经过身份验证的用户”几乎不需要任何实际障碍。
独立于向量 1,OliveTin 的 webhook 处理程序从入站 webhook 的 JSON 体中提取任意键值对,并将其直接注入到 ExecutionRequest.Arguments 中(service/internal/executor/handler.go:153-157)。
由于这些 webhook 派生的键在操作的配置中没有对应的 ActionArgument,parseActionArguments()(arguments.go)找不到要检查的参数类型,因此完全跳过 checkShellArgumentSafety()——不仅针对 password,而是针对所有类型。原始值被模板化到 shell 命令中,并在零验证的情况下传递给 sh -c。
由于接收来自外部/不受信任来源的入站 webhook 是 OliveTin 的主要支持用例之一,因此此向量根本不需要任何身份验证。
以 Shell 模式运行的 OliveTin 实例,如果包含任何可通过 webhook 触发的 Action,则容易受到未经身份验证的远程代码执行的攻击,其权限为 OliveTin 进程的权限——根据 OliveTin 的部署方式(裸机 vs. 容器、授予的能力等),可能导致主机完全沦陷。
如果您的 OliveTin 实例满足以下条件,则很可能存在漏洞:
password 类型参数的 Action 暴露给不受信任/低权限用户(向量 1),或python3 CVE-2026-27626.py -u <TARGET> [OPTIONS]
| 选项 | 描述 | 默认值 |
|---|---|---|
-u, --url | 目标主机/IP | 必需 |
-p, --port | OliveTin 端口 | 1337 |
-x, --cmd | 要执行的命令 | id |
0.0.0-20260222101908-4bbd2eab1532 或更高版本,一旦您的更新渠道可用,请尽快操作。password 类型参数。authType 非 none)。| 日期 | 事件 |
|---|---|
| 2026-02-20 | CVE 保留 |
| 2026-02-22 | GitHub 安全公告发布 |
| 2026-02-25 | NVD 发布 |
| 2026-02-27 | 公告更新 |
此 PoC 仅用于防御性研究、检测工程和授权的渗透测试目的。请勿对您不拥有或未获得明确书面授权测试的系统运行。滥用此代码针对第三方系统可能违反计算机犯罪法律(例如美国的 CFAA、英国的《计算机滥用法》及他国的等效法规),并且完全由执行者承担全部责任。
Md Saikat (0xh7ml)