
Acronis 임의 파일 읽기 PoC - CVE-2022-45451
Acronis "ngscan" 안티멀웨어 스캔 드라이버는 필터 통신 포트에 적용된 잘못된/부적절한 액세스 제어로 인해 문제가 발생한다. 미니필터 드라이버는 악용될 수 있는 다음 기능을 지원한다:
ngscan.sys 드라이버 분석은 Ida Pro로 드라이버를 디컴파일하는 것으로 시작되었다. 연구자는 디바이스 객체가 생성되었지만 DeviceIoControl을 사용하여 드라이버와 상호 작용할 수 있는 심링크는 생성되지 않았다는 점을 기록했다.
따라서 필터 통신 포트 기능을 관찰하는 방식으로 분석을 계속했다.
초기화 중에 드라이버는 다른 프로세스와의 상호 작용을 지원하기 위해 5개의 통신 포트를 생성한다.

그림 1: 최대 5개의 필터 통신 포트(FCP) 생성을 지원하는 루틴
이 함수는 5개의 FCP 각각을 기본 dacl로 초기화하고 마지막 FCP는 NULL dacl로 생성하면서 호출되는 것이 관찰되었다.

그림 2: 기본/NULL DACL로 FCP 생성
필터 드라이버가 지정한 CreateNotifyCallback 및 MessageNotifyCallback 함수를 관찰하면서 분석을 계속했다. 이 콜백 함수는 프로세스가 연결을 열고 통신 포트에 메시지를 보낼 때마다 호출된다.

MessageNotifyCallback을 처음 검사한 결과, 들어오는 메시지의 버퍼는 다음 요구 사항을 충족해야 한다는 것이 확인되었다:
검사가 통과되면 InputBuffer에서 함수 번호가 파싱되고 다음 switch 케이스에서 제공된 입력으로 실행할 함수를 선택하는 데 사용된다.

그림 3: MessageNotifyCallback에서 지원하는 함수의 일부
지원되는 각 함수를 검사한 결과, 임의 파일 읽기로 이어질 수 있는 잠재적 남용 가능성이 있는 두 가지 함수가 확인되었다.

그림 4: 스캔 컨텍스트 생성 및 스캔 컨텍스트의 파일 핸들 반환을 지원하는 함수(206행, 233행)
"스캔 컨텍스트"의 정확한 기능은 완전히 알려져 있지 않지만, 분석 결과 사용자 InputBuffer에 지정된 임의 파일에 대해 파일 스캔 컨텍스트를 생성할 수 있는 것으로 나타났다. 스캔 컨텍스트가 생성되면 스캔 컨텍스트 ID가 출력 버퍼를 통해 사용자에게 반환된다.

그림 5: 스캔 컨텍스트 데이터를 사용자에게 반환하는 Create Scan Context 루틴

그림 6: 보호된 SAM 레지스트리 파일(\??\C:\Windows\System32\config\SAM)에 대한 액세스를 요청하며 미니필터 드라이버로 전송된 데이터

그림 7: 스캔 컨텍스트 ID(0x3aaf)를 포함한 미니필터 드라이버의 응답
스캔 컨텍스트가 생성되고 ID를 검색한 후에는 통신 포트에 다시 메시지를 보내 요청 애플리케이션에서 스캔 컨텍스트가 생성된 파일에 대한 핸들을 열 수 있다.

그림 8: 생성된 스캔 컨텍스트 파일 핸들 검색
CreateFileReturnHandle0로 지정된 함수는 이전 함수 SearchScanContextsByID가 유효한 스캔 컨텍스트를 반환한 경우에만 호출되었다.
예를 들어, 요청 프로세스가 앞서 언급한 스캔 생성 함수를 호출하여 이전에 생성된 유효한 컨텍스트 ID를 제공한 경우에만 호출된다.
요청 프로그램은 그림 8(그림 4, 233행)에 지정된 함수에 스캔 컨텍스트 ID를 제공하여 권한 있는 파일에 대한 핸들을 성공적으로 열었다.

그림 9: SAM 파일에 대한 파일 핸들 검색 성공
processhacker를 사용하여 요청 프로세스의 핸들을 확인함으로써 파일 핸들에 대한 액세스를 확인했다:

그림 10: SAM 파일에 대한 핸들을 보유한 프로세스

그림 11: 획득한 핸들에 부여된 읽기 액세스
지원되는 함수를 추가로 탐색한 결과, 코드 실행을 달성하는 데 활용될 수 있는 세 개의 레지스트리 키를 제어할 수 있는 것으로 나타났다.

그림 12: 레지스트리 키에 대한 핸들 열기를 지원하는 함수

그림 13: 프로세스에 주입할 hook 모니터 dll을 지정하는 레지스트리 키 열기

그림 14: 사용자 제어 데이터로 레지스트리 키를 수정할 수 있음을 보여주는 OpenKey 함수
Acronis 제품군의 후킹을 위한 dll 주입이 발생하는 상황은 확인되지 않았지만, hook 모니터링이 활성화된 경우 x64HookLib 및 x86HookLib 레지스트리 키에 지정된 dll이 지정된 프로세스에 주입될 것으로 추정된다.

그림 15: 후킹 dll C:\ProgramData\Acronis\NGMP\shared\acr_protect.x64.dll을 지정하는 x64HookLibKey
임의 파일 읽기 분석에서는 스캔 컨텍스트를 여는 과정이 생략되었다.
프로세스는 스캔 컨텍스트를 생성하는 대신 GetScanContextByID 함수에 요청을 반복적으로 보내 ContextID 값을 반복하면서 하나 이상의 유효한 스캔 컨텍스트를 찾을 때까지 스캔 컨텍스트 ID를 무차별 대입할 수 있다.