新しいLinuxでシステムコールの呼び出し規則が変更されたのはなぜですか?

新しいLinuxでシステムコールの呼び出し規則が変更されたのはなぜですか?

から引用https://www.kernel.org/doc/Documentation/process/adding-syscalls.rst:

少なくとも64ビットx86では、v4.17からカーネルからシステムコールを呼び出さないことが困難な要件になります。システム呼び出しに別の呼び出し規則を使用し、システムstruct pt_regs 呼び出しラッパーから直ちにデコードしてから、処理を実際のシステム呼び出し関数に渡します。これは、6つのCPUレジスタを常に任意のユーザー空間コンテンツで埋めるのではなく(呼び出しチェーンに深刻な問題を引き起こす可能性があります)、特定のシステムコールに実際に必要なパラメータだけがシステムコール入力中に渡されることを意味します。

コールチェーンに深刻な問題があります最後の角括弧句は何を参照していますか?

システムコールの通常のブートに6つのレジスタをロードしないことは私にとって愚かなことです。すべてのsyscallラッパーを強制的にこれを行うと、syscall関数が大きくなり、syscall関数が新しい特殊ケースになるため、未使用の引数レジスタ「何ですか?」で意図しないユーザーコンテンツの「重大な問題」について疑問に思います。

ベストアンサー1

問題の1つはランダムではありません。登録する値ですが、カーネルスタックにコピーされます。したがって、未使用のレジスタを使用して、チェックなしで任意の呼び出し側制御値をスタックに書き込むことができます。

スタック内のこれらの値は、より洗練された攻撃に使用できます。だからこそ、この可能性を取り除くのが良い考えのようです。

Kees Cook の 4.17 まとめこれらのレジスタ値が推測実行に与える可能性がある影響も言及されています。

おすすめ記事