시스템 공격(해킹) 방법
1) 버퍼 오버플로우: 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 영역을 벗어나는 위치의 자료를 읽거나 입력할 때 발생하는 오류를 통해 악의적인 코드를 실행시킴으로써 프로그램을 통제할 수 있는 권한을 갖게 됨. >> 버퍼 오버플로우에 취약한 함수 대신 안전한 함수로 교체
① 스택 버퍼 오버플로우: 함수 처리를 위해 지역 변수 및 매개변수가 위치하는 메모리 영역인 스택에 할당된 버퍼들이 문자열 계산 등에 의해 정의된 버퍼의 한계치를 넘는 경우, 버퍼 오퍼플로우가 발생해 공격자가 복귀 주소를 조작하여 원하는 임의의 코드를 실행시킴.
>> 대응책: 스택 가드(메모리 상에서 복귀 주소와 변수 사이에 특정한 값인 카나리 값을 저장해 두었다가 그 값이 변경되는 경우 오버플로우 공격으로 간주해 프로그램 중단하는 것), 스택 쉴드(함수 시작 시 복귀 주소를 Global RET에 저장해두었다가 함수 종료 시 저장된 값과 스택의 RET 값을 비교해 다르면 오버플로우 공격이 발생한 것으로 간주해 프로그램 종료), ASLR(메모리 공격을 방어하기 위해 주소 공간의 배치를 난수화하고, 실행 시마다 메모리 주소를 변경시켜 악성 코드에 의한 특정주소 호출을 방지함)
② 힙 버퍼 오버플로우: 힙은 사용자가 동적으로 할당하는 메모리 영역으로, malloc() 등의 함수를 통해 할당함. 힙에 할당된 버퍼들에 문자열이 저장될 때 최초에 정의된 사이즈보다 큰 문자열 등이 저장되는 경우 공격자가 데이터와 함수 주소 등을 변경하여 공격자가 원하는 임의 코드를 실행시킴.
2) 레이스컨디션: 둘 이상의 프로세스나 스레드가 동시에 공유자원에 접근할 때 접근 순서에 따라 비정상적인 결과가 나올 수 있음. 실행되는 파일이 임시 파일을 만드는 경우, 악의적인 프로그램을 통해 해당 프로세스 실행 중 끼어들어 해당 임시파일에 심볼릭 링크를 걸어 악의적인 행위를 수행할 수 있는데 이를 레이스 컨디션 공격이라고 함.
>> 가능하면 임시파일을 생성하지 않고, 사용하고자 하는 파일에 링크가 걸려있으면 중단한다, umask를 최하인 022로 유지하여 임시로 생성한 파일이 공격자에 의해 악의적으로 삭제되지 않도록 한다.
3) 포맷스트링 공격: 포맷스트링이란 C언어의 printf() 등의 함수에서 사용되는 문자열의 입출력 형태를 정의하는 문자열로, 포맷 스트링을 인자로 하는 함수의 취약점을 이용한 공격이다. 외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 스트링을 그대로 사용하는 경우 발생.
>> 포맷스트링을 함수의 입력 파라미터로 직접 사용하지 않는다.