Linux kernel 启用PTI时的用户空间CR3值

Linux kernel 启用PTI时的用户空间CR3值,linux-kernel,x86,cpu-registers,Linux Kernel,X86,Cpu Registers,在内核模式下执行时,当启用页表隔离(PTI)时,是否有办法获取用户空间CR3值?在当前Linux中,请参阅asm。宏切换到用户CR3\u NOSTACK和其他内容,以查看Linux如何在内核与用户CR3之间切换。以及之前对其使用的常量的评论: /* * PAGE_TABLE_ISOLATION PGDs are 8k. Flip bit 12 to switch between the two * halves: */ #define PTI_USER_PGTABLE_BIT

在内核模式下执行时,当启用页表隔离(PTI)时,是否有办法获取用户空间CR3值?

在当前Linux中,请参阅asm
。宏切换到用户CR3\u NOSTACK
和其他内容,以查看Linux如何在内核与用户CR3之间切换。以及之前对其使用的常量的评论:

/*
 * PAGE_TABLE_ISOLATION PGDs are 8k.  Flip bit 12 to switch between the two
 * halves:
 */
#define PTI_USER_PGTABLE_BIT        PAGE_SHIFT
#define PTI_USER_PGTABLE_MASK       (1 << PTI_USER_PGTABLE_BIT)
#define PTI_USER_PCID_BIT       X86_CR3_PTI_PCID_USER_BIT
#define PTI_USER_PCID_MASK      (1 << PTI_USER_PCID_BIT)
#define PTI_USER_PGTABLE_AND_PCID_MASK  (PTI_USER_PCID_MASK | PTI_USER_PGTABLE_MASK)
这些宏用于返回用户空间的路径中的
entry\u 64.S
entry\u 64\u compat.S
entry\u 32.S

.macro SWITCH_TO_USER_CR3_NOSTACK scratch_reg:req scratch_reg2:req
...
    mov %cr3, \scratch_reg
...
.Lwrcr3_\@:
    /* Flip the PGD to the user version */
    orq     $(PTI_USER_PGTABLE_MASK), \scratch_reg
    mov \scratch_reg, %cr3

大概有一种更干净的方法可以从C访问用户空间页表。

最好的办法可能是查看页面错误处理程序,以了解它如何访问进程的页面表。(或
mmap
MAP\u POPULATE
)的实现。

在当前Linux中,请参阅asm
。宏切换到用户CR3\u NOSTACK
和其他内容,以了解Linux如何在内核和用户CR3之间切换。以及之前对其使用的常量的评论:

/*
 * PAGE_TABLE_ISOLATION PGDs are 8k.  Flip bit 12 to switch between the two
 * halves:
 */
#define PTI_USER_PGTABLE_BIT        PAGE_SHIFT
#define PTI_USER_PGTABLE_MASK       (1 << PTI_USER_PGTABLE_BIT)
#define PTI_USER_PCID_BIT       X86_CR3_PTI_PCID_USER_BIT
#define PTI_USER_PCID_MASK      (1 << PTI_USER_PCID_BIT)
#define PTI_USER_PGTABLE_AND_PCID_MASK  (PTI_USER_PCID_MASK | PTI_USER_PGTABLE_MASK)
这些宏用于返回用户空间的路径中的
entry\u 64.S
entry\u 64\u compat.S
entry\u 32.S

.macro SWITCH_TO_USER_CR3_NOSTACK scratch_reg:req scratch_reg2:req
...
    mov %cr3, \scratch_reg
...
.Lwrcr3_\@:
    /* Flip the PGD to the user version */
    orq     $(PTI_USER_PGTABLE_MASK), \scratch_reg
    mov \scratch_reg, %cr3

大概有一种更干净的方法可以从C访问用户空间页表。


最好的办法可能是查看页面错误处理程序,以了解它如何访问进程的页面表。(或
mmap
实现的
MAP\u POPULATE
)。

对于任何不知道的人来说,是Linux内核的一项功能,可以减轻该漏洞。当然,内核已经保存了用户空间CR3值,以便在恢复进程时可以重新加载该值。您是否怀疑是否有API可用于获取此值?对于任何不知道的人来说,Linux内核的一项功能可以缓解此漏洞。当然,内核已保存了用户空间CR3值,以便在恢复进程时可以重新加载该值。是否有API可用于获取此值?