Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Piki's Play

chapter 16. UFS1, UFS2 개념과 분석 본문

포렌식/파일시스템 (파일시스템 포렌식분석)

chapter 16. UFS1, UFS2 개념과 분석

Pikigod 2020. 4. 2. 21:29

-> UFS(Unix File System)는 다양한 종류가 있으며 FreeBSD, HP-UX, NetBSD, OpenBSD, 애플 OS X, Sun 솔라리스 같은 유닉스 시스템에서 사용하는 파일시스템이다. 많은 운영체제들이 자신들에게 맞게 지속적으로 데이터 구조체들을 수정했지만, 내부구조의 개념은 거의 동일하다. 현재 이 파일시스템은 UFS1과 UFS2 두 종류가 있고, UFS2는 대용량 디스크와 더 큰 시간스탬프를 지원한다. 하지만 이 책에서는 두 파일시스템을 UFS라는 용어로 통일해서 사용하겠다. 수사관들은 유닉스 서버를 조사할 때 UFS 파일 시스템을 분석할 수 있다. Ext2와 Ext3는 UFS를 기반으로 발전했으며, 그 이유에 대해서는 앞장에서 상세히 설명했다. 이 장은 "Ext2와 Ext3 개념과 분석"에 개념을 이해했다고 전제하고 간단히 설명한다. 이 장은 UFS 파일시스템의 개념과 분석기술들을 다루고, 17장 "UFS1과 UFS2의 데이터 구조"는 데이터 구조체를 다루도록 한다. 

 

 

16.1 소개

- UFS는 Berkeley FFS(Fast File System)과 관련이 있고, 빠르고 신뢰할 수 있도록 설계되었다. 중요 데이터 구조체들의 복사본은 파일시스템 전체에 저장되고, 파일의 데이터는 특정 위치에 밀집시켜 데이터를 읽을 때 하드디스크 헤드가 이동을 너무 많이 하지 않도록 했다. UFS는 실린더그룹(Cylinder Groups)이라는 구역들로 구성되고, 각 그룹의 크기는 하드디스크의 위치 정보를 기반으로 만들어진다. 이것들은 ExtX의 블록그룹과 유사하다.

- UFS에는 파일시스템 기본 레이아웃 정보를 포함하는 슈퍼 블록 데이터 구조체가 있고, 그 구조체는 파일시스템의 시작 부분에 위치한다. 파일내용은 연속적인 섹터그룹인 블록에 저장한다. 블록을 조각으로 나누기도하는데, 파일 마지막을 블록 전체에 할당하는 것 대신 더 작은 조각에 저장할 수 있다. 파일과 디렉토리의 메타데이터는 inode데이터 구조체에 저장된다. 디렉토리 엔트리 구조체 디렉토리에 할당된 블록에 위치하고, 파일명을 저장한다. 디렉토리 엔트리 구조체는 파일명과 파일 inode 데이터 엔트리의 포인터를 포함하고 있는 기본 데이터 구조체이다. 이 데이터 구조들 사이의 관계를 아래 그림에서 볼 수 있다. 각 실린더 그룹자신의 inode 테이블, 조각들의 할당상태를 나타내는 비트맵, 슈퍼블록의 사본을 포함한다. 

 

<UFS 디렉토리 엔트리들, inode, 데이터블록들 사이의 관계>

 

- UFS의 모든 종류는 위에서 설명한 기본 개념들을 갖고, 그 개념들은 ExtX에서 봤던것과 동일하다. UFS 기반 파일시스템들의 차이점이라면 각 데이터 구조체들을 구성하는 방법과, 추가 기능들에 차이가 있다. 디스크에 저장되어있는 데이터에 영향을 미치는 추가 기능들은 ExtX보다 더 적다.

- UFS1은 OpenBSD와 솔라리스의 기본 파일시스템이고, FreeBSD, NetBSD 또한 FreeBSD 5.0과 NetBSD 2.0 까지는 기본파일시스템으로 UFS1을 사용했다.

- 다음 절부터 5가지 범주의 데이터 모델로 UFS를 설명하겠다. 각 절은 각 범주의 기본 속성을 언급하고, 각 UFS 종류별로 차이점을 언급하겠다. 종류는 FreeBSD, NetBSD, OpenBSD와 같은 BSD 시스템들을 참고한다.

 


16.2 파일시스템 범주

- 파일시스템 범주는 파일시스템의 일반 레이아웃과 크기정보를 포함한다. 이 절은 UFS 데이터들이 어디에 위치하고 어떻게 분석해야 하는지 기술하겠다.

 

 개요

- UFS에는 세가지 타입의 데이터 구조체인 슈퍼블록, 실린더 그룹요약, 그룹 기술자가 있다. 슈퍼블록은 파일시스템의 시작 부분에 위치하고, 파일시스템 크기와 설정정보를 포함한다. 슈퍼블록은 실린더 그룹 사용에 개요를 제공하는 실린더 그룹 요약영역(Cylinder Group Summary Area)이라 불리는 파일시스템 영역을 참조한다. 각 실린더 그룹은 그룹에 상세한 내용을 제공하는 그룹 기술자 데이터 구조체를 갖는다.

 

 슈퍼블록

- UFS슈퍼블록은 각 조각의 크기와 블록 내에 몇개의 조각을 갖는지와 같은 기본 정보를 가지고있다. 또한 각 실린더 그룹 크기와 다양한 구조체들이 있는 각 그룹내부 위치도 포함한다. 이 값들로 파일시스템의 레이아웃을 결정할 수 있다. 또 파일시스템과 볼륨레이블의 마지막 마운트 시간 정보를 포함한다. 

- UFS 슈퍼블록은 파일시스템의 시작 어딘가에 위치해있다. 이동식 매체는 첫 섹터에서 시작한다. UFS1 슈퍼블록은 대체로 파일시스템 시작부터 8KB에 위치하고, UFS2 슈퍼블록은 시작에서 64KB 떨어진 곳에 위치한다. (가끔은 256KB에 존재하기도 함) 슈퍼블록의 복사본은 각 실린더 그룹에서 발견할 수 있다.

- UFS1과 UFS2는 약간 다른 데이터 구조체를 사용하지만, 둘 다 1KB이상이고, 필드는 거의 100개 정도가 있다.

UFS2는 UFS1과 다르게 크기와 날짜가 64비트이고 데이터 구조체 끝에 추가되었다. 사용하지 않는 32비트 부분은 무시되거나 재사용되지 않는다. 

- 슈퍼블록에서 실린더 그룹 요약 영역의 위치를 알 수 있고, 비사용 inode, 조각, 블록 전체 수 정보 또한 슈퍼블록에 저장된다. 각 실린더 그룹을 위한 엔트리 테이블을 포함하고, 그 엔트리는 비사용블록, 조각, inode를 기록한다.

- 슈퍼브록은 파일시스템을 효율적으로 구성하고 최적화 하기위해 디스크의 위치 정보를 포함한다.

 

실린더 그룹 기술자

- 앞서 언급한것처럼 파일시스템은 실린더 그룹들로 구성되어있다. 마지막 그룹을 제외하고 모두 같은 크기의 그룹이며, 거기에는 그룹들을 설명하는 그룹 기술자 데이터 구조체가 있다. 첫 그룹은 파일시스템 시작 부분에서 시작하고, 각 그룹의 조각들의 수는 슈퍼블록에서 주어진다. 그룹은 그룹 기술자외에 inode테이블과 슈퍼블록 백업본을 포함한다. 

- UFS 그룹기술자는 ExtX 그룹기술자보다 더 크다. 그룹 기술자는 전체블록에 할당되고, 표준 필드들을 갖고, 다양한 테이블에 사용될 수 있는 폭 넓게 공개된 영역의 조합을 갖는다. 표준 필드들은 블록이 어떻게 구성되었는지 알려주고, 할당된 블록, 조각, inode의 위치와 같은 정보를 갖는다. 이 정보들을 실린더 그룹 요약 영역의 값과 동일하다. 

- 그룹 기술자 후반부에는 그룹 내 inode, 블록, 조각의 비트맵이 있다. 이 데이터 구조체들의 각 시작위치는 그룹기술자 시작에서 상대적인 바이트 오프셋으로 주어지고, 데이터 크기는 계산될 수 있어야 한다. 아래 그림에서 그룹 기술자가 어떻게 구성되는지 보여주고, 그 특정 데이터 구조체와 레이아웃은 다음 장에서 제공한다. 

<표준 필드들을 지닌 그룹 기술자 레이아웃과 비트맵들, 공개된 다른 영역의 다른 테이블>

 

- ExtX의 그룹 기술자 테이블은 각 그룹에 두번째 블록에 위치했다. UFS에서는 그룹기술자, inode 테이블, 백업 슈퍼블록의 위치가 각 파일시스템에서 일정하고, 오프셋은 슈퍼블록에서 제공한다. 

- UFS1은 엇갈리게 배치하는데 오프셋들은 각 실린더 그룹을 위해 변경하는 기준 위치에서 상대적이기 때문이다. 만약 inode 테이블이 32조각의 오프셋을 갖는다면, 그룹 0의 시작에서 32조각들이 있고, 그룹1의 시작에선 64조각, 그룹2의 시작에선 96 조각들이 있게된다. 오래된 하드디스크들은 트랙 당 같은 개수의 섹터가 있으며, 모든 첫 섹터는 같은 플래터에 있음을 나타낸다. 위 처럼 엇갈리게 배치하여 슈퍼블록의 모든 복사본이 같은 플레터에 있는 것을 방지할 수 있다. 그러나 UFS2에서는 그러지 않다. 

- 각 그룹의 '기준' 위치는 슈퍼블록에 있는 두 값을 이용해 계산한다. 슈퍼블록은 사이클 값 C와 델타 d를 정의한다. 기준은 모든 그룹에서 d만큼 증가하고, C그룹들 다음 시작 부분에서 되돌아온다. 

 

아래 그림은 UFS1과 UFS2 파일시스템 예를 보여준다. UFS1파일 시스템은 사이클 3을 갖는 관리데이터이고, UFS2는 각 그룹에 일정한 오프셋에서 데이터를 갖는다. 

 

 

아래는 그룹의 예제 레이아웃을 보여준다. 기준 주소는 그룹 내 여러블록들 다음에 위치하고, 그룹, 슈퍼블록 백업본, 그룹기술자, inode 테이블이 모두 연속적인 순서로 배치된다. 

<UFS1 실린더 그룹의 예제 레이아웃>

 

-> 그룹 기술자에는 비트맵과 표준 데이터 구조체 필드들이 있다. 모든 다른 조각들은 파일과 디렉토리 내용에서 언급하겠다.

 

 

 부트코드

- UFS 파일시스템에 OS 커널이 있다면 부트코드는 파일시스템 첫 섹터에 위치하고, 그 다음 슈퍼블록이나 디스크 레이블 데이터 구조가 위치한다.

- BSD나 솔라리스 시스템들은 자신들의 분할 시스템들을 가지고있다. IA32(x86/i386) BSD 시스템은 한 개의 도스파티션과 한 개 이상의 BSD 파티션들을 갖는다. BSD 파티션의 위치는 도스파티션 섹터 1에 있는 디스크 레이블 구조체에서 정의하고 있다. 부트코드는 섹터 0에 위치하고, 그 후 섹터 2~15가 있다. UFS1 슈퍼블록은 섹터 16에 있고, UFS2 슈퍼블록은 섹터 128에 위치한다. UFS2 부트코드는 추가적인 섹터들에도 있을 수 있다. 

- i386 솔라리스 시스템은 두 개의 도스파티션이 있는 것과 비슷하다. 하나는 오직 부트코드만 있고, 크기는 매우 작다. 다른 하나는 파일시스템들을 포함하고, 섹터 0에 VTOC(Volume Table of Contents)라는 데이터가 있다.

스팍 솔라리스 시스템의 디스크는 섹터0에 VTOC를 갖고, 섹터 1~15까지 부트코드이다. 더 새로워진 스팍 솔라리스 시스템은 VTOC 대신 EFI 파티션 테이블을 사용한다.

- 부트코드가 없는 파일 시스템은 슈퍼블록 앞의 섹터들을 사용하지 않는다.

 

아래 그림에서 (A)는 IA32 FreeBSD 디스크 예를 보여주고, (B)는 스팍 솔라리스 디스크 예를 보여준다. (도저히 그릴 엄두가 나지 않는다.)

<3개의 도스파티션이 있고, FreeBSD 파티션 내부에 2개의 BSD 파티션이 있는 IA32 시스템 (A),

두개의 스팍 솔라리스 파티션이 있는 (B)>

 

▷ 예제이미지

- 이 절을 마무리하기 위해 TSK fsstat 도구를 이용해 UFS1 이미지를 분석한다. 이번 장부터 이 예제 이미지를 사용하고, 다음 장에서는 수동을 분석한다.

(fsstat은 모든 실린더 그룹을 나열하기 때문에 여기서 보여주기는 너무 커서 필요없는 부분은 생략했다.

 

-> 이 결과에서는 블록크기, 조각크기, inode 개수 같은 전반적인 정보를 보여준다. 또한 각 그룹에 어떤 조각들이 있는지, 어떤 자원들이 마지막으로 할당되었는지에 대한 각 실린더 그룹의 내역을 얻는다. 이 결과는 슈퍼블록, 실린더 그룹 요약 영역, 그룹기술자에 데이터들을 통합한다.

예를들어 블록 주소가 주어졌다면 어떤 그룹에 속하는지 결정할 수 있다. 이것은 각 그룹의 inode 테이블과 그룹 기술자가 어디에 위치하는지 구분할 수 있고, 각 그룹에서 다른 오프셋에 있는 UFS1에서 이것은 중요하다.

 

- 첫번째 그룹에 2개의 슈퍼블록이 있다는 것을 유념하자. 하나는 항상 섹터 16(2sector=1block)에 있는 슈퍼블록 원본이다. 두번째는 실린더 그룹 조각 16오프셋에 있는 백업본이다. (왜 그런지 생각해보자)

 

 

분석 기술들

- 파일시스템 범주의 분석은 앞으로의 분석을 위해 전체 파일 시스템 정보의 위치를 확인하고, 그것들을 처리하는 것이다. UFS 파일시스템에서 첫 단계는 슈퍼블록의 위치를 확인하는 것이다. 슈퍼블록 데이터를 이용해서 각 실린더 그룹과 데이터 블록 위치를 확인할 수 있다. 

- 그룹의 그룹 기술자 위치를 확인하기 위해 슈퍼블록에서 주어진 오프셋을 사용할 필요가있다. 이 오프셋을 그룹의 기준주소에 더한다. UFS2에서 기준주소는 그룹의 시작이지만, UFS1 실린더 그룹에서는 조금씩 차이를 둔다. 이는 슈퍼블록에 있는 델타와 사이클 값을 이용해서 계산할 수 있다.

- 마지막 데이터 구조체는 실린더 그룹 요약 영역에 위치한다. 그 주소는 슈퍼블록에서 주어지며, 각 실린더 그룹에 사용정보의 테이블을 포함한다. 

 

 

분석 고려사항들

- 파일시스템 범주에는 대체로 사고와 관련한 증거는 없다. 다만 사용하지 않는 공간을 찾고, 위치, 크기와 같은 정보를 얻는데 필요하다.

- 슈퍼블록, 그룹기술자, 실린더 그룹 요약에는 많은 정보가 있다. 슈퍼블록의 복사본들은 각 실린더 그룹에 있고, 데이터 구조체의 시그니처 값을 이용해 복사본들을 찾을 수 있다.