4 ms·
Caveat: I am also a high level programmer. My understanding is that the problem is that the data in the cache _isn't_ rolled back. You fetch the secret data.
by ajanuary 9y ago
Caveat: I am also a high level programmer.
My understanding is that the problem is that the data in the cache _isn't_ rolled back.
You fetch the secret data. You then fetch a different memory addressed based on the contents of the secret data e.g. fetch((secret_bit * 128) + offset) [1] so if secret_bit is 0 it's fetched the memory at offset into the cache, if secret_bit is 1 it's fetched the memory at offset+128 into the cache.
After the speculative work is rolled back, the data that it fetched into the cache still remains. You then time how long it takes to fetch offset and offset+128. If offset comes back quickly, secret_bit was 0. If offset+128 comes back quickly, secret_bit was 1.
_That_ is where the timing attack part comes in: "timing attack" refers to using measurements of how long something took to glean information, not that you need to do it quickly.
[1] In reality you do it on the byte level and use &, but I wanted to keep it to guessing a single bit to make it simpler.
- samsonradu 9y ago> You fetch the secret data. You then fetch a different memory addressed based on the contents of the secret data ... I was under the impression that there is no interface to read data from the CPU caches and that the cache is managed by the CPU itself only.
- ajanuary 9y agoRight, which makes it a bit of a tricky attack to pull off. But if you know what you're doing you can do some operation that requires memory address x and be reasonably sure it will end up in the CPU cache. If you then do an operation on memory address x, and it happens really quickly, and you do an operation on memory address x+128, and it happens a bit slower, you can assume that x was in the cache and x+128 wasn't.
- samsonradu 9y agoYes, I got the part where you can time if memory address X is in cache and X+128 isn't. But how does one read the data at memory address X?
- ajanuary 9y agoYou load it into a register. If you're trying to drive it from a high level language, I guess you can do something like an add which will get compiled into instructions to load it into a register first.