본문 바로가기

[+] Forensic

File System - NTFS (11)

이번 글에서는 마지막 참조 모델인 응용 프로그램 참조 모델에 해당하는 NTFS 데이터를 알아 볼 것이다.

다른 파일시스템들과는 다르게 NTFS는 많은 응용프로그램 수준의 기능을 지원한다.

여기서 알아볼 기능들은 디스크 할당, 저널링, 변경 저널링 기능이다.

이러한 기능들은 파일시스템에서 필수적으로 필요한 기능들은 아니지만, 사용자의 편의성등을 위해 제공되는 기능들이다.

지금부터 하나씩 알아보도록 하자.

[디스크 할당]
이 기능은 사용자 별로 사용 할 수 있는 공간을 할당 하는 기능으로, 할당 정보의 일부는 파일시스템 메타데이터 파일로 저장되는데, NTFS 3.0 버전을 전후로 3.0 이전 버전에서는 MFT 열 번째 엔트리인 \$Quota에 저장되었고 이후 버전에서는 \$Extend 디렉토리에 존재하였다. MFT 엔트리는 어떠한 것도 할당 가능하다.
3.0 이전 버전에서 할당 정보 저장을 위해 사용되는 $Quota 파일은 할당 정보를 관리하기 위해 두 개의 인덱스를 사용한다.
$O라는 인덱스가 그 첫 번째 인덱스 인데, 해당 인덱스는 $SID와 소유자 ID를 연관시키는데 사용된다.

 * 참고 : SID는 앞 글에서 알아보았던 SID(Security ID)가 아니다.

또 $Q라는 인덱스가 있는데 이 인덱스 소유자 ID와 사용자에게 할당된 바이트 크기, 할당 허용 용량등의 내용을 관리하는데 사용된다.
할당 정보는 포렌식적으로 의미가 크다. 할당 정보를 통해 어떤 사용자가 어떤 큰 데이터를 가지고 있었는지 판별 할 수 있기 때문이다. 하지만 할당 정보의 업데이트는 운영체제 입장에서 부가적인 사항이라 업데이트가 주기적으로 되지 않는다.
하지만 이러한 정보들은 꼭 할당 정보를 통해서만 얻을 수 있는 것은 아니다.
$STANDARD_INFORMATION 속성을 통해서도 이러한 정보를 얻을 수 있다.

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


[저널링]
해당 기능은 NTFS만의 고유한 기능이 아닌 다른 파일시스템에도 존재하는 기능이다. 저널링의 목적은 신뢰성으로, 파일시스템을 원래상태로 되돌리기 위하여 사용한다.

 * 참고 : MS에서는 NTFS의 저널링 기술을 로깅이라고 부른다.

NTFS 저널링 로그는 MFT 세 번째 엔트리인 $LogFile 이라는 파일에 저장된다. 이 파일에는 별 다른 속성은 존재하지 않으며, 로그 내용은 $DATA 속성에 저장된다.

 * 참고 : 로그파일의 크기는 파일시스템 전체 크기의 1~2%이다.

로그 내용을 저장하는 $DATA 속성의 내용은 아래와 같다.

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

위 이미지에서 보다시피 재시작 영역과 로깅 영역 두 영역으로 $DATA 속성이 나눠져 있는데, 재시작 영역은 운영체제가 어떠한 파일시스템의 정리를 수행 할 경우 어떠한 트랜잭션을 참고해야 하는지 판단하는데 도움을 주는 구조체이며, 성공적인 마지막 트랜잭션을 위한 어떤 로깅 영역을 가리키는 포인터를 포함한다.
로깅 영역은 연속적인 레코드의 집합이며, 각 레코드는 LSN(Logical Sequence Number) 이라는 64bit의 값을 가지고 있다.
레코드에는 두가지 유형이 있는데 그 유형은 업데이트 레코드와 검사 지점 레코드이다.
업데이트 레코드는 가장 흔히 볼 수 있는 레코드로 기본적으로 모든 레코드가 가지고 있는 LSN 값 말고 추가적인 주요 필드 두가지를 갖는다. 그 필드는 아래에 간략하게 정리 해 두었다. 

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


위 필드는 파일시스템 트랜잭션이 수행되기 전에 생성되며, 파일시스템 트랜잭션이 수행 된 후 다른 업데이트 레코드를 생성하면 그 트랜잭션이 수행되었다는 것을 보여준다.
두 번째 유형인 검사 지점 레코드는 운영체제가 파일시스템을 검증하려고 할 때 운영체제가 로그 파일의 여러 레코드들 중 어느 레코드에서 시작을 해야 하는지 알려준다.


[변경 저널]
변경 저널은 NTFS 버전 3.0 이상에서만 존재하는 기능으로 파일과 디렉토리들의 변경이 수행되는 것을 기록하는 기능이다.
기록은 파일로 저장된다. 해당 기능은 변경 사항을 목록화 해두어 기존에 변경 여부를 판단하려고 하였을 때 오래 걸리던 시간을 단축시켜 준다. 해당 기능은 응용프로그램 수준에서 활성 상태를 변경 할 수 있다.

 * 참고 : 기본적으로 해당 기능은 비 활성화 상태이다.

해당 기능의 파일에는 64bit 값이 포함되어 있으며 저널이 활성화 되거나 비 활성화되었던 시간을 해당 값으로 표현한다.
해당 기능은 \Extend\UsrJrnl 파일을 사용하며, 이 파일은 $DATA 속성 두가지를 가지고 있다. 하나는 $Max 라는 이름의 $DATA 속성이며, 또 하나는 $J 라는 이름의 $DATA 속성이다.
두 $DATA 속성은 레코드를 포함하고 있으며 각 레코드에는 파일 이름 변경 시간, 변경 타입을 저장된다.
각 레코드는 USN(Update Sequence Number)라는 이름의 64bit 값을 가지고 있다. USN은 저널 내 바이트 오프셋에 해당하며, $STANDARD_INFORMATION 속성에 저장된다.

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

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

 * 참고 : USN은 파일 시작에서 바이트 오프셋에 해당 해 줄어들지 않고 계속 증가한다.

'[+] Forensic' 카테고리의 다른 글

File System - NTFS (13)  (0) 2012.02.15
File System - NTFS (12)  (0) 2012.02.14
File System - NTFS (10)  (0) 2012.02.13
File System - NTFS (9)  (0) 2012.02.10