カーネルシンボルのアドレスが影響を受けますか?結果?

カーネルシンボルのアドレスが影響を受けますか?結果?

簡単に言うと:私のディストリビューションのLinux 3.08カーネルでは、cat /proc/kallsymsたとえば_commit_creds関数/シンボルがアドレス0xc1073fe0にあることがわかります。いつ:

  • マイカーネルビルド(オプション1)
  • カーネルバイナリ調整(オプション2)

うん可能この住所に影響しますか? (つまり、カーネルに対する攻撃を軽減するためのランダム化?)

カーネル提供のABIを中断しないように、カーネル提供のシステムコールを予測可能/既知のアドレスに維持する必要があると仮定する方が正確ですか?

長いバージョン

一部CVE-2016-0728特定のLinuxカーネルの脆弱性を提供概念の証拠次の2行のソースコードを使用してください。

#define COMMIT_CREDS_ADDR (0xffffffff81094250)
#define PREPARE_KERNEL_CREDS_ADDR (0xffffffff81094550)

それぞれの役割を果たしていてもuse-after-free オーバーフロー型の問題が発生した後にのみそれにもかかわらず、権限の上昇を完了することは依然として重要です。もちろん、アドレスはすべてのコアで同じではなく、デフォルトではすべてのリリースで変更されます。それにもかかわらず、カーネルライン内では一定のようです(例:Ubuntu 12.04 x86のアドレスは常に0xc1073fe0です)。

私の質問は、これらのアドレスに影響を与え、順序を混ぜたりランダム化してカーネルの活用をより困難にすることができるかどうかを理解することです(つまり、攻撃者はカーネルリング0にコマンドポインタを付けるとやや目が遠くなります)。システムコールのABIを持つためにsys_xxxxxxxxxxシンボルの位置を変更できないとします。しかし、少なくともカーネルシンボルの内部については、シンボルを予測可能にする必要があるという必要性は必ずしも理解していません。

したがって、私はここでこれらのカーネルシンボルをランダムに指定する方法を尋ねています。

  • (1) カスタムカーネルをコンパイルするか、
  • (2)カーネルを調整し、シンボルを移動することをお勧めします(おそらくこれはより難しく壊れやすいものだと思います)。

カーネルシンボルのアドレスを変更するとどのような結果が発生しますか? (システムコールABIを除く)

ベストアンサー1

すべてのUbuntu 12.04 x86のアドレスが同じ場合は、すべて同じLinuxバージョンが付属しているためです。最適化が有効になっている最新バージョンのGCCを使用して独自のカーネルをコンパイルすると、各ビルドのアドレスはランダムに割り当てられます。

実際、最近のカーネルではこれは必要ありません。 ~から今回提出してください(2014年1月)x86アーキテクチャのカーネルアドレス空間は、「カーネルアドレス空間レイアウトのランダム化」というメカニズムを介して起動するたびに変更されます。http://lwn.net/Articles/569635/

したがって、ディストリビューションをアップグレードしたりカーネルを再コンパイルしたりすると、任意のアドレスが必要です。

その結果、コンパイラまたはカーネルローダプロセスにタスクを実行させると、ほとんど問題は発生しません。コンパイル後にビルドを調整しようとすると、ビルドを開始できないか、さらに悪いことにランダムにクラッシュする可能性が最も高くなります。コンパイラ出力の後処理のもう1つの実際的な結果は、コンパイル中にカーネルに署名できないことです(たとえば、信頼できるブートに必要です)。

おすすめ記事