[Digital Forensic] NTFS 파일 시스템 (3)

 

NTFS 파일 시스템


(14) 사용자 편의 기능

14-1. 디스크 할당

  • 이 기능은 사용자별로 사용할 수 있는 공간을 할당하는 기능으로, 할당 정보의 일부는 파일 시스템 메타데이터 파일로 저장

  • NTFS 3.0 버전을 전후로 3.0 이전 버전에서는 MFT 열 번째 엔트리인 \$Quota에 저장

  • 이후 버전에서는 \$Extend 디렉토리에 존재하였으며, MFT 엔트리는 어떠한 것도 할당 가능

  • 3.0 이전 버전에서 할당 정보 저장을 위해 사용되는 \$Quota 파일은 할당 정보 관리를 위해 두 개의 인덱스를 사용

  • $O라는 인덱스가 첫 번째 인덱스인데, 해당 인덱스는 $SID와 소유자 ID를 연관시키는데 사용

  • 여기서 SID는 앞에서 알아보았던 Security ID가 아님

 

또 $Q라는 인덱스가 있는데 이 인덱스 소유자 ID와 사용자에게 할당된 바이트 크기, 할당 허용 용량 등의 내용을 관리하는데 사용된다.

 

할당 정보는 포렌식적으로 의미가 크며, 할당 정보를 통해 어떤 사용자가 어떤 큰 데이터를 가지고 있었는지 판별 가능하기 때문이다.

 

하지만 할당 정보의 업데이트는 운영체제 입장에서 부가적인 사항이라 업데이트가 주기적으로 되지 않는다.

 

그리고 이러한 정보들은 꼭 할당 정보를 통해서만 얻을 수 있는 것은 아니며, $STANDARD_INFORMATION 속성을 통해서도 이러한 정보를 얻을 수 있다.

 

디스크 할당 기능은 기본적으로 비활성화 상태이다.

 

 

14-2. 저널링

  • 해당 기능은 NTFS만의 고유한 기능이 아닌 다른 파일 시스템에도 존재하는 기능

  • 저널링의 목적은 신뢰성으로, 파일 시스템을 원래 상태로 되돌리기 위해 사용

  • MS에서는 NTFS의 저널링 기술을 로깅이라고 함

  • NTFS 저널링 로그는 MFT 세 번째 엔트리인 $LogFile이라는 파일에 저장

  • 로그 파일의 크기는 파일 시스템 전체 크기의 1~2%

  • 이 파일에는 별다른 속성은 존재하지 않으며, 로그 내용은 $DATA 속성에 저장

 

윈도우는 저널에 할당할 수 있는 최대 크기가 있는데 해당 크기를 저널이 모두 사용하면 저널 파일은 sparse 파일로 변경되고 변경된 파일 마지막에 계속해서 데이터를 추가한다.

 

파일 마지막에 새로운 클러스터를 추가할 때는 첫 번째 클러스터는 제거하고 sparse 파일로 변경한다.

 

 

$LogFile $DATA에 대한 속성 내용은 다음 그림과 같다.

 

[그림 1] $LogFile $DATA 속성 내용

 

[그림 1] 을 보면 재시작 영역과 로깅 영역 두 영역으로 $DATA 속성이 나누어져 있다.

 

 

재시작 영역

  • 운영체제가 어떠한 파일 시스템의 정리를 수행할 경우 어떠한 트랜잭션을 참고해야 하는지 판단하는데 도움을 주는 구조체

  • 성공적인 마지막 트랜잭션을 위한 어떤 로깅 영역을 가리키는 포인터를 포함

 

로깅 영역

  • 연속적인 레코드의 집합

  • 각 레코드는 LSN(Logical Sequence Number)이라는 64bit의 값을 가짐

  • 레코드에는 두 가지 유형이 있으며, 업데이트 레코드와 검사 지점 레코드가 있음

 

업데이트 레코드는 가장 흔히 볼 수 있는 레코드로 기본적으로 모든 레코드가 가지고 있는 LSN 값 외에 추가적인 주요 필드 두 가지를 갖는다.

 

주요 필드 두 가지는 다음과 같다.

 

  • redo 필드 : 어떤 동작이었는지에 대한 정보 저장

  • undo 필드 : 어떤 동작을 어떻게 원래대로 되돌리는지를 설명하는 정보 저장

 

위 필드들은 파일 시스템 트랜잭션이 수행되기 전에 생성되며, 파일 시스템 트랜잭션이 수행된 후 다른 업데이트 레코드를 생성하면 그 트랜잭션이 수행되었다는 것을 보여준다.

 

두 번째 유형인 검사 지점 레코드는 운영체제가 파일 시스템을 검증하려고 할 때 운영체제가 로그 파일의 여러 레코드들 중 어느 레코드에서 시작을 해야 하는지 알려준다.


(15) 변경 저널

  • NTFS 버전 3.0 이상에서만 존재하는 기능

  • 파일과 디렉토리들의 변경이 수행되는 것을 기록하는 기능이며, 그 기록은 파일로 저장

  • 해당 기능은 변경 사항을 목록화 해두어 기존에 변경 여부를 판단하려고 하였을 때 오래 걸리던 시간을 단축시켜 줌

  • 해당 기능은 응용 프로그램 수준에서 활성 상태를 변경할 수 있음

  • 기본적으로 해당 기능은 비활성화 상태

  • 해당 기능의 파일에는 64bit 값이 포함되어 있으며 저널이 활성화되거나 비활성화 되었던 시간을 해당 값으로 표현

 

해당 기능은 \Extend\UsrJrnl 파일을 사용하며, 이 파일은 $DATA 속성 두 가지를 가지고 있다.

 

하나는 $Max라는 이름의 $DATA 속성이며, 또 하나는 $J라는 이름의 $DATA 속성이다.

 

두 $DATA 속성은 레코드를 포함하고 있으며 각 레코드에는 파일 이름 변경 시간, 변경 타입이 저장된다.

 

각 레코드는 USN(Update Sequence Number)라는 이름의 64bit 값을 가지고 있다.

 

USN은 저널 내 바이트 오프셋에 해당하며, $STANDARD_INFORMATION 속성에 저장된다.

 

레코드의 크기는 파일 이름의 길이에 따라 다르다.


(16) 파일 생성 / 삭제

16-1. 파일 생성

NTFS의 기본 레이아웃은 파일이 할당될 dir 1 디렉토리가 이미 존재하며, 클러스터가 2048byte 크기이며, 할당할 파일(File.txt)의 크기는 4000byte이다.

 

  • 먼저 파일 시스템이 첫 번째 섹터를 읽고 부트 섹터의 클러스터 크기, MFT 시작 주소, MFT 엔트리들의 크기를 정함

  • 그 후 MFT 첫 번째 엔트리($MFT)를 참조하고 $MFT 파일의 $DATA 속성을 읽어 나머지 MFT 엔트리 레이아웃을 결정함

[그림 2] 파일 생성 과정 1번 과정

 

  • 파일 할당을 위하여 MFT 엔트리를 할당해야 하는데 파일 시스템은 이때 비할당 엔트리를 찾기 위해 $MFT 파일의 $BITMAP 속성을 참조하여 해석을 시도함

  • 해석이 끝나면 비할당 엔트리를 찾게 되는데 찾은 엔트리를 새로운 파일에 할당하고 $MFT 파일 해당 엔트리 비트맵을 1로 설정

[그림 3] 파일 생성 과정 2번 과정

 

  • 파일에 할당된 엔트리의 MFT 내부에서의 위치를 구한 후 파일에 할당한 엔트리가 예전에 다른 파일에 할당되었던 엔트리일 수 있으므로 엔트리를 초기화함

  • 초기화 후 속성들을 엔트리 내에 생성하고 시간 값은 현재 시간으로 업데이트함

[그림 4] 파일 생성 과정 3번 과정

 

  • 이번에는 파일에 클러스터를 할당하기 위해 MFT 일곱 번째 엔트리($BITMAP)을 해석하여 클러스터를 할당

  • 해당 시나리오에서 할당하려는 파일의 크기가 클러스터보다 크므로 2개의 클러스터가 필요하며, 연속적인 2개의 클러스터를 찾아 $DATA 속성에 할당

  • 그 후 $BITMAP 파일에서 해당 클러스터의 비트맵 값을 1로 설정하고, MFT 엔트리가 수정되어 파일 수정 시간이 업데이트 됨

[그림 5] 파일 생성 과정 4번 과정

 

  • 파일 이름 엔트리를 디렉토리 인덱스에 추가하기 위해 파일이 할당될 디렉토리를 MFT 여섯 번째 엔트리(.)를 참조하여 찾음

  • 그 후 파일 이름 엔트리를 디렉토리 인덱스에 추가하고 디렉토리에 접근하였으므로 마지막 접근 시간이 업데이트 됨

[그림 6] 파일 생성 과정 5번 과정

 

  • 찾은 dir 1의 엔트리인 MFT 엔트리 180에 새로운 인덱스 엔트리를 생성하여 File.txt에 할당

  • 이때 트리의 노드들은 재정렬 될 수 있음

  • 그 후 File.txt의 시간 값들이 업데이트 되고, 디렉토리의 타임스탬프들 또한 업데이트 됨

[그림 7] 파일 생성 과정 6번 과정

 

만약 NTFS 시스템에 디스크 할당이나, 저널링 기능이 활성화 되어 있다면 6번 과정이 끝나고 $Quota 파일이나 $UsrJrnl 파일 인덱스에 엔트리들이 생성 되었을 것이다.

 

 

16-2. 파일 삭제

 

삭제 시나리오의 NTFS 레이아웃은 생성 기본 레이아웃과 동일하다.

  • 생성 과정의 1번과 동일

  • dir1 디렉토리를 찾기 위해 MFT 여섯 번째 엔트리(.)를 참조하여 인덱스 조사 (이때 dir 디렉토리의 마지막 접근 시간이 업데이트)

  • dir 1 디렉토리를 찾은 후 dir1 디렉토리의 인덱스를 조사하여 File.txt를 찾음

  • dir1 디렉토리 인덱스에서 File.txt 엔트리를 제거하며, 이때 노드들은 재정렬 될 수도 있으며, 디렉토리의 시간 값은 업데이트 됨

 

파일 삭제 4번 과정의 그림은 다음과 같으며, 그림에는 표시되어 있지 않지만, dir1 디렉토리 $BITMAP 속성에 지워진 엔트리에 해당하는 비트가 1에서 0으로 변환된다.

 

[그림 8] 파일 삭제 4번 과정

 

  • $BITMAP 파일의 $DATA 속성에 File.txt에 해당하는 엔트리 비트를 1에서 0으로 설정하여 MFT 엔트리를 비할당 상태로 변경

[그림 9] 파일 삭제 5번 과정

 

  • 이제 마지막으로 File.txt 파일의 MFT 엔트리 $DATA 속성에 할당된 클러스터를 할당 해제하기 위하여 $BITMAP 파일의 해당 클러스터 비트를 1에서 0으로 변경

[그림 10] 파일 삭제 6번 과정

 

위 그림 6번에서 파일 이름이 지워지지 않은 것은 MFT 엔트리가 비 할당 상태일 뿐 속성 내용은 보존되어 있기 때문이고, 화살표들이 지워져 포인터까지 삭제되어 있는 것처럼 보이지만, 윈도우는 포인터를 삭제하지 않는다.

 

이미지는 할당 상태를 나타내기 위해 화살표를 지운 것뿐이다.


# Reference 

 

http://www.yes24.com/Product/Goods/8511539

+ Recent posts