2015 년 1 월 20 일 이후 Adobe Flash Player에 존재하는 심각한 제로 데이 취약점 이 확인되었습니다.Adobe는이 취약점에 대한 패치 를 주말부터 순차적으로 공개하고 자동 업데이트를 사용하고있는 사용자는 최신 버전 (16.0.0.296)에 업데이트 할 수 있습니다. 트렌드 마이크로는 분석을 통해 취약점을 안고 코드가 수정되어 있는지 확인합니다.
수동 업데이트의 최신 버전은 이번 주에 공개 될 예정입니다. Chrome 및 Internet Explorer (IE)의 새 버전을 지원하는 Flash Player의 최신 버전도 비슷한시기에 공개됩니다.
당사가 입수 한 검체를 분석 한 결과, 악성 Flash 파일 (확장자 SWF)에 포함 된 실제 Flash 파일을 확인했습니다. 이 실제 파일은 복잡한 난독 화되어있었습니다.
당사는 난독 화를 복호화 한 후이 취약점을 철저하게 분석하여 익스플로잇 코드가 어떻게 작동하는지 해명 할 수있었습니다. 자세한 들어가기 전에 재미있는 점을 하나 지적하고 싶습니다. 이 코드 조각의 일부는 취약점 ' CVE-2014-8439 '을 노리는 익스플로잇 코드와 유사했습니다. 즉, 동일인이 2 개의 익스플로잇 코드에 관계하고있을 가능성이 있습니다.
■ 이번 취약점의 근본 원인은 무엇인가
당사의 분석에 따라 이번 취약점은 "Use After Free (해방 후 사용)"취약점 인 것으로 밝혀졌습니다. 이번 사례에서는 domainMemory 의해 참조되는 메모리가 해제됩니다. 이 취약점은 메모리의 읽기 및 쓰기에 이용되고 공격자는이 기능을 이용하여 임의의 코드를 실행할 수 있습니다.
이번 취약점은 다음과 같이 사용됩니다.
- ByteArray를 신규로 생성하고 대량의 데이터를 기록합니다. 그런 다음 데이터를 압축한다.
- 압축 된 ByteArray의 데이터를 포지션 0x200에서 무시하고 ByteArray를 domainMemory로 설정
- ByteArray의 데이터를 압축한다. 2 단계에 따라 IOError 예외가 발생한다. 코드는이 예외를 catch하고 해방 된 메모리의 위치를 유지하기 위해 다른 ByteArray를 사용한다. 이 ByteArray는 0xBBBBBBBB에 저장되는
- ByteArray의 자리 표시 자 데이터 지우기
![그림 1 : "ByteArray"를 만드는 코드](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment01.jpg)
그림 1 : "ByteArray"를 만드는 코드
![그림 2 : "ByteArray"덮어 쓰기](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment02.jpg)
그림 2 : "ByteArray"덮어 쓰기
![그림 3 : IOError 및 예외 잡기](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment03.jpg)
그림 3 : IOError 및 예외 잡기
![그림 4 : 0xBBBBBBBB ByteArray 메모리를 해제](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment04.jpg)
그림 4 : 0xBBBBBBBB ByteArray 메모리를 해제
■ 왜 domainMemory는 압축 된 데이터 버퍼를 참조 할 것인가
"AvmPlus"프로젝트의 코드에 함수 ByteArray :: UncompressViaZlibVariant의 문제를 확인했습니다. 이 함수는 다음과 같이 설계되어 있습니다.
- 압축 된 데이터를 먼저 저장하기 위해 새로운 버퍼를 할당
- 압축에 성공하면 domainMemory 새로운 버퍼를 사용하도록 지시
- 압축에 실패했을 경우는 domainMemory이 버퍼를 사용하도록 지시하지 않고이 새로 생성 된 버퍼를 해방하는
이 운동은 제대로 보이지만, 압축 처리하여 새로운 버퍼에 할당이 증가합니다. 클래스 "Grower"는 버퍼의 동적 성장을 처리합니다. 이 성장이 완료되면 파괴 된 클래스 'Grower "이 domainMemory에 증가 된 버퍼를 사용하도록 지시합니다. 그 결과 domainMemory은 압축 과정 동안이 새로운 버퍼를 사용합니다. 실패하면 새로 생성 된 버퍼가 해제됩니다. 그러면 ByteArray :: UncompressViaZlibVariant : 원래 논리가 파괴됩니다. 비록 압축이 실패해도 domainMemory는 새로운 버퍼를 사용합니다.
이렇게하여 위의 단계가 실행 된 후 domainMemory는 0xBBBBBBBB을 포함 해방 된 메모리 공간을 말합니다. 익스플로잇 코드는 해제 된 메모리 공간의 읽기 및 쓰기를 수행하기 위해 본래의 명령을 사용할 수있게됩니다.
![그림 5 : 해제 된 메모리 공간을로드](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment05.jpg)
그림 5 : 해제 된 메모리 공간을로드
Adobe Flash에 존재하는 취약점을 이용한 최근의 공격처럼이 익스플로잇 코드는 메모리 배치를 제어 벡터를 해방 된 메모리의 옆에 배치합니다. 이렇게하면 벡터의 길이를 덮어 쓸 수있게 공격자가 임의로 메모리를 읽고 쓸 수 있습니다.
![그림 6 : 메모리 덮어 쓰기](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment06.jpg)
그림 6 : 메모리 덮어 쓰기
그림 7에서 보는 바와 같이, 압축 처리시 메모리 배치가 변경 벡터의 길이가 덮어 씁니다. "해방 후 사용"의 메모리 주소는 그림 7의 디버깅 환경에서 0x05120000입니다.
![그림 7 : 해동 후 메모리 배치 (헤더 데이터는 압축에 성공)](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment07.jpg)
그림 7 : 해동 후 메모리 배치 (헤더 데이터는 압축에 성공)
![그림 8 : 0xBBBBBBBB ByteArray가 할당 된 후 메모리 배치](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment08.jpg)
그림 8 : 0xBBBBBBBB ByteArray가 할당 된 후 메모리 배치
![그림 9 : 0xBBBBBBBB ByteArray가 할당 된 후 메모리 배치와 스프레이 된 벡터](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment09.jpg)
그림 9 : 0xBBBBBBBB ByteArray가 할당 된 후 메모리 배치와 스프레이 된 벡터
![그림 10 : 벡터의 길이를 덮어 쓴 후 메모리 배치](http://blog.trendmicro.co.jp/wp-content/uploads/2015/01/150126comment10.jpg)
그림 10 : 벡터의 길이를 덮어 쓴 후 메모리 배치
벡터의 길이를 0x40000000까지 덮어 쓰면이 검체의 코드는 어떤 메모리의 읽기 및 쓰기가 가능하게되었습니다. 이 기능은 공격이 임의의 코드를 실행하는 데 사용됩니다. 공격은 가짜 가상 함수의 호출을 시작하여 쉘 코드를 실행합니다.
'malware ' 카테고리의 다른 글
cve-2015-0016-escaping-the-internet-explorer-sandbox (0) | 2015.01.28 |
---|---|
독일 정부의 공식 Web 사이트에 대한 공격의 배후 하쿠티비스토 집단 "CyberBerkut"는 (0) | 2015.01.28 |
Analyzing CVE-2015-0311: Flash Zero Day Vulnerability (0) | 2015.01.27 |
Over a Decade and Still Running: Targeted Attack Tool Hides Windows Tasks (0) | 2015.01.27 |
Analysis of setting cookies for third party websites in different browsers (0) | 2015.01.26 |