
needrestartは、Linuxシステム(多くのUbuntuバージョンでデフォルト)で広く使われているユーティリティで、ソフトウェア更新後にサービスやシステム自体を再起動する必要があるかどうかをチェックします。実行中のプロセスを分析することで、それらが更新されたライブラリを使用しているかどうか、あるいは変更を反映するために再起動が必要かどうかを判定します。
needrestartがPythonインタープリタを実行しているプロセスを検出すると、/proc/[pid]/environからそのプロセスに関連付けられた環境変数PYTHONPATHを読み取り、分析用の独自のPythonインタープリタを起動する前にその値を設定します。
元のプロセスがローカルの攻撃者に属する場合、攻撃者はPYTHONPATHを操作して悪意のあるライブラリを指し示すようにできます。
その結果、needrestartがルート権限でPythonインタープリタを実行する際に、操作されたPYTHONPATHを使って実行するため、最終的に攻撃者のコードを実行することになり、ルートへの権限昇格が発生します。
この脆弱性は、needrestartのバージョン3.8より前のものにのみ影響します。バージョン3.8以降には、Pythonインタープリタを起動する前にPYTHONPATHなどの環境変数を適切にサニタイズする修正が含まれており、悪意のある環境操作による権限昇格を防ぎます。
リポジトリをクローンします。
runner.sh内の、コンパイル済みバイナリを取得するために使用されるIPを、自分のマシンを指すように変更します。
攻撃者のマシンで、実行権限を付与してbinary.shを実行します。
HTTPサーバーをセットアップします:
$ python3 -m http.server
