RSS 프로젝트 제로
팔로우
포인터 키 데이터 구조를 통한 포인터 누수
Google Project Zero는 Apple 기기에서 메모리 손상 버그를 악용하기 위해 원격 ASLR 누출의 필요성에 대해 논의했습니다. 이는 메모리 안전 위반이나 타이밍 공격 없이 원격으로 포인터를 누출할 수 있는 기술의 발견으로 이어졌습니다. 이 방법은 역직렬화, 재직렬화 및 공격자가 제공한 데이터를 반환하는 공격 표면에 적용됩니다. macOS/iOS에서 즉각적인 실제 공격 표면은 확인되지 않았지만, 이 기술은 NSKeyedArchiver를 사용한 인위적인 사례를 통해 테스트되었습니다. 이 문제는 Apple에 보고되어 수정되었지만, 실제 영향이 입증되지 않아 공개 버그 추적기 항목은 만들어지지 않았습니다. 이 새로운 기술은 해시 테이블 충돌 공격과 관련된 이전 연구를 기반으로 합니다. 역사적으로 해시DoS 공격은 최악의 해시 테이블 성능을 악용하여 서비스 거부를 유발했습니다. 이전 연구에서도 해시 충돌을 사용하여 주소를 누출할 수 있음을 시사했습니다. 해시DoS 개념은 공격자가 특정 해시 버킷에 대한 액세스를 늦추는 것으로 볼 수 있습니다. 이 원리는 Firefox에서 JavaScript Map 삽입의 타이밍 측정을 통해 힙 주소를 누출하는 데 활용되었습니다. 포인터 키 데이터 구조를 반복하는 것도 객체 주소에 대한 정보를 드러낼 수 있습니다. 직렬화 메커니즘, 특히 임의의 객체 그래프를 허용하는 메커니즘은 안전하지 않을 수 있습니다. Apple의 NSKeyedUnarchiver는 역직렬화 가능한 클래스의 허용 목록으로 작동합니다. 특정 테스트 사례는 NSKeyedUnarchiver를 사용하여 공격자가 제공한 데이터를 역직렬화하고 재직렬화하여 공유 캐시 포인터를 누출하는 것을 목표로 합니다. NSNull 싱글톤 객체의 해시는 명시적으로 처리되지 않으면 기본적으로 공유 캐시에 저장된 주소로 설정됩니다. NSNumber 인스턴스는 숫자 값에 따라 다르게 해시됩니다. 사전은 키 배치를 관리하기 위해 해시 코드를 버킷 수로 나눈 값으로 사용합니다.