Skip to content

Commit 490da2e

Browse files
committed
Safety check for B9S magic in FIRM
1 parent 94e324d commit 490da2e

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

source/installer.c

+5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ u32 SafeB9SInstaller(void) {
132132
statusFirm = STATUS_RED;
133133
return 1;
134134
}
135+
if (CheckBoot9Strap(FIRM_BUFFER) != 0) {
136+
snprintf(msgFirm, 64, "not boot9strap");
137+
statusFirm = STATUS_RED;
138+
return 1;
139+
}
135140
snprintf(msgFirm, 64, "loaded & verified");
136141
statusFirm = STATUS_GREEN;
137142
ShowInstallerStatus();

source/safety/validator.c

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
#define FIRM_MAGIC 'F', 'I', 'R', 'M'
66
#define FIRM_MAX_SIZE 0x400000 // 4MB, due to FIRM partition size
77

8+
#define B9S_MAGIC "B9S"
9+
#define B9S_OFFSET (0x40 - strnlen(B9S_MAGIC, 0x10))
10+
811
// see: https://www.3dbrew.org/wiki/FIRM#Firmware_Section_Headers
912
typedef struct {
1013
u32 offset;
@@ -110,3 +113,7 @@ u32 CheckFirmSigHax(void* firm) {
110113
FirmHeader* header = (FirmHeader*) firm;
111114
return (sha_cmp(sighaxHash, header->signature, 0x100, SHA256_MODE) == 0) ? 0 : 1;
112115
}
116+
117+
u32 CheckBoot9Strap(void* firm) {
118+
return (memcmp(((u8*) firm) + B9S_OFFSET, B9S_MAGIC, strnlen(B9S_MAGIC, 0x10)) == 0) ? 0 : 1;
119+
}

source/safety/validator.h

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
u32 ValidateFirm(void* firm, u8* firm_sha, u32 firm_size, char* output);
66
u32 ValidateSector(void* sector);
77
u32 CheckFirmSigHax(void* firm);
8+
u32 CheckBoot9Strap(void* firm);

0 commit comments

Comments
 (0)