
LXD による Linux の権限昇格
Linux システム上でローカルの lxd グループに属しているユーザーは、root への権限を昇格する経路を数多く持ちます。このリポジトリには、完全に自動化されたローカル root エクスプロイトの例が含まれています。脆弱性の詳細な説明とエクスプロイトのウォークスルーは、私のブログ こちら にあります。
以下のエクスプロイトはコンテナからの脱出 (container break-out) ではなく、コンテナを利用してホスト OS を標的とするローカル root エクスプロイトです。エクスプロイトを成功させるには、ホスト環境への低権限アクセスが必要です。
私は、このエクスプロイトのバージョン 2 で用いた戦略は独自のものであり、(少なくとも私にとっては) 上記のブログに詳細な説明を書く価値があるほど興味深いと考えています。
lxd_rootv1.sh は、ホストの / ファイルシステムをコンテナ内にマウントし、ホストの低権限ユーザーがその中で root アクセスを持てるようにします。この root アクセスはホスト側にもマッピングされるため、現在のユーザーを /etc/sudoers ファイルに追加できます。これは私より前に他の人々によっても悪用されてきました。lxd_rootv2.py は、ホストの systemd プライベート UNIX ソケットをコンテナ内にマウントし、その後 LXD プロキシデバイスを介して再びホスト側にマウントし直します。これらのプロキシデバイスは root 権限を持ち、ソケット通信中に、開始した低権限ユーザーの資格情報ではなく、デバイス自身の資格情報を渡します。これは悪用され、現在のユーザーを /etc/sudoers ファイルに追加する一時的な systemd サービスを作成します。どちらのエクスプロイトもコンテナが必要なので、最初にコンテナを作成してください。その後、ホスト OS から、コンテナ名を最初の引数としてエクスプロイトを実行します。
# Exploit with v1
$ bash lxd_rootv1.sh <container name>
# Exploit with v2
$ python3 lxd_rootv2.py <container name>

私がこれらの問題に気付くまで、公式の LXD ドキュメントには、lxd グループが危険であることをユーザーに警告する記述は一切ありませんでした。公式のガイドラインに従って LXD を構成した人は誰でも、最初のコンテナをデプロイする前に自分のアカウントをこのグループに追加していたことでしょう。私は懸念を表明するために Canonical にバグを報告しました。完全なスレッドは こちら で読めます。LXD チームはすぐにドキュメントを修正し、このグループは root アクセスを信頼できる人にのみ付与すべきであると明確に記載されるようになりました。
いつものように、Canonical の方々とバグトラッカーを通じてやり取りするのは本当に素晴らしい経験でした。彼らが時間を割き、私のアイデアを深く考慮してくれたことに感謝したいと思います。他のセキュリティ研究者にも、この方法で直接彼らに問題を持ち込むことを強くお勧めします。
私は LXD を悪用した最初の人物ではありません。これは 2016 年にまで遡る複数の GitHub チケットで懸念事項として提起されています。
私が知る限り、最初のリンクの人物 (simpoir) がこのリスクを最初に特定しました。
@reboare は、私よりずっと前に、私の v1 エクスプロイトと同じ方法で LXD を悪用することについて素晴らしいブログを書きました。
LXD の開発者の皆さん、とてもクールなツールを作ってくれてありがとうございます。私自身も LXD を使っており、とても気に入っています。これは LXD の使用を妨げる決定的な問題ではないと思います。lxd グループにユーザーを追加する際の潜在的なリスクを理解することが非常に重要だと思います。
これらの脆弱性には、公式の修正プログラムはありません。LXD を使用する人は誰でも、lxd グループにユーザーを追加することは、実質的にそのユーザーを root にすることだと認識すべきです。
デスクトップなどのシングルユーザーホストで LXD を使用している場合は、lxd グループをまったく使用せず、API と通信する必要があるときに sudo を実行するのが最善かもしれません。
複数の人がコンテナを操作する共有環境では、入れ子になった環境を作成するのが最善かもしれません。LXD グループの各ユーザーは自分の環境を悪用できますが、他の環境を悪用するには、そのコンテナから脱出するためにより多くの労力が必要になります。