
cve-2025-46285简单复现poc
CVE-2025-46285 취약점 심층 분석 및 개념 증명 중요 면책 조항: 다음 내용은 사이버 보안 교육, 방어적 연구 및 취약점 원리 분석 용도로만 제공됩니다. 승인되지 않은 환경에서 이 취약점을 테스트하거나 악용하지 마십시오. 시스템 취약점을 악용하면 법적 결과 및 장비 손상이 발생할 수 있습니다.
// 취약점이 있는 시스템 구성 요소 시뮬레이션 // 32비트 부호 있는 정수를 사용하여 타임스탬프 저장 - CVE-2025-46285의 근본 원인
typedef struct { int32_t timestamp; // 취약점: 32비트 정수 사용 int32_t duration; // 지속 시간 int is_valid; // 유효성 플래그 } TimeSensitiveData;
/**
취약 함수: 만료 시간 계산
문제: current_time + duration이 INT32_MAX를 초과하면 오버플로우 발생
결과: timestamp가 음수가 되어 보안 검사 무효화 가능 */ int vulnerable_check_expiration(int32_t current_time, int32_t duration) { int32_t expiration_time;
// 정수 오버플로우 시뮬레이션 // current_time이 INT32_MAX에 가까우면 duration을 더한 후 음수로 랩어라운드됨 expiration_time = current_time + duration;
printf("[Vulnerable] Current Time: %d, Duration: %d\n", current_time, duration); printf("[Vulnerable] Calculated Expiration: %d\n", expiration_time);
// 보안 검사: 현재 시간이 만료 시간보다 크면 무효 // 그러나 expiration_time이 오버플로우로 음수가 되고 current_time이 양수이면 // current_time > expiration_time이 항상 참이 되어 "만료됨" 판단 오류 발생 // 또는 일부 로직에서는 음수 시간이 "영구 유효"로 해석되거나 검증을 우회할 수 있음
if (current_time > expiration_time) { return 0; // 만료됨 } else { return 1; // 유효 } }
/**
수정 함수: 64비트 정수를 사용하여 타임스탬프 처리
수정 방안: 64비트 타임스탬프 도입으로 오버플로우 방지 */ int fixed_check_expiration(int64_t current_time, int64_t duration) { int64_t expiration_time;
// 64비트 정수 사용, 매우 넓은 범위로 오버플로우 거의 불가능 expiration_time = current_time + duration;
printf("[Fixed] Current Time: %lld, Duration: %lld\n", current_time, duration); printf("[Fixed] Calculated Expiration: %lld\n", expiration_time);
if (current_time > expiration_time) { return 0; // 만료됨 } else { return 1; // 유효 } }
/**
공격 시나리오 시뮬레이션
공격자가 INT32_MAX에 가까운 타임스탬프를 구성하고 작은 지속 시간을 더하여
오버플로우를 유발하고 음수를 생성하여 시간 기반 보안 검사를 우회함 */ void demonstrate_attack() { printf("\n=== 정수 오버플로우 공격 시연 ===\n");
// 32비트 정수 최대값에 가까운 시간 설정 // INT32_MAX = 2147483647 int32_t near_max_time = 2147483640; int32_t small_duration = 10;
printf("공격자가 구성한 타임스탬프: %d\n", near_max_time); printf("공격자가 구성한 지속 시간: %d\n", small_duration);
int result_vuln = vulnerable_check_expiration(near_max_time, small_duration);
if (result_vuln == 1) { printf("[!] 취약점 악용 성공: 시스템이 데이터가 여전히 유효하다고 잘못 판단!\n"); printf("[!] 이유: 2147483640 + 10 = -2147483646 (오버플로우 랩어라운드)\n"); printf("[!] 현재 시간 (%d)이 만료 시간 (-2147483646)보다 크지 않으므로 유효 반환.\n", near_max_time); } else { printf("[*] 취약점 악용 실패\n"); } }
/**
수정 후 동작 시연 */ void demonstrate_fix() { printf("\n=== 수정 후 동작 시연 ===\n");
int64_t near_max_time_64 = 2147483640; int64_t small_duration_64 = 10;
int result_fixed = fixed_check_expiration(near_max_time_64, small_duration_64);
if (result_fixed == 1) { printf("[+] 수정 유효: 시스템이 데이터를 올바르게 유효하다고 인식.\n"); printf("[+] 이유: 2147483640 + 10 = 2147483650 (오버플로우 없음)\n"); printf("[+] 현재 시간 (%lld)이 만료 시간 (2147483650)보다 크지 않으므로 유효 반환.\n", near_max_time_64); } else { printf("[*] 데이터 만료됨\n"); } }
int main() { printf("CVE-2025-46285 개념 증명: 정수 오버플로우로 인한 타임스탬프 처리 오류\n"); printf("======================================================\n");
// 1. 공격 시연
demonstrate_attack();
// 2. 수정 시연
demonstrate_fix();
printf("\n======================================================\n");
printf("결론: 64비트 정수(int64_t)를 사용하면 이러한 오버플로우 문제를 완전히 방지할 수 있습니다.\n");
printf("Apple은 iOS 18.7.3, macOS 14.8.3 등 버전에서 이 수정을 적용했습니다.\n");
return 0;
} 코드 주석 설명 데이터 구조 정의: TimeSensitiveData 구조체는 시스템에서 타임스탬프를 저장하는 객체를 시뮬레이션합니다. int32_t timestamp는 취약점의 근원으로, 시간 표현 범위를 제한합니다. vulnerable_check_expiration 함수: 취약점이 있는 로직을 시뮬레이션합니다. expiration_time = current_time + duration; 이 줄은 current_time이 INT32_MAX에 가까울 때 오버플로우를 발생시킵니다. 32비트 부호 있는 정수에서 2147483647 + 1은 -2147483648이 됩니다. 이후 비교 current_time > expiration_time은 음수 비교로 인해 잘못된 논리 분기가 발생하여 보안 정책이 우회될 수 있습니다. fixed_check_expiration 함수: Apple의 수정 방안을 보여줍니다: int64_t 사용. 64비트 정수의 최대값은 약 $9 \times 10^{18}$로, 서기 2920억 년까지 표현할 수 있어 오버플로우 가능성을 근본적으로 제거합니다. demonstrate_attack 함수: INT32_MAX에 가까운 타임스탬프(2147483640)와 작은 지속 시간(10)을 구성합니다. 실행 후 expiration_time이 음수가 됩니다. 2147483640 > -2147483646이 참이므로 함수는 0(만료됨)을 반환합니다. 참고: 일부 보안 로직에서 시스템이 "유효"에 대해 0이 아닌 값을 기대하거나 if (expiration_time < 0) return VALID;와 같은 논리가 있는 경우 공격자는 "영구 유효" 상태를 구성할 수 있습니다. 이 예제는 주로 오버플로우로 인한 값 이상을 보여줍니다. demonstrate_fix 함수: 64비트 정수를 사용하여 동일한 작업을 수행합니다. 오버플로우 없이 논리가 올바릅니다. 방어 권장 사항 시스템 업그레이드: macOS, iOS, iPadOS, tvOS, watchOS, visionOS를 최신 버전(macOS 14.8.3+, iOS 18.7.3+ 등)으로 즉시 업데이트하십시오. 코드 검토: 시간 처리가 포함된 코드를 개발할 때는 항상 64비트 정수(int64_t, uint64_t)를 사용하여 타임스탬프를 저장하십시오. 입력 검증: 모든 외부 입력 시간 매개변수에 대해 경계 검사를 수행하여 합리적인 범위 내에 있는지 확인하십시오. 표준 라이브러리 사용: 운영 체제가 제공하는 고수준 시간 API를 우선 사용하십시오. 이러한 API는 일반적으로 기본 오버플로우 문제를 이미 처리하고 있습니다.