問題の中心は、Linuxカーネルの RDS(Reliable Datagram Sockets) にあります。これは主に InfiniBandなどの高性能クラスタ環境や分散システムで利用されるネットワークプロトコルです。
この処理で使われる rds_message_zcopy_from_user() 関数は、送信前にユーザーメモリのページを1枚ずつ「pin(固定)」します。しかし途中で ページフォルトが発生した場合のエラーハンドリングに欠陥があり、既に固定されているページを誤って解放してしまうケースがあります。
その結果、次のような状態が生まれます。
このメモリ管理の破綻が、権限昇格の足がかりになります。
研究者が公開した攻撃チェーンは、複数のカーネル機能を組み合わせて成立します。
攻撃者はRDSの脆弱なコードパスを実行させ、ページピンニング中にページフォルトを誘発します。
次に攻撃者は **io_uring の fixed buffers(固定バッファ)**を利用します。これは高性能非同期I/Oのために、ユーザー空間のメモリをカーネルに登録する仕組みです。
再利用されたページが **ページキャッシュ(ファイルデータのメモリキャッシュ)**に対応している場合、攻撃者は次のことが可能になります。
公開された攻撃では、この能力を使って SUID-root実行ファイルのキャッシュ内容を書き換えます。
SUIDファイルは通常、実行時に 所有者(root)の権限で動作します。ページキャッシュの内容が改変された状態でその実行ファイルが読み込まれると、
理論的には多くのLinux環境で成立し得ますが、実際の影響度は設定によって大きく変わります。
理由としては以下が挙げられます。
どのディストリビューションでも、以下の条件が揃えば理論上影響を受けます。
ただし実際の影響は カーネル設定やモジュール構成次第のため、環境ごとに確認が必要です。
PinTheftが成立するには複数の条件が必要です。
これらが揃わない場合、攻撃は成立しないか、難易度が大きく上がります。
カーネル更新後は 再起動しないと修正は適用されません。
RDSを使用していない環境では、モジュールを無効化することで攻撃面を減らせます。
例:
rds モジュールをブラックリスト化PinTheftは ローカル実行が前提のため、特に以下の環境では優先的な対策が必要です。
PinTheftは、近年のLinuxカーネル攻撃の特徴をよく示しています。
今回の場合は
そのため、基本的な防御としては
といった運用が、依然として最も効果的な対策とされています。
Comments
0 comments