익스플로잇(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 |
---|