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. 利用链构建

  1. CRLF注入配置文件:通过镜像仓库功能注入恶意配置
  2. 控制Git配置参数:利用注入的配置控制Git行为
  3. 触发命令执行:通过特定Git操作触发恶意配置执行

漏洞利用

1. 可利用的Git配置参数

经过分析,以下Git配置参数可用于命令执行:

  1. core.hooksPath:控制Git hooks目录(需解决路径和权限问题)
  2. core.pager:可直接执行命令(但在Go环境中可能受限)
  3. core.gitProxy:可执行程序但无法带参数
  4. 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. 完整利用步骤

  1. 注入恶意配置

    • 通过镜像仓库功能的配置保存接口注入包含CRLF的配置
    • 注入格式示例:
      [core]
          sshCommand = /bin/bash -c '恶意命令'
      
  2. 触发命令执行

    • 使用git remote update或镜像同步功能触发
    • 这些操作内部会调用git fetch,进而使用SSH协议
  3. 利用优化

    • 刷新配置后再次保存可使格式更规范
    • 通过配置合并特性将core参数合并

防御措施

  1. 升级到Gitea 1.7.6或更高版本
  2. 对镜像地址输入进行严格格式校验
  3. 限制Git配置参数的可设置范围
  4. 使用更新的ini解析库版本

技术总结

该漏洞是典型的"配置注入+特性滥用"组合漏洞:

  1. 利用INI解析漏洞注入恶意配置
  2. 滥用Git的灵活配置特性实现命令执行
  3. 通过Gitea的镜像同步功能触发

这种组合漏洞的挖掘需要对多个组件的深入理解和关联思考能力。

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 包在处理配置写入时存在缺陷: 当写入包含换行符的值时,解析器会添加 """ 进行转义,但可以通过闭合引号实现注入。 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): 当使用SSH协议时会进入此分支,执行配置的SSH命令。 3. 完整利用步骤 注入恶意配置 : 通过镜像仓库功能的配置保存接口注入包含CRLF的配置 注入格式示例: 触发命令执行 : 使用 git remote update 或镜像同步功能触发 这些操作内部会调用 git fetch ,进而使用SSH协议 利用优化 : 刷新配置后再次保存可使格式更规范 通过配置合并特性将core参数合并 防御措施 升级到Gitea 1.7.6或更高版本 对镜像地址输入进行严格格式校验 限制Git配置参数的可设置范围 使用更新的ini解析库版本 技术总结 该漏洞是典型的"配置注入+特性滥用"组合漏洞: 利用INI解析漏洞注入恶意配置 滥用Git的灵活配置特性实现命令执行 通过Gitea的镜像同步功能触发 这种组合漏洞的挖掘需要对多个组件的深入理解和关联思考能力。