引用自https://www.kernel.org/doc/Documentation/process/adding-syscalls.rst:
至少在 64 位 x86 上,从 v4.17 开始,不调用内核中的系统调用函数将成为硬性要求。它对系统调用使用不同的调用约定,
struct pt_regs
在系统调用包装器中即时解码,然后将处理交给实际的系统调用函数。这意味着在系统调用入口期间仅传递特定系统调用实际需要的参数,而不是始终用随机用户空间内容填充六个 CPU 寄存器(这可能会导致调用链出现严重问题)。
最后一个带括号的子句指的是调用链中的什么严重问题?
对我来说,不将六个寄存器加载到系统调用的通用引导中似乎很愚蠢。强制每个系统调用包装器这样做会使它们变得更大,并且系统调用函数成为一种新的特殊情况,所以我想知道在未使用的参数寄存器中存在无意的用户内容的“严重问题”是什么。
问题之一并不是任意寄存器值,而是它们被复制到内核堆栈。因此,未使用的寄存器可用于将任意调用者控制的值写入堆栈,而无需检查。
堆栈上的这些值可能会用于更复杂的攻击。这就是为什么消除这种可能性似乎是个好主意。
Kees Cook 的 4.17 摘要还提到了这些寄存器值对推测执行的可能影响。