HFS+ 파일 시스템 포맷 및 OS X 설치 시간 알아보기

사용자가 고의로 OS X 파일 시스템인 HFS+ 디스크를 포맷하거나, OS X를 설치한 시간을 알아봐야할 경우가 있다. 두 이벤트는 동시에 일어나거나 별도로 일어날 수 있는데 다음과 같은 행동을 했을 경우로 볼 수 있다.

이에 두 가지 상황을 분리하여 분석한다면, 사용자가 별도로 진행했는지 하나의 프로세스로 진행했는지 파악할 수 있다.

디스크 포맷 시간

디스크 포맷 시간을 판단하기 가장 좋은 요소는 HFS+ 파일 시스템의 볼륨 헤더에 있다. 볼륨 헤더는 파일 시스템 구성 시점에 파일 시스템 전체를 관리하기 위한 메타데이터를 저장하고 있는 공간으로 이 중, dateCreated 라는 요소는 볼륨의 생성 시간을 담당한다. 우선 볼륨을 확인하면 다음과 같다.

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *512.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         511.3 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Mac OS X               *510.9 GB   disk1

본 시스템은 FileVault2로 암호화되어 있기 때문에 실제 HFS+ 볼륨 정보는 /dev/disk1에 저장되어 있다. 해당 정보를 확인하면 다음과 같다.

/dev$ sudo xxd /dev/rdisk1 | more
...
0000400: 482b 0004 8000 2000 4846 534a 0000 0ee6  H+.... .HFSJ....
0000410: ce1b 1f3a d02b 3c6d 0000 0000 ce1b 81aa  ...:.+

타임스탬프 정보는 0x400을 기준으로 0x10에 위치하는 0xce1b1f3a(빅엔디안)가 된다.

$ python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwinType "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> time.gmtime(0xce1b1f3a) // Create Time
time.struct_time(tm_year=2079, tm_mon=7, tm_mday=29, tm_hour=19, tm_min=19, tm_sec=22, tm_wday=5, tm_yday=210, tm_isdst=0) // 2013년 7월 30일 4시 19일 22초
>>> time.gmtime(0xd02b3c6d) // Modified Time
time.struct_time(tm_year=2080, tm_mon=9, tm_mday=2, tm_hour=9, tm_min=20, tm_sec=45, tm_wday=0, tm_yday=246, tm_isdst=0) // 2014년 9월 2일 오후 6시 20분 45초
>>> time.gmtime(0xce1b81aa) // Disk Checking Time
time.struct_time(tm_year=2079, tm_mon=7, tm_mday=30, tm_hour=2, tm_min=19, tm_sec=22, tm_wday=6, tm_yday=211, tm_isdst=0) // 2013년 7월 30일 11시 19분 22초
>>>

HFS Plus Dates가 1904년 1월 1일 00시 기준이므로 유닉스 타임인 1970년 1월1일 00시와의 차이를 구하면 결과를 알 수 있다.

>>> 2013년 7월 29일 19시 19분 22초 UTC+0

사용자가 포맷을 수행하면, 디스크의 파티션 테이블을 재정의하고, 각 파티션의 파일 시스템을 초기화하는 작업을 수행하는데, 이 과정에서 HFS+ 파일 시스템의 볼륨이 새롭게 생성되므로, 볼륨 헤더의 dateCreated 요소는 사용자가 시스템을 포맷한 시간으로 볼 수 있다.
보통 안티포렌식에서 파일 시스템의 필드 정보를 수정하는 것은 리스크가 큰 작업인 만큼 많이 수행하지 않으므로, 이 과정으로 추출한 결과는 높은 신뢰성을 보장할 수 있다.

운영체제 설치 시간

운영체제 설치 시간을 확인할 수 있는 요소는 크게 2개가 있다. 첫 번째는 “/private/var/db/.AppleSetupDone”이라는 파일로 이 파일은 운영체제 설치 과정에서 Setup Assistant 프로세스 즉, 운영체제에 파일을 옮긴 후, 사용자 설정 시점에 생성된다. 즉, 파일의 생성 시간을 통해 운영체제 설치 시점을 알 수 있다. 운영체제 업그레이드 시에도 파일을 새롭게 생성하므로, 최초 운영체제 설치 및 업그레이드 시점을 파악할 수 있다.

/var/db$ stat -x .AppleSetupDone
   File: ".AppleSetupDone"  Size: 0
   FileType: Regular File  Mode: (0204/--w----r--)
   Uid: (    0/    root)  Gid: (    0/   wheel)Device: 1,4   Inode: 2064663    Links: 1
Access: Thu Jul 10 13:30:37 2014
Modify: Thu Oct 24 16:25:37 2013
Change: Thu Oct 24 16:25:37 2013

두 번째 요소는 “/private/var/log/install.log” 파일로 이 파일의 시간 정보를 통해 시스템의 설치 시간을 파악할 수 있다. 단, OS X가 업그레이드 된 경우에는 이전 기록이 삭제되기 때문에 운영체제 클린 설치 시점보다는 운영체제 최종 버전 설치 및 업그레이드 시점을 파악하는데 사용하는 것이 좋다.

/var/log$ cat install.log | more
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: @(#)PROGRAM:Install  PROJECT:Install-735
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: @(#)PROGRAM:IA  PROJECT:InstallAssistant-467.1
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Hardware: MacBookPro8,2 @ 2.20 GHz (x 8), 8192 MB RAM
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Running OS Build: Mac OS X 10.8.4 (12E55)
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: PATH=/usr/bin:/bin:/usr/sbin:/sbin
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: TMPDIR=/var/folders/zr/strlzp7s6mb_f8396y2mrmz40000gn/T/
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: SHELL=/bin/bash
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: HOME=/Users/chainbreaker
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: USER=chainbreakerOct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: LOGNAME=chainbreaker
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: SSH_AUTH_SOCK=/tmp/launch-Z5cK4j/Listeners
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: Apple_Ubiquity_Message=/tmp/launch-SkFla1/Apple_Ubiquity_Message
Oct 24 15:57:20 testmachine.local Install OS X Mavericks[11897]: Env: Apple_PubSub_Socket_Render=/tmp/launch-WwE5ia/Render

로그 파일에는 운영체제 설치 과정이 저장되어 있으므로 최초 설치 시점을 파악할 수 있다. 단, 위에 설명한대로 운영체제를 업그레이드하는 경우에 새로운 파일을 만드는 것으로 확인된만큼 다른 여러 정보와 조합하여 분석해야할 것이다.