CVE-2017-1000367
我々は、Linux向け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があたかもファイルシステム上の任意のキャラクタデバイスであるかのように見せかけることができ、さらに2回のレースコンディションを経て、自分のttyがあたかもファイルシステム上の任意のファイルであるかのように見せかけることができます。
SELinuxが有効なシステムでは、ユーザーが完全なroot権限を付与しないコマンドに対してSudoerである場合、そのコマンドの出力でファイルシステム上の任意のファイル(root所有のファイルを含む)を上書きできます。これは、relabel_tty()(src/selinux.c内)がそのttyに対してopen(O_RDWR|O_NONBLOCK)を呼び出し、それをコマンドの標準入力・標準出力・標準エラー出力にdup2()するためです。これにより、任意のSudoerユーザーが完全なroot権限を取得できます。
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をパッチするには? ✅ |
ターミナル:> sudo yum update
Fedora Linuxサーバーでsudoをパッチするには?
ターミナル:> sudo dnf update
Suse/OpenSUSE Linuxサーバーでsudoをパッチするには? ✅ |
ターミナル:> sudo zypper update
Arch Linuxサーバーでsudoをパッチするには? ✅ |
ターミナル:> sudo pacman -Syu
Alpine Linuxサーバーでsudoをパッチするには? ✅ |
ターミナル:> apk update && apk upgrade
Slackware Linuxサーバーでsudoをパッチするには? ✅ |
upgradepkg sudo-1.8.20p1-i586-1_slack14.2.txz
Gentoo Linuxサーバーでsudoをパッチするには? ✅ |
ターミナル:> emerge --sync
ターミナル:> emerge --ask --oneshot --verbose ">=app-admin/sudo-1.8.20_p1"