본문 바로가기

[+] Forensic

File System - Ext (4)

이번 글에서는 메타데이터 참조 모델에 해당하는 것을 알아 볼 것이다.

[Inode]
Ext 파일시스템의 메타데이터들은 모두 Inode에 저장이 된다. Ext 파일시스템에서 Inode는 모두 동일한 크기를 가지며, 슈퍼 블록에 정의되어 있다. Inode는 Inode Table이라는 집합체에 저장되어 있으며 이 테이블은 각 블록 그룹에 존재하며 크기는 슈퍼블록에 정의되어 있다. Inode 테이블의 위치는 그룹 기술자 테이블에서 정해준다.
보통 Inode의 1~10번은 예약되어 있고, 할당 된 상태이다. 슈퍼 블록은 이런 예약 Inode들을 제외한 첫 번째 Inode를 값으로 가지고 있다. 각 Inode 필드 중에는 고정된 번호를 가지는 필드가 있고 추가 정보로는 확장 속성과 간접 블록 포인터가 있다.
또 Inode의 할당 상태는 각 그룹에 존재하는 Inode 비트맵이 결정한다.
Inode에는 여러가지 정보가 있는데 이 정보들은 아래와 같이 설명 할 수 있다.

[소유권]
해당 정보는 사용자, 그룹 ID로 인해 저장 된다. 유닉스에서는 모든 사용자에게 ID를 할당 하고 사용자 ID를 사용자 이름으로 변화하는데 /etc/passwd 파일을 사용한다. Inode에 사용자 ID는 chown 등의 명령어를 통해 충분히 변경 가능하기 때문에 해당 사용자가 해당 파일을 생성 했다고 전적으로 신뢰하여서는 안된다.

 

[타임스탬프]
Inode는 일시적인 정보로 타임스탬프 값을 갖는다. 한가지 특이한 점은 기존의 타임 스탬프라고 하면 변경, 수정, 접근 시간이 있는데 Inode는 여기에 삭제 시간까지 포함한다. 타임스탬프 값은 1970년 1월1일 UTC를 시작으로 현재 시간까지 경과된 초를 값으로 갖는다. 하지만 타임스탬프 정보 또한 전적으로 신뢰하여서는 안된다. Touch 명령어로 수정이 가능하기 때문이다. 


[모드 필드]
모드 필드에는 파일 타입, 기본 허가권등의 값이 포함되어 있다. 유닉스에서는 모든 것이 파일로 취급되는데 그 취급되는 유형에는 무수히 많은 유형들이 있다. 파일 타입이란 이러한 유형들을 말하는 것이다. 기본 허가권은 우리가 흔히 알고 있는 퍼미션(Permission)에 해당하는 것으로, 이는 운영체제가 다루는 데이터가 아닌 사용자가 다루는 데이터이므로 부가 데이터에 속한다.
그리고 모드 필드는 파일이나 디렉토리가 갖는 특별한 속성을 포함하고 있다. "sticky bit" 라는 것인데 해당 속성이 파일이나 디렉토리에 설정되면 오직 소유주만이 파일이나 디렉토리의 내용을 지울 수 있다. 또 SUID, GUID 라고 하는 것도 있다. 이 둘 가지 속성은 권한이 없는 사용자가 특정 권한을 가지고 프로그램을 실행토록 하는 권한이다.


[링크 카운트]

링크 카운트 값은 inode를 가리키는 파일 이름의 개수를 뜻한다. 이 값은 기본적으로 0이다.


[블록 포인터]
Inode에는 파일에 할당 할 12개의 블록 주소가 저장되어 있는데 이것들을 직접 포인터라고 부른다. 하지만 요즘은 파일의 용량이 커져 12개의 블록가지고는 부족 할 때가 있다. 이럴 때 하나의 블록을 나머지 블록들의 주소를 저장할 공간으로 할당하여 해당 블록에 나머지 블록들의 주소를 저장한다. 이를 간접 포인터라고 부른다. 만약 간접 포인터를 사용하고도 블록이 더필요 하면 직접 포인터와 간접 포인터를 혼합한 이중 간접 포인터를 사용해야 한다. 또 더 많은 공간이 필요하다면 삼중 간접 포인터를 사용해야 한다. 이러한 개념들은 아래 그림으로 이해 할 수 있다.

[그림 1 - 직접 포인터]


[그림 2 - 단일 간접 포인터]

[그림 3 - 이중 간접 포인터]

[그림 4 - 삼중 간접 포인터]


파일을 강제로 특정 크기를 갖게 끔 생성하거나 블록의 내용이 모두 0일 때는 sparse 블록이라고 부르는데, sparse 블록에는 어떠한 데이터도 쓸 수 없다. sparse 블록이 블록 포인터에 포함될 경우 블록 주소가 0으로 표시 된다.


[할당 알고리즘]
Inode를 새로운 파일이나 디렉토리에 할당 할 경우 Inode가 디렉토리에 할당 되는 것이 아니라면 부모 디렉토리와 같은 블록 그룹에 Inode를 할당한다. 비 할당 Inode를 찾기 위한 정책으로는 "첫 번째 적용" 정책을 사용한다. 또 Inode를 디렉토리에 할당한다면 Inode를 가장 많이 사용하지 않는 그룹에 할당한다. 이로 인해 모든 그룹들이 Inode를 균등하게 사용하게 된다. Inode가 할당 되면 MAC Time 값은 현재 시간으로 설정되고 삭제 시간은 0으로 설정 된다. 또 Inode를 가리키는 파일 이름의 개수를 파악하는 링크 카운트 값은 현재 할당 될 파일 이름을 위해 1로 설정된다. 만약 디렉토리 라면 링크 카운트는 "." 때문에 링크 카운트 2 값을 가지게 된다. 만약 프로세스가 파일을 열고 있는데 파일이 삭제 되어 링크 카운트 값이 0이 된다면 그 파일은 고아 파일이 된다. 


[타임스탬프 업데이트]
Ext에는 4개의 시간 값이 있다고 앞에서 언급하였다. 각 시간 값이 언제 업데이트 되는지 알아보도록 하겠다.

 - 접근 시간 : 파일이나 디렉토리 내용을 읽을 때 업데이트되며, 또 복사, 새로운 볼륨으로 이동 할 때도 업데이트 된다.

 - 수정 시간 : 파일이나 디렉토리 내용이 변경 될 떄 업데이트 되며, 복사 할 때에도 결국 새로운 파일 내용을 생성 하는 경우가 되어 현재시간으로 업데이트 된다. 또 네트워크로 전송 할 때에도 네트워크에서 전송 받는 시스템의 현재 시간으로 업데이트 된다.

 - 변경 시간 : 파일이나 디렉토리의 메타데이터가 변경 될 때 업데이트 된다. 예를 들어 파일이나 디렉토리 생성, 퍼미션 변경, 소유권 변경 등의 정보가 변경 될 시 업데이트 된다.

 - 삭제 시간 : 파일이 삭제 될 때 업데이트 되며 이 시간 값은 inode가 새롭게 할당 되면 삭제 된다.


대부분의 지워진 파일들은 수정 시간, 변경 시간, 삭제 시간이 동일하다. 


[분석 시 주의 사항]
Inode에는 전적으로 신뢰하여서는 안되는 정보들이 있다. 타임스탬프 값의 경우 Touch 명령어로 수정 시간과 접근 시간을 설정 할 수 있기 때문에 신뢰하지 못하는 정보이며, 또 소유권 또한 Chown 등의 명령어로 변경이 가능하여 신뢰하여서는 안된다. 로그나 네트워크 패킷 등의 독립적인 정보를 찾아 해당 파일 시간의 신뢰성을 파악하는 것이 제일 좋은 방법이다.
블록 포인터도 주의 깊게 조사해 봐야 할 필요가 있다. 만약 삭제 된 파일에서 블록 포인터들이 영구 삭제 되지 않았다면 삭제된 파일을 복구 할 수 있을 수도 있다. 또 슈퍼블록에 고아 Inode가 있는지 확인해 봐야 한다. 파일을 열고 파일을 삭제 할 경우 링크 카운트는 0이 되어 고아 Inode가 되는데 이 때 커널은 슈퍼 블록에 해당 고아 Inode를 목록에 추가한다. 


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

File System - Ext (6)  (0) 2012.02.22
File System - Ext (5)  (0) 2012.02.22
File System - Ext (4)  (0) 2012.02.21
File System - Ext (3)  (0) 2012.02.21
File System - Ext (2)  (0) 2012.02.20