CVE-2019-11229 Gitea RCE
字数 1103 2025-08-27 12:33:48
Gitea CVE-2019-11229 RCE漏洞分析与利用教学
漏洞概述
CVE-2019-11229是Gitea在1.7.6版本修复的一个远程代码执行漏洞,该漏洞通过组合利用INI配置文件CRLF注入和Git配置参数注入实现远程命令执行。
漏洞分析
1. 漏洞根源
漏洞根源在于gopkg.in/ini.v1包的CRLF(回车换行)注入漏洞,结合Git的特定配置参数实现RCE。
关键修改点:
- 删除了
"gopkg.in/ini.v1"包 - 添加了镜像地址的格式校验
- 修改了仓库镜像功能的配置读写逻辑
2. CRLF注入分析
在SaveAddress函数中存在写配置操作,gopkg.in/ini.v1包在处理配置写入时存在缺陷:
type Key struct {
s *Section
Comment string
name string
value string
isAutoIncrement bool
isBooleanType bool
isShadow bool
shadows []*Key
}
type Section struct {
f *File
Comment string
name string
keys map[string]*Key
keyList []string
keysHash map[string]string
isRawSection bool
rawBody string
}
当写入包含换行符的值时,解析器会添加"""进行转义,但可以通过闭合引号实现注入。
3. 利用链构建
- CRLF注入配置文件:通过镜像仓库功能注入恶意配置
- 控制Git配置参数:利用注入的配置控制Git行为
- 触发命令执行:通过特定Git操作触发恶意配置执行
漏洞利用
1. 可利用的Git配置参数
经过分析,以下Git配置参数可用于命令执行:
- core.hooksPath:控制Git hooks目录(需解决路径和权限问题)
- core.pager:可直接执行命令(但在Go环境中可能受限)
- core.gitProxy:可执行程序但无法带参数
- core.sshCommand:替换SSH命令(最佳利用点)
2. core.sshCommand利用
core.sshCommand是Git的一个配置项,当调用SSH时会使用该值替换默认SSH命令。
关键代码(Git源码connect.c):
if (protocol == PROTO_SSH) {
char *ssh_host = hostandport;
const char *port = NULL;
transport_check_allowed("ssh");
get_host_and_port(&ssh_host, &port);
if (!port)
port = get_port(ssh_host);
// ...省略诊断输出...
conn->trace2_child_class = "transport/ssh";
fill_ssh_args(conn, ssh_host, port, version, flags);
}
当使用SSH协议时会进入此分支,执行配置的SSH命令。
3. 完整利用步骤
-
注入恶意配置:
- 通过镜像仓库功能的配置保存接口注入包含CRLF的配置
- 注入格式示例:
[core] sshCommand = /bin/bash -c '恶意命令'
-
触发命令执行:
- 使用
git remote update或镜像同步功能触发 - 这些操作内部会调用
git fetch,进而使用SSH协议
- 使用
-
利用优化:
- 刷新配置后再次保存可使格式更规范
- 通过配置合并特性将core参数合并
防御措施
- 升级到Gitea 1.7.6或更高版本
- 对镜像地址输入进行严格格式校验
- 限制Git配置参数的可设置范围
- 使用更新的ini解析库版本
技术总结
该漏洞是典型的"配置注入+特性滥用"组合漏洞:
- 利用INI解析漏洞注入恶意配置
- 滥用Git的灵活配置特性实现命令执行
- 通过Gitea的镜像同步功能触发
这种组合漏洞的挖掘需要对多个组件的深入理解和关联思考能力。