gpt4 book ai didi

linux - 在现代 Linux x86-64 中,用户空间覆盖 GS 寄存器是否安全?

转载 作者:行者123 更新时间:2023-12-03 09:58:43 25 4
gpt4 key购买 nike

在 64 位 C 程序中,使用 glibc、pthreads 等(没有什么奇怪的),在当前内核和 glibc 版本上覆盖 GS 寄存器而不恢复它是否安全?我知道 FS 寄存器被 pthreads/glibc 用于线程本地存储 block 指针,所以弄乱它会破坏任何使用 TLS 的东西,但我不确定 GS

如果不是,保存该值、覆盖它然后恢复该值是安全的,只要覆盖时用户空间代码不执行 X(什么是 X)?

最佳答案

我不确定; Jester 说“是的,但您可能需要 arch_prctl(ARCH_SET_GS, foo);

或者在带有 FSGSBASE 的 CPU 上,可能是 wrgsbase来自用户空间,如果内核(例如 Linux 5.9 或更新版本)允许用户空间使用。 (CR4.FSGSBASE[位 16] 必须设置,否则会因 #UD 而出错)。

我知道 x86-64 切换到使用 FS 进行 TLS(32 位使用 GS),因为 syscall 入口点如何使用 swapgs 查找内核堆栈.

我认为这只是为了内核 TLS/per-core 东西的用户和内核之间的一致性,因为 64 位内核下的 32 位进程仍然使用 GS 来实现 TLS。除非 32 位进程不能使用 syscall(AMD CPU 除外)。仅凭这一点并不能排除一些代码只针对 64 位进程执行,可以用 GS 做一些事情,但可能没有问题。

swapgs只交换 GS 基数,不交换选择器。我不知道是否有任何内核入口点会用一些默认选择器值重写 GS(然后重新加载保存的 GS 基)。我猜不会。

关于linux - 在现代 Linux x86-64 中,用户空间覆盖 GS 寄存器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com