Linux kernel 启用PTI时的用户空间CR3值
在内核模式下执行时,当启用页表隔离(PTI)时,是否有办法获取用户空间CR3值?在当前Linux中,请参阅asmLinux 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
。宏切换到用户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可用于获取此值?