This vulnerability occurs when a hardware design maps the same physical memory to multiple addresses (aliasing or mirroring) but fails to apply consistent read/write permissions across all these addresses. An attacker blocked from accessing a protected memory region might still reach the same data through its unprotected aliased address, bypassing security controls.
Hardware designs often use memory aliasing for legitimate purposes like redundancy, fault tolerance, or simplifying address decoding logic. However, a critical security flaw emerges when the access control logic checks permissions for only one address path and not its aliases. This creates an inconsistent security state where the same physical memory cell has different protection levels depending on which logical address is used to access it. From a developer or attacker perspective, this inconsistency becomes an exploitable bypass. An untrusted process or agent denied access to a primary address can simply target the alternate, aliased address to read or write protected memory. Furthermore, if an attacker can manipulate system address mapping registers, they might be able to create malicious aliases themselves, fundamentally undermining the hardware's memory isolation guarantees.
Impact: Read Memory
Impact: Modify Memory
Impact: DoS: Instability
In this design the aliased memory address ranges are these:
0x0000 - 0x0FFF
0x1000 - 0x1FFF
0x2000 - 0x2FFF
0x3000 - 0x3FFF
The same register can be accessed using four different addresses: 0x0000, 0x1000, 0x2000, 0x3000.
The system address filter only blocks access to range 0x0000 - 0x0FFF and does not block access to the aliased addresses in 0x1000 - 0x3FFF range. Thus, untrusted software can leverage the aliased memory addresses to bypass the memory protection.
In this design the aliased memory addresses (0x1000 - 0x3FFF) could be blocked from all system software access since they are not used by software.
Alternately, the MPU logic can be changed to apply the memory protection policies to the full address range mapped to Unit_A (0x0000 - 0x3FFF).