본문 바로가기

포너블 스터디

System Exploitation Fundamental (1)

 아래 내용은 dreamhack.io System Exploitation Fundamental를 정리 및 학습한 것.

1. 시스템 해킹 기초

 

 해킹의 종류에는 웹 사이트를 공격하는 웹 해킹이나, 컴퓨터와 컴퓨터가 연결되는 네트워크를 공격하는 네트워크 해킹, 프로그램의 약점을 공격하는 시스템 해킹 등이 있다. 공격자는 웹 사이트를 해킹해 타인의 계정 정보를 도용하거나 네트워크를 공격해 트래픽을 과부하 시켜 서비스를 다운시킬 수도 있고, 프로그램을 공격해 권한을 탈취할 수도 있다. System Exploitation Fundamental 강의에서는 시스템 해킹, 특히 소프트웨어 해킹에 대해 자세히 다룬다. 

 

1) 취약점이란?

 

취약점의 분류

 

 익스플로잇 : 악용이라는 뜻, 취약점을 이용해 공격자가 의도한 동작을 수행하게 하는 코드 혹은 이를 이용한 공격 행위를 의미

 

 소프트웨어 버그는 보안에 영향을 미치는 정도에 따라 크게 4가지로 분류할 수 있다.

먼저 프로그래머가 의도하지 않은 동작을 수행하는 소프트웨어 버그(Bug)가 가장 상위에 있다. 그러한 소프트웨어 버그 중 보안에 영향을 미칠 수 있는 버그를 소프트웨어 취약점(Vulnerability)이라 하고, 소프트웨어 취약점 중 이를 이용해 공격자가 의도한 동작을 수행할 수 있는 버그를 익스플로잇 가능한 취약점(Exploitable Vulnerability)이라고 한다. 그러나 익스플로잇이 가능하다고 해서 익스플로잇을 항상 안정적으로 성공할 수 있는 것은 아닙니다. 보안 취약점에서 익스플로잇 확률은 위험성을 평가하는 중요한 요소 중 하나인데, 이는 익스플로잇 확률이 높을수록 무기화되어 사용하기 유용하고, 공격이 탐지될 확률이 줄어들기 때문이다. 이렇게 익스플로잇이 가능한 취약점 중 매우 높은 확률로 공격에 성공할 수 있는 버그를 안정적으로 익스플로잇 가능한 취약점(Reliably Exploitable Vulnerability)이라고 한다.

 

Attack Vector

 

 모든 소프트웨어 취약점은 소프트웨어와 공격자가 상호 작용하는 곳, 즉 사용자의 입력에서부터 발생한다. 이렇게 공격자가 소프트웨어와 상호 작용할 수 있는 곳을 Attack Vector(공격 벡터)라 하며, 이러한 Attack Vector들의 집합을 Attack Surface라 한다.

 

 위 그림을 살펴보자. 공격자는 입력창을 통해 프로그램과 상호 작용할 수 있으며, 제목, 내용에 공격자의 입력을 넣을 수 있고 업로드 기능을 통해 이를 프로그램에 전달할 수 있다. 이러한 부분이 모두 attack vector이다. 그렇다면 프로그램에서 제목을 처리하는 코드는 안전하고, 내용을 처리하는 코드에서 보안 취약점이 발생하며, 업로드하는 과정에서도 별 문제가 없다고 가정해 보겠따. 이때 내용을 처리하는 코드는 공격자가 접근해 악용할 수 있기 때문에 보안 취약점이라고 할 수 있다.

 그렇다면 이번엔 프로그램의 unreachable code 영역에 심각한 보안 취약점이 있다고 가정해 보자. 만약 해당 코드가 어디에서도 사용되지 않고, 공격자가 이를 실행할 방법이 없다면 이는 보안 취약점이라 할 수 없다. 그러나 이러한 코드도 잠재적으로 악용될 수 있는 코드이기 때문에 존재해서는 안 된다.

 그러므로 프로그래며는 사용자에게서 입력받는 부분을 철저히 검증해야 한다. 프로그래머가 사용자의 입력을 받는 부분에서 실수한다면 예상치 못한 버그가 발생할 수 있고, 이 중 일부가 보안 취약점이 되어 공격의 대상이 된다.

 

취약점의 종류 - 메모리 커럽션 취약점

 

 취약점은 공격 방법에 따라 크게 두 가지로 나눌 수 있다. C/C++과 같은 저급 언어에서 메모리를 조작해 공격하는 메모리 커럽션 취약점과 메모리를 조작할 필요 없이 공격할 수 있는 로지컬 취약점이다. 우선 메모리 커럽션 취약점의 대표적 예시들에 대해 간단히 알아보자.

 

  메모리 커럽션 취약점

- Buffer Overflow

- Out of Boundary

- Off by one

- Format String Bug

- Double Free / Use After Free

- etc...

 

 각 취약점에 대한 더 자세한 내용은 Memory Corruptrion - C 강의에서 다룬다.

 

- Buffer Overflow

 Buffer Overflow(BOF)는 메모리 커럽션 취약점 중 가장 대표적이다. 이는 프로그래머가 할당한 크기의 버퍼보다 더 큰 데이터를 입력받아 메모리의 다른 영역을 오염시킬 수 있는 취약점이다.

 

- Out Of Boundary

 Out Of Boundary(OOB) 취약점은 버퍼의 길이 범위를 벗어나는 곳의 데이터에 접근할 수 있는 취약점이다. 이 또한 버퍼 오버플로우와 마찬가지로 매우 강력한 취약점으로, 브라우저와 같은 대규모 최신 소프트웨어에서도 자주 발견되는 취약점이다.

 

- Off by one

Off by one은 경계 검사에서 하나 더 많은 값을 쓸 수 있을 때 발생하는 취약점이다. 가령 32바이트 크기의 버퍼에 인덱스 32로 접근하는 것 같은 경우이다. 이는 반복문을 순회할 때 잘못된 비교 연산자를 사용하거나 인덱스가 0부터 시작하는 것을 고려하지 못했을 때 자주 발생한다.

 

- Format String Bug

 Format String Bug(FSB)는 printf나 sprintf와 같은 함수에서 포맷 스트링 문자열을 올바르게 사용하지 못해 발생하는 취약점이다. 포맷 스트링 역시 매우 강력한 취약점이지만, 최신 컴파일러에서는 여러 가지 방법으로 이를 방어하고 있어 최근에는 잘 발생하지 않고 있다.

 

 - Double Free / Use After Free

 Double Free와 Use After Free(UAF) 취약점은 동적 할당된 메모리를 정확히 관리하지 못했을 때 발생하는 취약점이다. 이미 해제된 메모리를 다시 한번 해제하려고 시도하는 것을 Double Free, 해제된 메모리에 접근해 이를 사용하려고 하는 것을 Use After Free라고 한다.

 

 

취약점의 종류 - 로지컬 버그

 

 이번에는 로지컬 버그 중 대표적인 몇 가지들을 살펴보겠다. 로지컬 버그는 메모리 커럽션 취약점과는 달리 프로그램의 메모리 구조를 이용해 공격할 필요가 없다. 따라서 익스플로잇 작성이 메모리 커럽션 취약점보단 상대적으로 간단하다.

 

 로지컬 버그

- Command Injection

- Race Condition

- Path Traversal

- etc...

 

각 취약점에 대한 더 자세한 내용은 Logical Bugs 강의에서 다룬다.

 

- Command Injection

 Command Injection은 사용자의 입력을 셸에 전달해 실행할 때 정확한 검사를 실행하지 않아 발생하는 취약점이다. 이는 공격자가 원하는 명령을 실행할 수 있는 데 비해 익스플로잇이 어렵지 않아 매우 강력한 취약점이다. 

 

- Race Condition

 보안 취약점으로서의 Race Condition은 여러 스레드나 프로세스의 자원 관리를 정확히 수행하지 못해 데이터가 오염되는 취약점이다. 레이스 컨디션은 발생 원인과 공격 방법에 따라 메모리 커럽션 취약점으로도, 로지컬 취약점으로도 분류할 수 있는 취약점이다.

 

- Path Traversal

 Path Traversal은 프로그래머가 가정한 디렉토리를 벗어나 외부에 존재하는 파일에 접근할 수 있는 취약점이다. 이는 주로 소스 코드에서 "../"와 같은 경로 문자를 검사하지 않아 발생한다.

 

 

2) 미티게이션

 

미티게이션

 

초기의 소프트웨어는 이러한 악의적 공격에 대한 대책이 전혀 준비되어있지 않아 취약점만 존재한다면 쉽게 공격당했다. 물론 이런 공격을 원천 차단하는 일은 취약점을 만들지 않는 것이지만, 프로그래머가 취약하지 않게 프로그램을 작성하기를 바라는 것은 근본적인 해결책이 되지 않는다. 따라서 자연스럽게 취약점의 존재 여부와는 무관하게 프로그램을 보호하는 방법에 대한 고민이 이뤄졌고, 그렇게 등장한 것이 미티게이션이다.

 미티게이션은 취약점의 공격을 어렵게 만드는 일을 한다. 대표적인 스택 버퍼 오버플로우의 미티게이션 중 하나인 Stack Smashing Protector(SSP)는 버퍼 오버플로우를 방지하기 위해 버퍼의 뒤에 랜덤한 값을 넣어두고 이를 특정 시점에 검사해 버퍼가 오염되었는지 확인하는 것과 같은 방법을 쓴다.

 그러나 해커들 또한 미티게이션을 우회하기 위해 여러 새로운 공격 기법들을 고안했다. 이렇게 새로 등장한 공격 기법을 막기 위해 또 새로운 미티게이션이 생기고, 이를 우회하기 위한 또 다른 공격 기법들이 만들어지게 된다. 공격 기법과 미티게이션의 공밥은 처음 스택 버퍼 오버플로우를 공격하는 문서가 발표된 이후 지금까지 꾸준히 계속되고 있다.

 그러나 미티게이션이 프로그램을 어떤 상황에서도 보호하는 것은 아니기 때문에 결국 취약점이 없는 프로그램을 만들기 위한 노력이 가장 중요하다.

 

 

'포너블 스터디' 카테고리의 다른 글

달고나 요약 (~ 33p)  (0) 2020.04.11
System Exploitation Fundamental (3)  (0) 2020.04.10
System Exploitation Fundamental (2)  (0) 2020.04.10
bandit level 0~  (0) 2020.04.03