Until recently, my list of what can cause side channels exfiltrating secret data (including data depending on secrets) from code running in a computer was limited to:
- Hardware emissions: power (e.g. SPA), electromagnetic (e.g. DEMA, Tx/Rx LEDs, [update] other hardware snooping…), sound (e.g. from power supply)
- Rogue access to memory/media: e.g. by kernel code, buffer overflow, side effect of memory management, JTAG interface, DMA, cold boot, microprobing, or more generally bypassing access restrictions. I put exfiltration by any communication interface in this category.
- Instruction with data-dependent timing which can cause leak by timing variation: e.g. multiplication, see this.
- Code branching according to secret (if, switch..) which can cause leak by timing variation or other mean like shared branch prediction logic. I put in this category conditional execution according to a condition code without branching, when it causes a leak.
- Memory read or write to secret-dependent memory location (e.g. table read at key-dependent address), which can cause leak by timing variation or other mean like shared cache.
Now we must reportedly add Data Memory-dependent Prefetcher in some (Apple) CPUs:
DMP activates (and attempts to dereference) data loaded from memory that "looks like" a pointer.
So now the value of data read in memory can cause a leak by timing or other means like shared cache (other than hardware emissions)!! For details see Boru Chen, Yingchen Wang, Pradyumna Shome, Christopher W. Fletcher, David Kohlbrenner, Riccardo Paccagnella and Daniel Genkin: GoFetch: Breaking Constant-Time Cryptographic Implementations Using Data Memory-Dependent Prefetchers
Question: Can the value of data written to memory also cause a leak in some common CPUs? I'm in particular thinking of suppression of memory writes when some gizmo in the memory subsystem notices that the value being written is the same as the last value read at that location.
Are there other known causes of side channels on common computer gear often doing cryptography (desktop, server, mainframe, portable, mobile, embedded CPUs, GPU…) that I did not discuss?