Why you can’t trust CPUID
chipsandcheese.com
chipsandcheese.com
So the real title should have been: "You thought there are 5 ways to fake test results? Nope, there are 6." Not nearly as exciting.
You could still sign the result with the CPU ID key.
But, then, the result can be completely bogus. The benchmark itself would need to be something that can't be faked, but a proof-of-work benchmark would end up being a very synthetic one, and very biased towards a limited set of functions.
Is this because Linux reads this once at boot time, before you have a chance to modify it? If so, I assume you could still modify the string from the firmware, bootloader, or simply by modifying the kernel.
For example, on my AMD Threadripper system I can make a VM that pretends to be essentially any Xeon
It may perform horribly where features/extensions don't line up, but it'll report whatever.
For physical devices it's possible too, just not nearly as common
ls -l /proc/cpuinfo
It says (basically it is a pseudo-filesystem with read-only permission, so I don't think so it is possible without making any changes at the Linux kernel/driver level): -r--r--r-- 1 root root 0 Oct 28 09:38 /proc/cpuinfoThe thing is, it has to get the information from somewhere -- and depending on the age/type of the hardware (physical or virtualized), masking this is either easy or nearly impossible
I remember changing this information (DMI?) was more common back in the like Pentium 3 era, for example.
I appreciate it everyone, save your fingers :)
I've seen this done for physical chips before too, but I can't recall anything - hence vagueness
Other systems do better by not depending on that.
You could even just modify the kernel to report arbitrary strings in /proc/cpuinfo.
So they use the CPUID instruction instead. The CPUID instruction can be trapped to throw a SIGSEGV instead of returning real values on x86 with arch_prctl(ARCH_SET_CPUID, 0). So an injected SIGSEGV handler could then spoof it.
But even then, you could also trap the CPUID instruction in the kernel, and spoof it from there, which would be even harder to detect from user space.
In the end, the benchmark program always needs to trust the kernel. Is it really worth trying to detect spoofing?
It's usually used to downgrade a set of features if you want VM to be able to be live-migrated between machines with different CPUs, we migrated a bunch of stuff off Intel to AMD that way. There is a performance hit on that as you're basically making virtual "lowest common denominator" CPU