GitLab CI Lint API 服务端请求伪造漏洞(CVE-2021–39935)技术分析

3 阅读8分钟

GitLab CI Lint API 服务端请求伪造漏洞(CVE-2021–39935)

2026年2月初,美国网络安全和基础设施安全局(CISA)将影响GitLab社区版和企业版的服务端请求伪造(SSRF)漏洞CVE-2021–39935加入其已知被利用漏洞目录(KEV Catalog)。尽管该漏洞最初于2021年得到修复,但由于有新的证据表明攻击者正在积极利用未打补丁、暴露在互联网上的GitLab实例,CISA将其列为需要紧急修复的问题。

CISA要求联邦机构在2026年2月24日前完成缓解措施(根据BOD 22–01),并强烈建议私营企业组织以同等优先级进行修复。本文聚焦于CVE-2021–39935,探讨外部暴露的GitLab实例如何导致真实世界攻击,并概述基于攻击面驱动的识别和管理此类暴露的策略。

GitLab CI Lint API SSRF 漏洞概述

  • 漏洞ID: CVE-2021–39935
  • 受影响产品: GitLab 社区版(CE)、企业版(EE)
  • 漏洞类型: 服务端请求伪造 (SSRF), CWE-918
  • 攻击条件: 可远程利用,无需认证(未认证)
  • 主要影响: GitLab服务器向攻击者指定的任意URL发起服务端请求 → 导致内部资源访问或扫描、元数据泄露以及链式二次利用

CVE-2021–39935 源于GitLab的CI Lint API中对用户提供的URL验证不当,该API用于CI/CD配置验证和流水线模拟。攻击者可以构造恶意API请求,使GitLab服务器向内部网络地址(如RFC1918)或攻击者选择的外部资源发起请求。由于CI/CD和DevOps平台集中了大量高价值机密(如源代码、令牌、部署密钥和仓库凭证),一个简单的SSRF漏洞很容易从“单服务失陷”演变为整个组织横向移动的初始访问向量。

CISA基于积极利用的证据将该漏洞加入KEV目录。这表明攻击者已经在使用自动化扫描和漏洞利用链主动搜寻未打补丁的GitLab实例,通过外部暴露的CI/CD平台转向内部环境的攻击企图再次出现。

利用流程与攻击场景的技术分解

SSRF的攻击机制简单:用户输入 → 服务器代表用户发起请求 → 攻击者间接访问服务器可见的资源。核心问题在于CI Lint API在CI配置验证过程中未充分验证用户提供的URL,导致GitLab服务器可以被诱导向这些URL发起请求。如果未认证的外部攻击者能够构造并提交调用CI Lint API的请求,服务器可能会尝试连接到攻击者指定的内部或外部资源。

  1. 识别外部暴露的GitLab实例:攻击者基于GitLab资源模式进行全网扫描,发现外部暴露的实例。
  2. 通过CI Lint API执行SSRF:通过构造恶意API请求,攻击者诱导GitLab服务器向攻击者指定的URL发起请求。
  3. 内部资源访问与扫描:通过观察连接到内部IP地址和端口的成功与否,攻击者可以绘制内部网络地图。
  4. 敏感信息泄露:令牌、密钥或配置数据可能通过云元数据服务或内部服务的响应暴露。
  5. 通过次级漏洞或凭证横向移动:利用泄露的信息,攻击者尝试向仓库、内部API和其他系统横向移动。

通过Criminal IP分析识别的互联网暴露GitLab实例

当组织认为GitLab已打补丁,但测试实例、概念验证实例或部门专用实例仍然存在时,漏洞响应变得最为困难。这些实例一旦持续存在,往往直接暴露在互联网上,成为攻击者最容易得手的目标。因此,本案例的核心问题不仅仅是CVE的存在,而是主动识别有多少GitLab实例以及它们在哪里仍然可以从外部访问。

Criminal IP 搜索查询: title:GitLab

为验证这一点,上述搜索查询应用于Criminal IP资产搜索,截至2026年2月6日,共识别出71,069个资产。当存在外部暴露的GitLab实例时,像CVE-2021–39935这样可以在认证前通过SSRF利用的漏洞会立即将其转变为活跃的攻击面。攻击者很可能通过GitLab登录页面、静态资源和CI相关端点的响应间接推断GitLab版本和配置详情,然后优先将未打补丁的环境作为目标。

Criminal IP 搜索查询: title:"GitLab" AND port:443 OR port:80

在上述识别出的GitLab资产中,我们进一步筛选出GitLab Web界面可通过标准Web端口(HTTP/HTTPS)直接从互联网访问的实例。应用此条件后,共发现311个暴露资产,表明大量GitLab实例仅凭其可公开访问的Web服务即可被立即发现,无论是否需要认证。

对某个具体GitLab实例的进一步分析显示,该实例同时开放了四个端口,并同时存在20多个漏洞。这表明该资产不仅暴露了单个服务,而是将Web界面、远程访问和管理功能组合暴露在互联网上。在多个端口和漏洞共同暴露的环境中,像CVE-2021–39935这样的认证前SSRF漏洞更可能作为初始入口点,而不是孤立的攻击向量。

使用SSRF触发内部请求后,攻击者可以转向同一资产上的其他暴露组件——例如SSH(22)、Web服务(80/443)和其他脆弱元素——逐步扩大攻击范围。

从Criminal IP的观察角度来看,重要的一点是:即使某个GitLab实例未包含在组织的内部资产清单中,一旦它对基于互联网的扫描做出响应,攻击者就会将其视为同样的“外部资产”。测试实例、临时项目部署或被遗弃的GitLab实例因此特别容易受到攻击。

修复措施与安全建议

尽管CVE-2021–39935已被修复,但其被列入CISA KEV目录表明未打补丁、外部暴露的GitLab实例正在被积极利用。因此,响应工作必须超越简单的版本更新,包括重点关注外部暴露的检查。

  • 立即打补丁并验证版本

    • 立即升级到已修复版本(14.3.6 / 14.4.4 / 14.5.2 或更高版本)
    • 审查所有GitLab部署,包括测试实例、备份实例和临时实例
  • CI Lint API及相关API访问控制

    • 重新评估外部用户是否真的需要访问CI Lint API
    • 在网络或配置层面阻止不必要的API端点
  • 基于日志的异常检测

    • 检查针对内部IP地址或异常URL的连接尝试
    • 监控失败连接(超时、拒绝请求)的激增
  • 持续监控暴露资产

    • 使用资产发现工具(如Criminal IP Asset Search)持续识别外部可见的GitLab实例
    • 在新部署或环境变更时建立自动化外部暴露检查

结论

CVE-2021–39935不仅仅是一个旧GitLab漏洞的重现,它清楚地说明了外部暴露的CI/CD基础设施如何轻易转化为真实世界的攻击。CISA将其列入KEV目录表明这不是理论风险:仍然存在于互联网上的未打补丁GitLab实例正被积极攻击。

组织不应将其检查局限于是否使用了易受攻击的版本。它们必须持续识别外部可访问的GitLab实例存在于何处,并在打补丁和配置更改后反复验证暴露是否真正消除。将漏洞情报与外部攻击面可见性相结合的防御策略可以有效保护CI/CD环境免受类似CVE-2021–39935的认证前SSRF漏洞攻击。

与此相关,你可以参考 CVE-2026–24061:GNU Inetutils telnetd 认证绕过漏洞分析。 CSD0tFqvECLokhw9aBeRqqy7pDVE9jtHSghPeFdiPyEcTivNz5b3YtRDN+Pni4VsFBqkCurO2HFmeagTbBxgCptkx4NC3r0SRnUPkqZ4cSnAB4o//t98WU94xpdD748RL/EqMi5URdgf0sChNhdnKJeHgEf7PIZi2hwqgRJR+lncdvu1L/194e35v63OMMd9