본문 바로가기

Security/pwnable

1. 취약점이란?

익스플로잇(exploit)

: 취약점을 이용해 공격자가 의도한 동작을 수행하게 하는 코드 혹은 이를 이용한 공격 행위.

 

소프트웨어 버그

보안에 영향을 미치는 정도에 따라 4가지로 분류함

소프트웨어 버그(Bug) 프로그래머가 의도하지 않은 동작을 수행
소프트웨어 취약점(Vulnerability) 보안에 영향을 미칠 수 있는 버그
익스플로잇 가능한 취약점(Exploitable Vulnerability) 공격자가 의도한 동작을 수행할 수 있는 버그
안정적으로 익스플로잇 가능한 취약점
(Reliably Exploitable Vulnerability)
익스플로잇이 가능한 취약점 중 매우 높은 확률로 공격에
성공할 수 있는 버그

 

Attack Vector

모든 소프트웨어의 취약점은 소프트웨어와 공격자가 상호작용 하는 Attack Vector에서 발생함 (사용자의 입력)

 

Attack surface = Attack Vector들의 집합

 

공격자입력창을 통해 프로그램과 상호 작용할 수 있으며,

제목, 내용에 공격자의 입력을 넣을 수 있고 업로드 기능을 통해 이를 프로그램에 전달할 수 있음. 이러한 부분은 모두 공격 벡터임.

 


제목을 처리하는 코드는 안전하고, 내용을 처리하는 코드에서 보안 취약점이 발생하며, 업로드하는 과정에서도 문제가 없다고 가정했을 때, 내용을 처리하는 코드는 공격자가 접근해 악용할 수 있음 → 보안 취약점

 

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


 

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

 


취약점 종류

취약점은 공격 방법에 따라 크게 두 가지로 나눌 수 있습니다.

● 메모리 커럽션

C/C++과 같은 저수준 언어에서 메모리를 조작해 공격하는 메모리 커럽션 취약점

 

- Buffer Overflow

BOF는 메모리 커럽션 취약점 중 가장 대표적인 취약점. 이는 프로그래머가 할당한 크기의 버퍼보다 더 큰 데이터를 입력받아 메모리의 다른 영역을 침범할 수 있는 취약점. 발표된지 30년에 가까운 시간이 흘렀지만, 아직도 자주 사용됨.

 

- Out-Of-Boundary

OOB 취약점은 버퍼의 길이 범위를 벗어나는 곳의 데이터에 접근할 수 있는 취약점. 브라우저와 같은 대규모 최신 소프트웨어에서도 자주 발견되는 취약점

 

- Off-by-one

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

 

- Format String Bug

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

 

- Double Free / Use-After-Free

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


● 로지컬 버그

메모리 커럽션 취약점과 달리 프로그램의 메모리 구조를 이용해 공격할 필요가 없음 →  익스플로잇 작성이 상대적으로 간단함.

 

- Command Injection

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

 

- Race Condition

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

 

- Path Traversal

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

 

 

'Security > pwnable' 카테고리의 다른 글

Stack Canary  (0) 2022.02.02