Difference between revisions of "Switch System Flaws"

From Nintendo Switch Brew
Jump to: navigation, search
(clarification)
m (add description of bug to names)
(3 intermediate revisions by 2 users not shown)
Line 109: Line 109:
 
!  Public disclosure timeframe
 
!  Public disclosure timeframe
 
!  Discovered by
 
!  Discovered by
 +
|-
 +
| sm:h, smhax, probably other names (SM:Initialize() not checked)
 +
| Prior to [[3.0.1]], the service manager ("sm") built-in system module treats a user as though it has full permissions if the user creates a new "sm:" port session but bypasses [[Services_API#Initialize|initialization]].
 +
In [[3.0.1]], "sm" returns error code 0x415 if [[Services_API#Initialize|Initialize]] has not been called yet.
 +
| Acquisition, registering, and unregistering of arbitrary services
 +
| [[3.0.1]]
 +
| [[3.0.1]]
 +
| April 2017
 +
| August 17, 2017
 +
| Everyone
 
|-
 
|-
 
| Out-of-bounds array read for [[BCAT_Content_Container]] secret-data index
 
| Out-of-bounds array read for [[BCAT_Content_Container]] secret-data index

Revision as of 09:28, 17 August 2017

System Flaws are used to execute unofficial code (homebrew) on the Nintendo Switch. This page is a list of known and public Switch System Flaws.

List of Switch System Flaws

Hardware

Summary Description Fixed with hardware model/revision Newest hardware model/revision this flaw was checked for Timeframe this was discovered Discovered by
No public hardware exploits

System software

Stage 1 Bootloader

Summary Description Successful exploitation result Fixed in system version Last system version this flaw was checked for Timeframe this was discovered Public disclosure timeframe Discovered by
Null-dereference in panic() The Switch's stage 1 bootloader, on panic(), clears the stack and then attempts to clear the Security Engine. However, it does so by dereferencing a pointer to the SE in .bss (initially NULL), and this pointer doesn't get initialized until partway into the bootloader's main() after several functions that might panic() are called. Thus, a panic() caused prior to SE initialization would result in the SE pointer still being NULL when dereferenced. This would cause a data abort, causing the bootloader to clear the stack and then try to clear the security engine...dereferencing NULL again, over and over in a loop.

In 3.0.0, this was fixed by moving the security engine initialization earlier in main(), before the first function that could potentially panic().

Infinite clear-the-stack-then-data-abort loop very early in boot, before SBK/other keyslots are cleared. Probably useless for anything more interesting. 3.0.0 3.0.0 Early July, 2017 July 30, 2017 Everyone who diff'd 2.3.0 and 3.0.0 Package1


TrustZone

Summary Description Successful exploitation result Fixed in system version Last system version this flaw was checked for Timeframe this was discovered Public disclosure timeframe Discovered by
No public ARM TrustZone exploits

Kernel

Summary Description Successful exploitation result Fixed in system version Last system version this flaw was checked for Timeframe this was discovered Public disclosure timeframe Discovered by
No public Kernel exploits


System Modules

Summary Description Successful exploitation result Fixed in system version Last system version this flaw was checked for Timeframe this was discovered Public disclosure timeframe Discovered by
sm:h, smhax, probably other names (SM:Initialize() not checked) Prior to 3.0.1, the service manager ("sm") built-in system module treats a user as though it has full permissions if the user creates a new "sm:" port session but bypasses initialization.

In 3.0.1, "sm" returns error code 0x415 if Initialize has not been called yet.

Acquisition, registering, and unregistering of arbitrary services 3.0.1 3.0.1 April 2017 August 17, 2017 Everyone
Out-of-bounds array read for BCAT_Content_Container secret-data index The BCAT_Content_Container secret-data index is not validated at all. This is handled before the RSA-signature(?) is ever used. Since the field is an u8, a total of 0x800-bytes relative to the array start can be accessed.

This is not useful since the string loaded from this array is only involved with key-generation.

Unknown 2.0.0 August 4, 2017 August 6, 2017 Shiny Quagsire, Yellows8 (independently)
OOB Read in NS system module (pl:utoohax, pl:utonium, maybe other names) Prior to 3.0.0, pl:u (Shared Font services implemented in the NS sysmodule) service commands 1,2,3 took in a signed 32-bit index and returned that index of an array but did not check that index at all. This allowed for an arbitrary read within a 34-bit range (33-bit signed) from NS .bss. In 3.0.0, sending out of range indexes causes error code 0x60A to be returned. Dumping full NS .text, .rodata and .data, infoleak, etc 3.0.0 3.0.0 April 2017 On exploit's fix in 3.0.0 qlutoo, Reswitched team (independently)
Unchecked domain ID in common IPC code Prior to 2.0.0, object IDs in domain messages are not bounds checked. This out-of-bounds read could be exploited to brute-force ASLR and get PC control in some services that support domain messages. 2.0.0