CVE-2017-1000367
리눅스용 Sudo의 get_process_ttyname()에서 취약점을 발견했습니다. 이 함수는 "/proc/[pid]/stat" (man proc)을 열고 필드 7(tty_nr)에서 tty의 장치 번호를 읽습니다. 안타깝게도 이러한 필드는 공백으로 구분되며 필드 2(comm, 명령어의 파일 이름)에는 공백이 포함될 수 있습니다(CVE-2017-1000367).
예를 들어, 심볼릭 링크 "./ 1 "을 통해 Sudo를 실행하면 get_process_ttyname()이 sudo_ttyname_dev()를 호출하여 내장 search_devs[]에 존재하지 않는 tty 장치 번호 "1"을 검색합니다.
다음으로, sudo_ttyname_dev()는 sudo_ttyname_scan() 함수를 호출하여 "/dev"의 너비 우선 탐색 과정에서 존재하지 않는 이 tty 장치 번호 "1"을 검색합니다.
마지막으로, 우리는 이 함수가 전역 쓰기 가능 디렉토리인 "/dev/shm"을 탐색하는 동안 이 취약점을 악용합니다. 이 취약점을 통해 로컬 사용자는 자신의 tty가 파일시스템 상의 임의의 문자 장치인 것처럼 가장할 수 있으며, 두 번의 경쟁 조건(race condition) 후에는 자신의 tty가 파일시스템 상의 임의의 파일인 것처럼 가장할 수 있습니다.
SELinux가 활성화된 시스템에서, 사용자가 전체 루트 권한을 부여하지 않는 명령어에 대해 Sudoer인 경우, relabel_tty() (src/selinux.c에 있음)가 자신의 tty에 대해 open(O_RDWR|O_NONBLOCK)을 호출하고 dup2()를 통해 명령어의 stdin, stdout, stderr에 연결하기 때문에, 사용자는 명령어의 출력으로 파일시스템 상의 모든 파일(루트 소유 파일 포함)을 덮어쓸 수 있습니다. 이로 인해 모든 Sudoer 사용자가 전체 루트 권한을 얻을 수 있습니다.
Red Hat Enterprise Linux 6 (sudo) | ✅ |
Red Hat Enterprise Linux 7 (sudo) | ✅ |
Red Hat Enterprise Linux Server (v. 5 ELS) (sudo) | ✅ |
Oracle Enterprise Linux 6 | ✅ |
Oracle Enterprise Linux 7 | ✅ |
Oracle Enterprise Linux Server 5 | ✅ |
CentOS Linux 6 (sudo) | ✅ |
CentOS Linux 7 (sudo) | ✅ |
Debian wheezy | ✅ |
Debian jessie | ✅ |
Debian stretch | ✅ |
Debian sid | ✅ |
Ubuntu 17.04 | ✅ |
Ubuntu 16.10 | ✅ |
Ubuntu 16.04 LTS | ✅ |
Ubuntu 14.04 LTS | ✅ |
SUSE Linux Enterprise Software Development Kit 12-SP2 | ✅ |
SUSE Linux Enterprise Server for Raspberry Pi 12-SP2 | ✅ |
SUSE Linux Enterprise Server 12-SP2 | ✅ |
SUSE Linux Enterprise Desktop 12-SP2 | ✅ |
OpenSuse, Slackware, and Gentoo Linux | ✅ |
CentOS/RHEL/Scientific/Oracle Linux 서버에서 sudo 패치 방법 ✅ |
Terminal:> sudo yum update
Fedora Linux 서버에서 sudo 패치 방법
Terminal:> sudo dnf update
Suse/OpenSUSE Linux 서버에서 sudo 패치 방법 ✅ |
Terminal:> sudo zypper update
Arch Linux 서버에서 sudo 패치 방법 ✅ |
Terminal:> sudo pacman -Syu
Alpine Linux 서버에서 sudo 패치 방법 ✅ |
Terminal:> apk update && apk upgrade
Slackware Linux 서버에서 sudo 패치 방법 ✅ |
upgradepkg sudo-1.8.20p1-i586-1_slack14.2.txz
Gentoo Linux 서버에서 sudo 패치 방법 ✅ |
Terminal:> emerge --sync
Terminal:> emerge --ask --oneshot --verbose ">=app-admin/sudo-1.8.20_p1"