Forensic/논문리뷰

[논문 리뷰] 손상된 ZIP 파일 복구 기법

Ron Weasley 2022. 6. 22. 22:14

이번에 리뷰해 볼 논문은 고려대학교 정보보호대학원에서 2017년에 투고된 손상된 ZIP 파일 복구 기법이라는 논문이다.

논문의 원본은 다음 링크로 가면 볼 수 있습니다.
https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART002276535

참고 : 센트럴 디렉터리(C/D), 로컬 파일(L/F), 엔드 오브 센트럴 디렉터리(EOCD)로 표현한다.

ABSTRACT

압축파일 형식으로 가장 많이 쓰이는 PKZIP 형식은 ZIP 파일뿐만 아니라 MS Office 파일과 안드로이드 스마트폰의 어플리 케이션 파일 등에서 사용되는 파일형식이다. 다양한 영역에서 널리 쓰이는 PKZIP 형식의 파일은 디지털 포렌식 관점에서 구조 분석이 필수적이고 파일이 손상된 경우 복구를 할 수 있어야 한다. 하지만 기존에 나온 연구 논문들은 ZIP 파일에서 사용하는 Deflate 압축 알고리즘이 적용된 데이터를 복구하거나 의미 있는 데이터를 추출해 내는 것에만 초점이 맞춰져 있다. 대부분의 데이터가 ZIP 파일의 압축된 데이터에 존재하지만 그 외의 영역에서도 포렌식적으로 의미 있는 데이터가 존재하기 때문에 정상적인 ZIP 파일 형태로 복구를 해야 하며, 본 논문에서는 손상된 ZIP 파일이 주어졌을 때 이를 정상적인 형태의 ZIP 파일로 복구하는 기법을 제시한다.

Deflate 압축 알고리즘 : zip, gzip 등에서 사용되는 "무손실 압축 알고리즘"
PKZIP 압축 파일 형식 : 파일을 압축했을 때, 시그니처가 PK로 시작되는 압축 파일

PKZIP Structure

1. 서론

디지털 기기의 사용이 보편화되고 데이터의 양이 방대해지면서 저장장치의 공간을 절약하기 위해 파일을 압축하여 사용하고 있다. 주로 사용되는 압축파일 형식으로는 PKWare에서 만든 PKZIP 형식이 있으며, 이 파일 형식은 ZIP 파일 뿐 아니라 안드로이드 스마트폰의 어플리케이션 파일인 APK, 자바 패키지 파일인 JAR등 다양한 파일을 생성하는데 사용된다.

또한, Microsoft Office에서 사용되는 OOXML(Office Open XML) 형식의 파일인 docx, pptx, xlsx에서도 사용되고 있다. 이렇게 PKZIP 형식은 다양한 영역에서 널리 쓰이고 있는 파일 형식이다.

디지털 포렌식 관점에서 볼 때 신뢰할 수 있는 디지털 증거를 수집하기 위해서는 PKZIP 형식과 같이 자주 사용되는 파일 형식에 대한 분석이 필수적이고 이를 바탕으로 손상된 파일을 복구할 수 있는 도구가 필요하다.

2. 관련 연구

일반적인 파일 손상의 정의는 손상되기 전 파일과 손상된 후 파일이 1bit라도 다를 경우를 의미한다. 손상된 파일이 주어진 경우 손상되기 전과 동일하게 복구하는 것은 일반적으로 불가능하며, 다른 논문에서는 손상된 파일에 대한 정의가 너무 광범위하다는 것과 손상된 파일을 손상되기 전과 완전히 동일하게 복구하는 것은 어렵다는 것에 착안하였다.

파일 손상에 대한 정의는 다음과 같다.
1. 파일 명세조건이 주어졌을 때, 파일이 적어도 하나의 파일 명세조건을 만족하지 않을 경우 손상된 파일이라 칭함.

파일 복구에 대한 정의는 다음과 같다.
1. 유효한 프로그램이 충돌이나 오류 없이 파일을 열어야 한다.
2. 파일이 원본 파일에 포함된 대부분의 정보를 포함해야 한다. ( ex : 메타데이터 )
3. 파일이 원본 파일에 포함되지 않은 정보를 거의 포함하지 않아야 한다.

Zip 파일의 필드 중에는 데이터가 변조되어도 파일의 동작과 디지털 포렌식 관점에서 의미 있는 데이터에 어떠한 영향을 주지 않는 필드가 존재한다. Central Directory File Header에 속하는 필드 중 압축 버전(Comp Version)이 변조 되었을 때, ZIP 파일은 어떠한 오류도 없이 압축 해제가 가능하고, 압축된 파일의 파일명과 같은 포렌식적으로 의미 있는 데이터를 얻을 수 있다.


손상된 데이터는 원본 데이터를 가지고 있지 않다면 원본과 동일하게 복구하는 것은 당연히 불가능하다. 하지만 손상된 ZIP 파일을 명세조건에 맞게 필드 값을 재구성하여 압축 전 데이터와 압축된 파일의 파일명과 같은 메타데이터의 일부라도 얻을 수 있다면, 포렌식적으로 의미가 있는 복구이며 위에 정의한 내용을 바탕으로 ZIP 파일 복구 방안을 제시한다.

ZIP 파일은 저장된 데이터의 종류에 따라 메타데이터와 압축된 데이터로 구분할 수 있다. 메타데이터는 로컬 파일의 헤더, 센트럴 디렉터리 파일 헤더, 엔드 오브 센트럴 디렉터리에 저장하며, 로컬 파일의 데이터 영역에 ZIP 파일을 만들 때 사용된 파일들의 압축된 데이터를 저장한다.

압축된 데이터는 Deflate 압축 알고리즘을 이용하여 압축이 된다. Deflate를 구현한 것으로는 zlib 라이브러리가 있으며 Deflate로 압축된 데이터의 일부가 유실되거나 변조되었을 경우 남아있는 정상 데이터를 이용하여 압축되기 전 데이터 일부를 복구해내는 방법에 대해 연구를 진행한 결과, Bora Park는 미할당 영역에서 Deflate로 압축된 데이터를 식별하고 압축 해제하여 압축되기 전 데이터를 추출해 내는 방법에 대해 연구를 하였다.

기존 연구들은 ZIP 파일의 메타데이터와 압축된 데이터 중 압축된 데이터의 일부가 변조되거나 유실되었을 때 복구하거나 일부 유의미한 데이터를 추출하는데 중점을 두고 연구를 진행하였고, 한계점은 일부가 손상된 압축 데이터를 복구하거나 추출하기 위해선 특정 조건을 만족해야만 한다. 특정 조건을 만족하지 않으면 압축된 데이터가 손상된 ZIP 파일에서 어떠한 정보를 얻을 수 없다.

예로 기밀자료가 포함된 폴더를 ZIP 파일 형태로 압축하여 유출한 뒤 압축 파일의 압축데이터 영역에 데이터 유실이나 변조가 일어났을 경우 기존 연구방법으로는 유출에 대한 어떠한 흔적도 얻을 수 없다. 하지만 ZIP 파일 형태로 복구를 하여 메타데이터에 저장되어 있는 파일명과 폴더 구조를 확인할 경우 파일이 유출되었다는 사실을 추론할 수 있다. 복구를 하기 위해 무료 프리웨어 도구 zpi2fix와 zip_repair 같은 도구로 손상된 ZIP 파일을 정상적인 ZIP 파일 형태로 복구를 해주지만 복구가 가능한 파일임에도 불구하고 복구가 되지 않은 문제점이 있다.

3. ZIP 파일 구조

손상된 ZIP 파일을 정상적인 ZIP 파일 형태로 복구하기 위해선 ZIP 파일의 구조와 각 필드가 의미하는 값이 무엇인지 알아야한다. ZIP 파일은 크게 Local File(LF) 영역, Central Directory File Header(CDFH) 영역이다. 이 두 영역을 제외한 End of Central Directory도 존재한다.

3.1 Local File Area Structure

Local File Area Structure Layout

Local File 영역은 1개 이상의 포컬 파일로 구성되며 로컬 파일의 개수는 ZIP 파일을 만들 때 사용된 파일의 개수에 의해 결정된다. Local File은 압축된 파일의 압축 정보와 같은 메타데이터를 저장하고 있는 헤더 영역과 Deflate 압축 알고리즘으로 압축된 데이터를 저장하고 있는 데이터 영역으로 구분되는데, 로컬 파일의 헤더 영역의 경우 시그니처(Signature)부터 추가 설명 길이(Extra Length)까지는 0x1E의 고정된 크기를 가지고 이름(Name)과 추가설명(Extra) 가변적인 길이를 갖는다.

Local File의 데이터 영역의 경우 헤더 바로 뒤에 이어서 나오는 영역으로 압축된 데이터가 들어있다. 압축된 데이터는 4GB 미만의 가변크기로 저장되며, 복구할 때 중요한 필드는 7개가 있다.

3.2 Central Directory Area Structure

Central Directory Area Structure Layout

센트럴 디렉터리 영역(CD)은 로컬 파일 영역의 뒤에 위치하며 로컬 파일의 개수와 동일한 개수의 센트럴 디렉터리 파일 헤더와 1개의 엔드 오브 센트럴 디렉터리(EOCD)로 구성되어 있다. 센트릴 디렉터리 파일 헤더들은 로컬 파일들과 1대1로 쌍을 이루고 있으며, 각 내부에는 쌍을 이루는 로컬 파일의 위치와 로컬 파일이 저장하고 있는 메타데이터를 포함한 정보를 저장하고 있다.

센트럴 디렉터리 파일 헤더는 시그니처부터 상대 로컬 파일 주소까지 0x2E의 고정된 크기를 가지고 그 뒤 가변적인 길이의 이름과 추가설명, 주석을 갖는다. ZIP파일의 가장 마지막에 위치한 엔드 오브 센트럴 디렉터리에는 압축된 파일의 수, 센트럴 디렉터리 영역의 시작 위치 등 ZIP 파일의 메타데이터를 저장하고 있다. 이 영역은 시그니처부터 주석 길이까지 0x16의 코정된 크기를 가지고 있으며, 뒤는 가변의 크기인 주석으로 구성 되어있다.

센트럴 디렉터리 파일 헤더를 복구하는 과정에서 중요한 필드가 7개 있다.

마지막으로 엔드 오브 센트럴 디렉터리를 복구하는 과정에서는 위 2개의 파일과는 달리 3개의 필드가 중요하다.

4. 손상된 ZIP 파일의 복구 방안

대부분의 손상된 ZIP 파일은 미할당 영역에서 카빙을 진행하면서 발견된다. ZIP 파일을 카빙해주는 상용도구의 경우 파일의 시작 위치를 찾아 카빙을 진행하기 때문에 ZIP 파일의 시작부분부터 복원이 된다. 하지만 ZIP 파일이 단편화 되거나 유실된 상태로 미할당 영역에 존재할 경우 파일의 일부가 존재하지 않은 형태로 복원이 되거나 더미 값으로 채워져 복원이 된다. 이 경우 ZIP 파일은 파일의 뒷부분이 손상된 형태로 복원된다.

ZIP 파일 손상이 발생할 수 있는 다른 경우는 삭제된 ZIP 파일을 복원할 때 발생할 수 있는데, 메타데이터는 남아있지만 실제 데이터 영역의 일부가 다른 데이터로 덮어써졌을 경우 ZIP 파일의 앞부분 일부나 뒷부분 일부가 손상된 형태로 복원이 된다.

손상된 ZIP 파일 유형은 4가지로 나뉘어진다.

1. 로컬 파일 영역 일부부터 손상된 ZIP 파일
2. 센트럴 디렉터리 영역 일부부터 손상된 ZIP 파일
3. 로컬 파일 영역 일부까지만 손상된 ZIP 파일
4. 센트럴 디렉터리 영역 일부까지만 손상된 ZIP 파일

4.1 로컬 파일 영역 일부부터 손상된 ZIP 파일 복구

Case 1번은 파일의 시작부터 포컬 파일 영역 일부까지는 조금 남아있으나, 나머지 부분이 유실되거나 변조 되었다. 이런 형태의 손상된 파일을 복구하는 방법은 다음과 같이 나뉜다.

1. 파일의 시작위치를 찾는다.
2. 파일의 시작위치부터 로컬 파일 단위로 건너뛰면서 손상되지 않은 로컬 파일들을 찾는다.
3. 손상되지 않은 로컬 파일들을 이용하여 센트럴 디렉터리 일부를 재구성한다.
4. 3번째 단계의 결과물을 이용하여 엔드 오브 센트럴 디렉터리를 재구성한다.


4단계로 구성된 Case1을 살펴보면, 로컬 파일 영역의 일부부터 파일 끝까지 손상된 파일을 복구하는 것이기 떄문에 손상되기 전 ZIP파일과 동일한 상태로 압축데이터를 복구하는 것은 불가능하다. 하지만 정상적인 ZIP 파일 형식으로 복구하여 압축된 데이터와 메타데이터의 일부를 얻는 것은 가능하다. 손상이 시작된 부분이 로컬 파일의 메타데이터인지 압축된 데이터인지에 따라 3번째 복구 단계의 세부과정이 나누어진다.

만약 메타데이터에서 손상이 시작되었으면 로컬 파일은 복구가 어렵기 때문에 ZIP파일을 복구 하지않는다. 반면 압축된 데이터에서 손상이 시작되었을 경우 로컬 파일의 메타데이터를 손상된 압축데이터를 참고하여 재구성함으로써 파일 복구를 진행 하여도된다.

남아있는 정상 로컬 파일들을 이용하여 C/D 파일 헤더를 재구성할 때 주의해야하는 사항이 존재한다.

첫번째는 로컬 파일과 C/D 파일 헤더에는 동일한 필드가 존재하며, 동일한 필드에는 동일한 값이 들어 가야한다. 동일한 필드는 File Modification time(파일 수정 시간), date(날짜), Compressed Size(압축 데이터 크기), Uncompressed size(원본 데이터 크기)가 존재한다.

샘플 파일을 본 결과 데이터가 동일한 것을 알 수 있다.

두번째는 센트럴 디렉터리 파일 헤더에는 센트럴 디렉터리 시작 위치라는 필드가 존재하는데, 이곳의 값은 재구성된 ZIP 파일에 맞게 구성해야 된다는 것이다. 센트럴 디렉터리 시작 위치라는 필드는 쌍을 이루는 로컬 파일의 시작 위치를 저장하는 필드인데, 잘못된 값이 들어있을 경우 정상적인 형태의 ZIP 파일로 복구가 되지 않는다.

샘플 파일을 보면 로컬 파일의 시작 위치는 00으로 0x00000000의 값을 가진것을 알 수 있고, C/D의 시작 위치는 Offset 2A니까 0x0000002A의 값을 가지고 있음을 알 수 있다.

세번째 복구단계에서 복구된 포컬 파일들과 센트럴 디렉터리 파일 헤더들을 이용하여 엔드 오브 센트럴 디렉터리를 복구할 때에는 3가지 주요 필드를 주의하여 복구해야 한다. 주요 필드는 시그니처, 센트럴 디렉터리 크기, 센트럴 디렉터리 시작 위치가 있다.

이 영역이 센트럴 디렉터리의 크기입니다. 0x00000059로 총 89바이트를 가지고 있습니다.

4.2 센트럴 디렉터리 영역 일부부터 손상된 ZIP 파일 복구

Case 2번은 파일의 시작부터 센트럴 디렉터리 영역 일부까지는 남아있고 나머지 부분이 유실되거나 변조된 것을 의미한다. 이런 형태의 손상된 파일을 복구하는 방법은 다음과 같이 나뉜다.

1. 파일의 시작위치를 찾는다.
2. 파일의 시작위치부터 로컬 파일 단위로 건너뛰면서 센트럴 디렉터리 영역의 시작위치를 찾는다.
3. 센트럴 디렉터리 영역의 시작위치부터 센트럴 디렉터리 파일 헤더 단위로 건너뛰면서 손상되지 않은 센트럴 디렉터리 파일 헤더를 찾는다.
4. 로컬 파일을 이용하여 손상된 센트럴 디렉터리 파일 헤더를 재구성한다.
5. 4번째 단계의 결과물을 이용하여 엔드 오브 센트럴 디렉터리를 재구성한다.


Case 2번의 경우 로컬 파일 영역이 모두 정상적으로 존재하기 때문에 손상되기 전 ZIP 파일과 동일한 상태로 압축 데이터를 복구하는 것이 가능하다. 복구하는 과정에서 4, 5번 복구단계는 Case 1번이랑 동일하기에 복구가 가능하다.

4.3 로컬 파일 영역 일부까지만 손상된 ZIP 파일 복구

Case 3번의 경우 파일의 앞부분이 손상되고 로컬 파일 영역의 일부부터 남아있는 것을 의미한다. 이러한 형태의 손상된 파일을 복구하는 방법은 다음과 같다.

1. 엔드 오브 센트럴 디렉터리의 시작 위치를 찾는다.
2. 엔드 오브 센트럴 디렉터리의 메타데이터를 이용하여 센트럴 디렉터리 영역의 시작 위치를 찾는다.
3. 센트럴 디렉터리 파일 헤더마다 쌍을 이루는 로컬 파일이 남아있는지 확인한다.
4. 센트럴 디렉터리 파일 헤더를 이용하여 손상된 로컬 파일을 재구성한다.


Case 3번의 경우 파일 시작부터 로컬 파일의 일부가 손상된 것을 복구하는 것이기 때문에 손상되기 전 ZIP 파일과 동일한 상태로 압축데이터를 복구하는 것은 불가능하다. 하지만 정상적인 ZIP 파일 형식으로 복구하는 것은 가능하다. Case 3번은 앞선 두 유형과 다르게 ZIP 파일의 마지막에 위치한 EOCD를 먼저 찾는다.

그 이유는 센트럴 디렉터리 영역에는 ZIP 파일의 메타데이터가 저장되어 있는데 EOCD에는 C/D 시작 위치가 저장되어 있기 때문이다. EOCD를 이용하여 C/D의 시작 위치를 찾고 각 C/D 파일 헤더별로 이루는 로컬 파일이 존재하는지 확인한다. 확인을 마쳤으면 손상 유무를 판단할 수 있고 손상되지 않은 데이터를 이용하여 손상된 로컬 파일을 재구성한다.

C/D 파일 헤더를 이용하여 손상된 로컬 파일을 재구성할 때에는 주의해야할 점이 있는데, C/D 영역에는 압축된 파일이 저장되어 있지 않기 때문에 로컬 파일의 압축 데이터가 손상될 경우 복구할 수 없다. 따라서 L/F를 재구성할 때 압축데이터가 없는 상태로 재구성해야 하며, 재구성을 위해서는 다음과 같은 값을 넣어줘야 한다.

4.4 센트럴 디렉터리 영역 일부까지만 손상된 ZIP 파일 복구

Case 4번의 경우 파일의 앞부분이 손상되고 센트럴 디렉터리 영역의 일부부터 남아있는 것을 의미한다. 이러한 형태의 손상된 파일은 압축된 데이터가 전혀 남아 있지 않기 때문에 정상적인 ZIP 파일 형태로 복구하는 것은 비효율적이다.

1. EOCD 시작 위치를 찾는다.
2. EOCD의 메타데이터를 이용하여 손상되기 전 C/D의 시작위치를 찾는다.
3. 손상되기 전 C/D의 시작위치부터 EOCD 사이에 존재하는 C/D 파일 헤더의 개수를 파악한다.
4. 손상되지 않은 C/D를 이용하여 메타데이터를 추출한다.

Case 4번의 경우 로컬 파일 영역이 존재하지 않기 때문에 압축된 데이터를 전혀 복구할 수 없다. 이 경우 남아있는 데이터를 이용하여 정상적인 ZIP 파일로 복구하는 것보다 단순히 남아있는 데이터 중 메타데이터만 추출하는 것이 효율적이다. 추출된 메타데이터는 원본 파일의 ZIP 파일의 일부 메타데이터만 포함한다. Case 4번은 Case 3번과 동일하게 EOCD부터 복구를 진행하고, C/D 시작 위치를 찾는다. Case 4번은 C/D 영역의 앞부분도 손상이 되어 있는 유형이기에 C/D 영역의 시작 위치에 C/D 파일 헤더의 시그니처가 존재하지 않는다. 그래서 C/D 구조를 따라 바이트스캔을 통해 남아있는 C/D 파일 개수를 파악하고, 남아있는 C/D를 이용해서 메타데이터를 추출한다.

여기까지 4가지의 손상된 유형에 대해서 복구 방법을 알아봤는데, 자세한 ZIP 구조는 여기를 참고해주시길 바랍니다.
https://lemonpoo22.tistory.com/13

4.5 손상된 ZIP 파일 복구 알고리즘
4가지의 케이스에 맞게 손상된 ZIP 파일을 복구 하기 위해서는 가장 먼저 손상된 파일이 어떤 케이스에 속하는지 판단을 해야합니다. 이후 각 케이스 별로 복구 방법을 소개 시켜준대로 복구를 진행하면 됩니다. 따라 손상된 ZIP 파일을 가지고 있을 때, 복구하는 전체 알고리즘은 다음과 같습니다.

An Algorithm Of Recovery For Damaged ZIP Files

첫번째로 입력된 파일을 대상으로 바이트 스캔을 통해 로컬 파일과 센트럴 디렉터리의 개수를 파악하고, 두번째로 로컬 파일과 센트럴 디렉터리의 개수를 비교하여 Case 1/2, Case 3/4를 선택한다. 마지막으로 조건문을 통해 손상된 ZIP 파일이 몇번째 Case인지 파악하고 정상적으로 ZIP 파일을 복구한다.

5. 복구 기법이 적용된 도구와 기존도구 성능 비교 (추후 업데이트 예정)

위에서 기술한 손상된 ZIP 파일 복구 기법을 적용하여 개발한 도구는 볼 수 없었지만 기존 Zip2fix와 Zip_repair의 비교 결과는 다음과 같다. (추후 직접 개발할 예정 -> 개발 완료 후 업데이트 할 것)

이 표는 KDFS 2016의 1번 문제중 확장자가 ZIP인 200개의 파일이 있었는데, 200개의 샘플 중 정상적인 ZIP 파일로 복구된 파일의 개수를 정리한 표입니다.

5.1 ZIP 파일 카빙 결과물을 이용한 성능비교

두 번째 실험에서 사용된 손상된 ZIP 파일 샘플로는 기밀유출 사건의 하드디스크 이미지에서 미할당 영역을 추출하여 카빙한 결과물을 사용하였다. 카빙 결과물로 156개의 ZIP 파일이 생성되었다. 그 중 정상적인 ZIP 파일 44개를 제외한 112개의 손상된 ZIP 파일을 이용하여 성능 비교를 진행하였다.

위 표에서 알 수 있듯이 두 개의 프리웨어(Zip2fix, Zip_repair)에서는 손상된 ZIP 파일을 전혀 복구하지 못하였다.

6. 결론 및 향후 계획

PKZIP 형식의 파일은 ZIP 파일을 포함하여 다양한 확장자에서 쓰이고 있다. 디지털 포렌식 관점에서 볼 때, PKZIP 형식과 같이 널리 사용되는 파일 형식은 파일 구조를 분석하는 것이 필수적이며 이를 바탕으로 손상된 파일들을 복구하는 기법이 필요하다.

ZIP 파일의 압축된 데이터가 손상되었을 경우 손상된 압축데이터에서 의미있는 데이터를 추출하거나 복원하는 것에 초점이 맞춰져 있었으나, ZIP 파일은 메타데이터에도 포렌식적으로 의미 있는 데이터가 존재할 수 있기 때문에 ZIP 파일 형태로 복구를 진행 해야한다.

이처럼 ZIP 파일을 복구하는 툴을 위 알고리즘을 통해 직접 개발하였을 때의 성능과 프리웨어의 성능을 비교해볼 때, 직접 개발한 프로그램이 성능면에서 뛰어났으며, 향후 도구의 구현상의 문제로 일부 복구 가능한 파일을 복구하지 못한 경우도 존재하여 문제점을 파악하여 개선한 후 오픈소스로 공개할 예정이며, 손상된 ZIP 파일을 복구하는 연구를 계속 진행할 것을 목표로 한다.