Linux exFAT ドライバーの脆弱性を検出しました 

脆弱性

これらの欠陥が悪用されると、攻撃者は機密情報に不正にアクセスしたり、一般的に問題を引き起こしたりする可能性があります

数日前、ニュースはそれを壊しました 脆弱性が検出されました (すでにCVE-2023-4273にリストされています) exFAT ファイル システムのドライバー内 Linux カーネルで提供されます。

問題特別に設計されたパーティションをマウントするときにコントローラーが許可するという事実にあります。 (悪意のある USB フラッシュを接続するなど)、スタック オーバーフローが発生し、カーネル権限でコードを実行します。

問題は、コードでは、ファイル名入力が常に 255 文字に適合する連結されたファイル名を生成すると想定していることです (制限は 258 文字で、ヌル バイト用の 1 文字と変換用の 2 文字が含まれます)。 一連のディレクトリ エントリに 255 文字を超えるファイル名を格納することはファイル システム形式違反ですが、Linux ドライバでは受け入れられますが、スタック オーバーフローも発生します (ファイル名はスタックによって割り当てられた変数に連結されるため)。

脆弱性に関しては、これと、サイズチェックの失敗により悪用されました ファイルシステムの制限である 255 文字を超える非常に長いファイル名が指定された場合、スタックに割り当てられたバッファにファイル名をコピーすると、カーネル スタック オーバーフローが発生します。

exfat_extract_uni_name() 関数は、NULL 文字 (0x0000) が検出されると宛先バッファへの文字のコピーを停止し、コピーされた文字数を返します。 しかし、呼び出し元は戻り値を無視し、次の反復のためにポインタを 15 文字 (30 バイト) 進めます。 したがって、14 回の反復で 28 文字または XNUMX バイトをスキップする (そのまま残す) ことが可能です。 

脆弱性 長い名前の再構築を実行する関数に存在します ディレクトリインデックスからファイル名部分を含むレコードを周期的に読み取り、結果の名前部分を最終的な長い名前にマージします。

その関数のコード内のサイズ チェックは、名前部分を含む各エントリに対して相対的に実行されましたが、最終的な名前はカバーされませんでした (たとえば、名前が 100 の部分に分割され、バッファー内で 1500 文字ではなく 258 文字に達する可能性があります) )。

捜査官 脆弱性を発見したのは誰ですか プロトタイプエクスプロイトを準備できました これにより、システムに対する権限を増やすことができます。 VirtualBox 仮想マシンでテストすると、このエクスプロイトは 100% の確率で機能しますが、ハードウェア上で実行される通常の環境で実行すると、エクスプロイトがトリガーされる可能性は約 50% に低下します。

特に、私のエクスプロイトは、スタックに割り当てられたヌル終了文字列へのポインタを上書きするため、この文字列に終端ヌル文字を追加する次の試みは、実際には「攻撃者が選択したメモリの場所にヌルバイトを書き込む」というプリミティブになります。

また、 この脆弱性を利用して、UEFI セキュア ブート モードで起動されたカーネルが侵害される可能性があります。というのは、実際のオペレーティング システムよりも前に起動する、脆弱なカーネルを含むイメージと、対応する init スクリプト (もちろんエクスプロイト) がブート可能ドライブに配置されると述べているからです。 起動すると、このイメージは悪意のある (署名されていない) カーネル モジュールをロードし、カーネル モードの制御を確立し、実際のオペレーティング システムに切り替えます (たとえば、kexec 呼び出しを使用します)。

最後に、この問題は現在もサポートされている Linux のバージョンで修正されていることに言及する価値があります。 脆弱性が公開された時点で、最新の Linux カーネル バージョンは Linux バージョン 6.4.10 でしたが、新しいバージョン 6.5 にはすでに修正が含まれています。

さまざまなディストリビューションでのソリューションの追跡に興味がある場合は、次のページから追跡できます。 DebianのUbuntu, RHELSUSE Fedora。

もしあなたが それについてもっと知りたい、 あなたはで詳細を確認することができます 次のリンク。