fix: do proper checks for pongo bin

This commit is contained in:
CLARATION committed 2026-08-02 20:34:22 -07:00
1 parent 27eb58e188
commit 8d2fa31bc9
4 files changed
+31 -20

No files matched your search

+23
View File
@@ -88,6 +88,29 @@ payload_t g_payload_kpf = {
.uncompressed_data_len = embedded_checkra1n_kpf_pongo_len,
};
#define PONGO_MAX_SZ (0x7fe00)
#define MACHO_MAGIC_32 (0xFEEDFACE)
#define MACHO_MAGIC_64 (0xFEEDFACF)
bool check_payload_validity(const payload_t *payload, bool isPongo)
{
if (!payload || !payload->data || payload->data_len < 4)
return false;
const uint32_t magic = *(const uint32_t *)payload->data;
const bool isMachO = (magic == MACHO_MAGIC_32 || magic == MACHO_MAGIC_64);
if (isPongo) {
if (isMachO || payload->data_len > PONGO_MAX_SZ)
return false;
} else {
if (!isMachO)
return false;
}
return true;
}
bool override_payload_from_file(const char *path, payload_t *out)
{
FILE *f = fopen(path, "rb");
+1
View File
@@ -52,6 +52,7 @@ extern payload_t g_payload_kpf;
extern "C" {
#endif
bool check_payload_validity(const payload_t *payload, bool isPongo);
bool override_payload_from_file(const char *path, payload_t *out);
#ifdef __cplusplus
+7 -15
View File
@@ -333,11 +333,10 @@ void parse_arguments(int argc, char* argv[]) {
LOG_ERROR("Failed to load pongo payload, is the path correct?");
exit(1);
}
if (g_payload_pongo.data_len > PONGO_MAX_SZ) {
LOG_ERROR("Pongo payload is too large! %zu bytes (max %zu)", g_payload_pongo.data_len, PONGO_MAX_SZ);
if (!check_payload_validity(&g_payload_pongo, true)) {
LOG_ERROR("Pongo payload is invalid or too large! %zu bytes", g_payload_pongo.data_len);
exit(1);
}
// TODO: check if macho, otherwise exit
LOG("Overriding pongo payload with %s", optarg);
break;
case 'K': // --override-kpf
@@ -345,11 +344,8 @@ void parse_arguments(int argc, char* argv[]) {
LOG_ERROR("Failed to load kpf payload, is the path correct?");
exit(1);
}
if (g_payload_kpf.data_len < 4
|| (memcmp(g_payload_kpf.data, MACHO_MAGIC_64, 4) != 0
&& memcmp(g_payload_kpf.data, MACHO_MAGIC_32, 4) != 0))
{
LOG_ERROR("Invalid kpf payload, is it macho?");
if (!check_payload_validity(&g_payload_kpf, false)) {
LOG_ERROR("KPF payload is invalid! Is it a valid Mach-O binary?");
exit(1);
}
LOG("Overriding kpf payload with %s", optarg);
@@ -476,8 +472,8 @@ void parse_arguments(int argc, char* argv[]) {
LOG_ERROR("Failed to load pongo payload from env, is the path correct?");
exit(1);
}
if (g_payload_pongo.data_len > PONGO_MAX_SZ) {
LOG_ERROR("Pongo payload is too large! %zu bytes (max %zu)", g_payload_pongo.data_len, PONGO_MAX_SZ);
if (!check_payload_validity(&g_payload_pongo, true)) {
LOG_ERROR("Pongo payload is invalid or too large! %zu bytes", g_payload_pongo.data_len);
exit(1);
}
LOG("Overriding pongo payload with %s (from env)", env_pongo);
@@ -489,10 +485,7 @@ void parse_arguments(int argc, char* argv[]) {
LOG_ERROR("Failed to load kpf payload from env, is the path correct?");
exit(1);
}
if (g_payload_kpf.data_len < 4
|| (memcmp(g_payload_kpf.data, MACHO_MAGIC_64, 4) != 0
&& memcmp(g_payload_kpf.data, MACHO_MAGIC_32, 4) != 0))
{
if (!check_payload_validity(&g_payload_kpf, false)) {
LOG_ERROR("Invalid kpf payload from env, is it macho?");
exit(1);
}
@@ -517,7 +510,6 @@ void parse_arguments(int argc, char* argv[]) {
LOG("Overriding ramdisk payload with %s (from env)", env_ramdisk);
}
// MARK: Flag checks
if ((palerain_flags & palerain_option_pongo_exit) &&
-5
View File
@@ -46,11 +46,6 @@ typedef transfer_ret_t p1_transfer_ret_t;
typedef checkm8_err_t p1_checkm8_err_t;
#endif
#define PONGO_MAX_SZ (0x7fe00)
// used for checking overridden files (KPF mainly)
#define MACHO_MAGIC_32 (const unsigned char[]){ 0xCE, 0xFA, 0xED, 0xFE }
#define MACHO_MAGIC_64 (const unsigned char[]){ 0xCF, 0xFA, 0xED, 0xFE }
p1_checkm8_err_t send_compressed_pongo(p1_usb_handle_t *handle, const uint8_t *pongo_bin, const size_t pongo_bin_length);
p1_checkm8_err_t send_full_pongo_jailbreak(p1_usb_handle_t *handle);