{{ noticeDetails.title}}

时间:{{ noticeDetails.createdTime}}

GitLab任意用户密码重置漏洞

时间:2024-01-17 18:01:51

安全通告

 

 

 

电科网安预警GitLab任意用户密码重置漏洞”,漏洞等级中危,建议及时采取修复或缓解措施以避免受到损失。

 

漏洞名称:GitLab任意用户密码重置漏洞

漏洞编号:CVE-2023-7028

漏洞等级:中危

漏洞概要:

GitLab是由GitLab Inc.基于ruby on Rails开发的Web开源Git存储库管理工具。GitLab提供了许多功能,包括代码管理、问题跟踪、持续集成、持续交付、自动化测试、代码审查、Wiki等。它还支持许多第三方工具集成,如JIRASlackKubernetes等,被广泛用作代码仓库和DevOps平台,可在自托管服务器或云上运行,有社区版CE和企业版EE两种发行版本。

近期Gitlab官方披露修复了一个任意用户密码重置漏洞,官方给出的CVSS3.0基础评分为10分。从GitLab CE/EE 16.1.0开始支持用户通过电子邮件地址重置密码,但是由于电子邮件验证过程不够严格,导致攻击者可将重置帐户密码的邮件发送到未经验证的邮箱,在无需用户交互的情况下通过密码重置进行GitLab帐户接管。

经跟踪研判,漏洞详情及POC已公开,暂未监测到在野利用。攻防实验室已复现该漏洞。鉴于影响版本和利用条件限制,依据GB/T 30279-2020 网络安全漏洞分类分级指南,技术等级为超危,综合评定等级为中危。



利用条件:

1 满足漏洞版本

2 未开启两步验证

3 GitLab配置了SMTP,并启用邮箱登录

4 已知一个GitLab中已经存在的邮箱账号

 

影响范围:

16.1 GitLab CE/EE <= 16.1.5

16.2 GitLab CE/EE <= 16.2.8

16.3 GitLab CE/EE <= 16.3.6

16.4 GitLab CE/EE <= 16.4.4

16.5 GitLab CE/EE <= 16.5.5

16.6 GitLab CE/EE <= 16.6.3

16.7 GitLab CE/EE <= 16.7.1

 

安全版本:

16.1 GitLab CE/EE >= 16.1.6

16.2 GitLab CE/EE >= 16.2.9

16.3 GitLab CE/EE >= 16.3.7

16.4 GitLab CE/EE >= 16.4.5

16.5 GitLab CE/EE >= 16.5.6

16.6 GitLab CE/EE >= 16.6.4

16.7 GitLab CE/EE >= 16.7.2

 

修复方案:

Ø 联网的版本会收到推送更新提示,升级到安全版本即可


 


缓解措施:

Ø 不要将Gitlab映射到公网并限源可信IP

Ø 按照官方手册开启两步验证

https://docs.gitlab.com/ee/security/two_factor_authentication.html

 

漏洞排查:

Ø 登录gitlab后台查看版本,与漏洞影响版本对比,这个最准确


 

Ø 或未授权访问/assets/webpack/manifest.json获取版本hash

比较hash在不在附录列表漏洞版本范围内。

这种方法有局限性,官方没有给出16.2.816.5.516.6.316.7.1这四个漏洞版本的hash值。


 

Ø 如果确定被该漏洞攻击成功过,为避免已经泄露的凭据被继续利用,需要更新GitLab中存储的所有凭证。包括但不限于GitLab账户密码、API Token或其他secret key


漏洞源码分析:

以漏洞版本16.1.0源码为例,发现漏洞的产生的根本原因在于RecoverableByAnyEmail模块中的send_reset_password_instructions方法,该方法没有考虑email是数组的情况。这个疏忽导致攻击者输入多个电子邮件地址,从而导致重置密码邮件发送到未经验证的邮箱。在使用attributes.delete(:email)从请求参数中提取邮件地址时,通常这个方法期望接收一个字符串形式的单个电子邮件地址,但是,当攻击者发送带有电子邮件地址数组的user[email][]时,rails将其解释为数组,而不是单个字符串。归根结底,Payload就是利用这种rails解析查询参数的行为,在HTTP请求中构造user[email]数组,使得后端的email变量包含两个邮件地址,从而泄露受害者的密码重置链接。


 


修复代码分析:

修复代码确保了只有已确认的电子邮件地址时才能接收密码重置指令,从而避免了处理数组形式的电子邮件地址。这意味着即使攻击者发送一个包含多个地址的数组,也只有在数组中的第一个地址被确认时,才会发送密码重置指令。

修改后的 send_reset_password_instructions 方法执行逻辑:检查 attributes[:email] 是否存在。如果不存在,则调用 super,即 Devise 的原始 send_reset_password_instructions 方法,即不做处理;如果存在,补丁使用 Email.confirmed.find_by(email: attributes[:email].to_s) 来查找是否存在一个已确认的电子邮件地址。这是一种更安全的做法,因为它确保只有验证过的电子邮件地址才会接收密码重置指令;

如果找到已确认的电子邮件,则 recoverable 变量设置为该电子邮件对应的用户,并调用 recoverable.send_reset_password_instructions 来发送密码重置指令。


 

 


附录:

Ø GitLab官方安全通告

https://about.gitlab.com/releases/2024/01/11/critical-security-release-gitlab-16-7-2-released/#account-takeover-via-password-reset-without-user-interactions

Ø GitLab官方安全版本仓库

https://gitlab.com/gitlab-org/gitlab/-/releases

Ø 漏洞版本Hash列表

不含16.2.816.5.516.6.316.7.1这四个漏洞版本的hash

hash

build

versions

6c992294202e8812bc52

gitlab-ce

16.1.0

c62bcf23cf7d1cfa6c45

gitlab-ee

16.1.0

6c992294202e8812bc52

gitlab-ce

16.1.1

c62bcf23cf7d1cfa6c45

gitlab-ee

16.1.1

3962f5166431cdddda90

gitlab-ee

16.1.2

e4ead4df2e713643c893

gitlab-ce

16.1.2

c6ad499ae7cc3c38190b

gitlab-ee

16.1.3

eadcbf2919fe46c5c366

gitlab-ce

16.1.3

c6ad499ae7cc3c38190b

gitlab-ee

16.1.4

eadcbf2919fe46c5c366

gitlab-ce

16.1.4

23577c7b705d3f72a819

gitlab-ee

16.1.5

eadcbf2919fe46c5c366

gitlab-ce

16.1.5

301fd41cd825d01419c0

gitlab-ce

16.2.0

d80ea0921fc4647c37d5

gitlab-ee

16.2.0

301fd41cd825d01419c0

gitlab-ce

16.2.1

d80ea0921fc4647c37d5

gitlab-ee

16.2.1

59031a7a8e28687120e6

gitlab-ce

16.2.2

7cf47e1a8dc722a1e270

gitlab-ee

16.2.2

59031a7a8e28687120e6

gitlab-ce

16.2.3

7cf47e1a8dc722a1e270

gitlab-ee

16.2.3

988287abcbfe29f4690d

gitlab-ce

16.2.4

f20634e6f3a32aa81553

gitlab-ee

16.2.4

988287abcbfe29f4690d

gitlab-ce

16.2.5

c1e8cc9146a5b49ae6ca

gitlab-ee

16.2.5

988287abcbfe29f4690d

gitlab-ce

16.2.6

c1e8cc9146a5b49ae6ca

gitlab-ee

16.2.6

988287abcbfe29f4690d

gitlab-ce

16.2.7

c1e8cc9146a5b49ae6ca

gitlab-ee

16.2.7

d746d88bb9ede848261f

gitlab-ee

16.3.0

dbad758d0c7d30d411dd

gitlab-ce

16.3.0

11b88aab181b29c7b0d1

gitlab-ee

16.3.1

dbad758d0c7d30d411dd

gitlab-ce

16.3.1

1dd09d6aff2db34253b1

gitlab-ce

16.3.2

3fb80358e4b1f601bdd6

gitlab-ee

16.3.2

1dd09d6aff2db34253b1

gitlab-ce

16.3.3

3fb80358e4b1f601bdd6

gitlab-ee

16.3.3

1dd09d6aff2db34253b1

gitlab-ce

16.3.4

3fb80358e4b1f601bdd6

gitlab-ee

16.3.4

353bb2a671d60ff067f0

gitlab-ce

16.3.6

a715332cac135bd6e5b8

gitlab-ee

16.3.6

2e00da94356e26000ff9

gitlab-ce

16.4.0

752d484ecde1a403c684

gitlab-ee

16.4.0

13cbc595225baa1bcfaa

gitlab-ce

16.4.2

e8f4b602c8a5c2c7e350

gitlab-ee

16.4.2

62d9eff3f41bcbc04888

gitlab-ee

16.4.3

ac1d75be33e7a0c2b306

gitlab-ce

16.4.3

6bfb6b0e94b359917ce5

gitlab-ee

16.4.4

73c3a83fd9ca763224cc

gitlab-ce

16.4.4

965087ffd297abc6dae0

gitlab-ce

16.5.0

9fc6dd844e33896766f4

gitlab-ee

16.5.0

7f838e45458eca02ab0e

gitlab-ce

16.5.1

86cfa99a06cad34ce6b9

gitlab-ee

16.5.1

1202cc0addb5a294e0c0

gitlab-ee

16.5.2

90e0918f5d98def29618

gitlab-ce

16.5.2

1460a7f5743fd5e3afa4

gitlab-ce

16.5.3

d497c50da9606bdcb307

gitlab-ee

16.5.3

87e334243b2e1e5bdf59

gitlab-ee

16.5.4

de082d27a1b3b4f593ce

gitlab-ce

16.5.4

a701ffe6423013037b27

gitlab-ce

16.6.0

eb5f16054b22b4c67017

gitlab-ee

16.6.0

271060525cb3d6d2fd01

gitlab-ce

16.6.1

8d79dee5b359bf6d2446

gitlab-ee

16.6.1

6caac3a982ac1e25d9f8

gitlab-ee

16.6.2

eab738f0bc7d2908aa63

gitlab-ce

16.6.2

5934820ad508b210bda8

gitlab-ee

16.7.0

d3a97a05fd02b5c8f637

gitlab-ce

16.7.0