Re: [PATCH v2 1/1] x86/ia32: Normalize any null selector value to 0
From: Xin Li
Date: Wed Nov 20 2024 - 14:09:55 EST
On 11/20/2024 1:33 AM, Andrew Cooper wrote:
The first GDT descriptor is reserved as 'null descriptor'. As bits 0
and 1 of a segment selector, i.e., the DPL bits, are NOT used to index
That's RPL in segment selector, not DPL. Same correction is needed in
the code comments.
Intel SDM says:
• Descriptor privilege level (DPL) field —
(Bits 13 and 14 in the second doubleword of a segment descriptor.)
Determines the privilege level of the segment.
• Requested privilege level (RPL) field —
(Bits 0 and 1 of any segment selector.) Specifies the requested
privilege level of a segment selector.
I got lost somehow.
GDT, selector values 0~3 all point to the null descriptor, thus values
0, 1, 2 and 3 are all valid null selector values.
Furthermore IRET zeros ES, FS, GS, and DS segment registers if any of
them is found to have any null selector value, essentially making 0 a
preferred null selector value.
Zeroing of RPL in null selectors is an information leak in pre-FRED
systems. Userspace can spot any interrupt/exception by loading a
nonzero NULL selector, and waiting for it to drop to zero.
Userspace should not be able to do this; Andy and I lobbied for this
during the design of FRED, and Intel agreed.
I wasn't aware of this, and hpa just told me you're right :)
Right now, this change is codifying the problem behaviour we were trying
to fix out under FRED.
Under FRED, if userspace loads e.g. 2 into a selector, it should remain
2 until userspace changes it to something else.
Okay, I will fix it by:
1) For null selector values, do nothing.
2) For non-null selector values, set RPL bits.
sounds okay?
Thanks!
Xin