Switch System Flaws: Difference between revisions
mNo edit summary |
|||
Line 80: | Line 80: | ||
| December 16, 2018 | | December 16, 2018 | ||
| Everyone (independently). | | Everyone (independently). | ||
|- | |||
| TSEC ROM does not clear crypto registers after signature verification | |||
| | |||
TSEC supports executing signed-microcode at a greater privilege level than normal payloads. | |||
When jumping to signed microcode, the caller is expected to load hardware crypto register $c6 = <signature>, $c7 = <seed (zero for all officially-signed microcode)>. | |||
TSEC ROM then calculates the expected signature and compares it to the user-supplied one in $c6. On match, the secure payload is executed, and on failure an exception is raised. | |||
However, TSEC ROM fails to clear the crypto registers used to calculate the expected signature in either of the success/failure cases. | |||
Thus, with some way of obtaining the contents of crypto registers (e.g. ROP under some secure payload), an attacker can dump intermediary values from signature calculation. | |||
With enough data/trial/error, this is enough to reconstruct the signature algorithm: | |||
* mac = <davies meyer hash of (page || address of page) for each 0x100 page in the payload> | |||
* key = AES-ENCRYPT(hardware csecret 0x1, seed) | |||
* signature = AES-ENCRYPT(key, mac) | |||
| None | |||
| HAC-001 (Tegra210) | |||
| Late 2018/Early 2019 | |||
| August 2020 | |||
| [[User:qlutoo|qlutoo]]/[[User:Hexkyz|hexkyz]]/[[User:Shuffle2|shuffle2]], [[User:SciresM|SciresM]]/[[User:motezazer|motezazer]] (independently). | |||
|- | |||
| TSEC signature validation design flaw leads to fake-signing | |||
| | |||
As mentioned above, when jumping to signed microcode the caller is expected to load hardware crypto register $c6 = <signature>, $c7 = <seed (zero for all officially-signed microcode)>. | |||
However, TSEC ROM performs no validation on the input seed used to generate the signing key. | |||
This leads to the following attack: | |||
* Attacker gains rop under any secure microcode payload with signature = S. | |||
* Attacker uses the "csigenc" instruction to obtain K = AES-ENCRYPT(hardware csecret 0x1, S). | |||
* Attacker jumps to their own microcode with $c6 = <signature calculated on pc using K>, $c7 = S | |||
* TSEC ROM calculates key = AES-ENCRYPT(hardware csecret 0x1, S) = K, and the signature check passes. | |||
* Attackers microcode is executed in secure mode as though it were signed by NVidia. | |||
Thus an attacker who has exploited *any* secure payload may use this to obtain a "fake signature key", which can be used to sign and execute arbitrary microcode in secure mode. | |||
Note: this does not break the TSEC cryptosystem, as the csigenc mechanism relies on the signature of the executing microcode, and fakesigning produces different signatures from NVidia that cannot be controlled. | |||
| None | |||
| HAC-001 (Tegra210) | |||
| Late 2018/Early 2019 | |||
| August 2020 | |||
| [[User:qlutoo|qlutoo]]/[[User:Hexkyz|hexkyz]]/[[User:Shuffle2|shuffle2]], [[User:SciresM|SciresM]]/[[User:motezazer|motezazer]] (independently). | |||
|} | |} | ||