2144
Access and programming flows must be tested in pre-silicon and post-silicon testing in order to
check for this weakness.
Demonstrative Examples
Example 1:
Consider a system that has four bus masters and a decoder. The decoder is supposed to decode
every bus transaction and assign a corresponding security identifier. The security identifier is used
to determine accesses to the assets. The bus transaction that contains the security information is
Bus_transaction [15:14], and the bits 15 through 14 contain the security identifier information. The
table below provides bus masters as well as their security identifiers and trust assumptions:
The assets are the AES-Key registers for encryption or decryption. The key is 128 bits
implemented as a set of four 32-bit registers. The AES_KEY_ACCESS_POLICY is used to define
which agents with a security identifier in the transaction can access the AES-key registers. The
size of the security identifier is 4 bits (i.e., bit 3 through 0). Each bit in these 4 bits defines a
security identifier. There are only 4 security identifiers that are allowed accesses to the AES-key
registers. The number of the bit when set (i.e., "1") allows respective action from an agent whose
identity matches the number of the bit. If clear (i.e., "0"), disallows the respective action to that
corresponding agent.
The following Pseudo code outlines the process of checking the value of the Security Identifier
within the AES_KEY_ACCESS_POLICY register:
Example Language: Other (Informative)
If (AES_KEY_ACCESS_POLICY[Security_Identifier] == "1")
Allow access to AES-Key registers
Else
Deny access to AES-Key registers
Below is a decoder's Pseudo code that only checks for bit [14] of the bus transaction to determine
what Security Identifier it must assign.
Example Language: Other (Bad)
If (Bus_transaction[14] == "1")
Security_Identifier == "1"
Else
Security_Identifier == "0"
The security identifier is two bits, but the decoder code above only checks the value of one bit. Two
Masters have their bit 0 set to "1" - Master_1 and Master_3. Master_1 is trusted, while Master_3 is
not. The code above would therefore allow an untrusted agent, Master_3, access to the AES-Key
registers in addition to intended trusted Master_1.
The decoder should check for the entire size of the security identifier in the bus-transaction signal
to assign a corresponding security identifier. The following is good Pseudo code:
Example Language: Other (Good)
If (Bus_transaction[15:14] == "00")
Security_Identifier == "0"
If (Bus_transaction[15:14] == "01")
Security_Identifier == "1"
If (Bus_transaction[15:14] == "10")
Security_Identifier == "2"
If (Bus_transaction[15:14] == "11")
Security_Identifier == "3"
CWE Version 4.14
CWE-1291: Public Key Re-Use for Signing both Debug and Production Code
CWE-1291: Public Key Re-Use for Signing both Debug and Production Code