TL;DR
- 핫패칭(Hot-patching)은 Windows Update만 핫패치 공간을 사용한다는 전제에 따라 설계돼 있어, 이미 패치된 함수를 발견하면 문제가 발생함.
- 핫패칭 대상은 핫패칭을 지원하는 Windows 시스템에서 관리자가 기능을 선택하고, 업데이트 파일이 핫패칭에 안전하다고 표시된 경우의 함수임.
- 허가되지 않은 패치를 감지하면 해당 파일을 핫패치할 수 없는 것으로 판정하고 시스템을 재부팅해야 할 수 있음.
- 사전 검사 뒤 실제 패치 전에 다른 코드가 함수를 패치하면, 업데이트가 일부만 적용되고 롤백도 실패할 수 있음.
- 핫패치 공간을 사용하는 애플리케이션은 Windows Update가 도착했을 때 업데이트를 방해할 수 있는 위험을 감수하는 셈임.
핫패칭의 전제
- 며칠 동안 핫패칭 메커니즘을 간단히 살펴본 결과, 핫패칭 설계는 핫패처가 하나뿐이라는 전제에 기반함. 이미 핫패치된 함수를 다시 핫패치하려 한다면 무언가 잘못된 상황임.
- 핫패칭의 대상은 핫패칭을 지원하는 시스템의 Windows Update임. 현재 기준으로는 Windows Server와, 더 최근에는 Windows 11 Enterprise가 해당하는 것으로 파악됨.
- Windows Update가 도착하고 관리자가 핫패칭을 선택했으며 업데이트 파일이 ‘핫패칭에 안전함’으로 표시된 경우, Windows Update는 핫패칭용으로 예약된 공간을 사용해 영향을 받는 함수를 실행 중에 교체함.
- 핫패치 공간 사용 권한은 Windows Update에만 있으므로, 시스템은 다른 주체가 함수를 이미 핫패치한 상황을 처리할 필요가 없음. 그런 권한을 가진 다른 코드는 존재하지 않음.
허가되지 않은 패치와 경합 조건
- 함수가 디투어(detour)되거나 허가되지 않은 주체에 의해 다른 방식으로 패치된 경우가 문제임.
- 핫패칭 코드를 살펴본 결과, 핫패치 코드가 비정상적인 패치를 감지하면 해당 파일을 핫패치 불가로 판정하고 시스템이 재부팅해야 하는 것으로 보임. 이는 고객을 불만스럽게 만들기 쉬움.
- 사전 검사에서는 모든 함수가 안전하다고 판단했더라도, 검사가 끝난 뒤 누군가 함수를 패치할 수 있는 경합 조건이 존재함.
- 이 경우 패처는 작업을 절반쯤 진행한 뒤 비정상적으로 패치된 함수를 발견함. 작업을 계속할 수 없고, 이미 추가 패치된 상태라 롤백도 실패할 가능성이 있어 안정적으로 되돌릴 수 없음.
- 결과적으로 메모리에는 절반만 패치된 바이너리가 남고, 이후 어떤 일이 생길지 알 수 없음.
핫패치 공간을 사용하는 애플리케이션의 위험
- 핫패치 공간을 사용하는 애플리케이션은 소방 구역에 주차하는 것과 같음. 소방차가 도착하기 전까지는 문제가 없어 보여도, 정작 소방차가 현장에 도달하지 못해 집이 불타는 상황이 생길 수 있음.
- 관련 읽을거리: Application compatibility layers are there for the customer, not for the program.
각주
- 모든 변경이 핫패칭에 안전한 것은 아님. 예를 들어 데이터 구조의 레이아웃이나 불변 조건을 바꾸면, 핫패치 전에 생성된 해당 구조체 인스턴스가 핫패치 후에는 유효하지 않은 상태가 될 수 있으므로 핫패치할 수 없음.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요