Skip to content

Commit 3c24d5c

Browse files
committed
Validate SELF metadata header sizes
1 parent 275c2d4 commit 3c24d5c

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

rpcs3/Crypto/unself.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,17 @@ bool SCEDecrypter::LoadMetadata(const u8 erk[32], const u8 riv[16])
627627
{
628628
aes_context aes;
629629
std::vector<u8> metadata_info(sizeof(meta_info));
630-
std::vector<u8> metadata_headers(sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info)));
630+
const u64 metadata_headers_offset = sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info);
631+
632+
if (sce_hdr.se_hsize < metadata_headers_offset ||
633+
sce_hdr.se_hsize - metadata_headers_offset < sizeof(meta_hdr) ||
634+
sce_hdr.se_hsize > sce_f.size())
635+
{
636+
self_log.error("Invalid SCE metadata header size!");
637+
return false;
638+
}
639+
640+
std::vector<u8> metadata_headers(sce_hdr.se_hsize - metadata_headers_offset);
631641

632642
// Locate and read the encrypted metadata info.
633643
sce_f.seek(sce_hdr.se_meta + sizeof(sce_hdr));
@@ -1123,7 +1133,17 @@ bool SELFDecrypter::LoadMetadata(const u8* klic_key)
11231133
{
11241134
aes_context aes;
11251135
std::vector<u8> metadata_info(sizeof(meta_info));
1126-
std::vector<u8> metadata_headers(sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info)));
1136+
const u64 metadata_headers_offset = sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info);
1137+
1138+
if (sce_hdr.se_hsize < metadata_headers_offset ||
1139+
sce_hdr.se_hsize - metadata_headers_offset < sizeof(meta_hdr) ||
1140+
sce_hdr.se_hsize > self_f.size())
1141+
{
1142+
self_log.error("Invalid SELF metadata header size!");
1143+
return false;
1144+
}
1145+
1146+
std::vector<u8> metadata_headers(sce_hdr.se_hsize - metadata_headers_offset);
11271147

11281148
// Locate and read the encrypted metadata info.
11291149
self_f.seek(sce_hdr.se_meta + sizeof(sce_hdr));

0 commit comments

Comments
 (0)