IT CookBook, 정보 보안 개론과 실습 : 시스템 해킹과 보안(개정판)
컴퓨터나 보안 관련 학과 학생과 IT 전문학원에서 보안을 처음 배우고자 하는 일반인을 대상으로 한다. 시스템 해킹과 보안은 주제의 성격상 운영체제와 C언어 등에 대한 기초 지식이 필요하다. 이 책은 시스템에서 서비스 제공을 위한 프로그램 개발과 관련한 보안 이슈와 시스템 운영에 관련한 보안 설정 등에 관한 내용을 담고 있다. 보안이 중요한 게임 등의 상용 프로그램을 개발하거나, 백신을 개발하거나, 시스템을 안정적으로 운영해야 하거나 또는 이와 유사한 업
운영체제에 대한 기반 지식이 있는 사람이 시스템 보안에 대하여 처음으로 배우기 위해 쓰인 책으로, 기반 다지기부터 다양한 실습에 이르기까지 체계적인 학습으로 구성되어있다. 또한 입문자에게 적절한 설명과 실습을 통해서 시스템 보안 지식 습득에 어려움이 없도록 배려하고 있다.
하지만 『정보 보안 개론과 실습 : 시스템 해킹과 보안(개정판)』 은 『정보 보안 개론과 실습 : 시스템 해킹과 보안』 초판과 별반 차이가 없으며, 개정판으로 학습한다고 더 나은 시스템 보안 지식을 습득하기는 어려워 보인다. 이보다 큰 실수는 검증 없이 초판의 잘못된 실습 소개를 개정판에서 수정되지 않고 다시 출판된 것이다. 이 문제점은 버퍼 오버플로우의 eggshell.c의 shellcode와 포맷 스트링 등에 드러나 있다. 그 내용은 eggshell.c의 shellcode 부분은 uid가 0으로 변경되는 것이 아니라 euid가 0으로 변경되는 shellcode로 만들어져 있다. 그리고 포맷 스트링의 실습은 그림과 내용의 주소 값들이 잘못된 값으로 설명되고 있어 만약 실습을 따라 한다고 하여도 공격이 성공할 수 없다.
그 외 부족한 점이 있다면 ①KISA에서 제공하는 패스워드 가이드라인보다 부족한 패스워드 설명, ②취약점을 가진 함수(strcpy(), strcat() 등)에 대한 대응책(strncpy(), strncat() 등) 설명이 Secure Coding 및 ISO/IEC TR 24731에 비해 부족하며 대응책도 문제가 있다고 지적하고 있다. 다음은 그 예이다.
예) strcpy()와 strcat() 함수는 버퍼 뒤에 문자열을 덧붙인다. strcpy()와 strcat()도 안전한 버전, strncpy()와 strncat()이 있다. strncpy(), strncat()과 같은 함수들은 기록할 바이트 수를 제한하기 때문에 일반적으로 더 안전하지만 절대 안전을 보장하진 않는다. 다음은 기존 코드를 간단히 변형한 실제 코드 예제이다.
strncpy(record , user , MAX-STRING_ LEN - 1);
strncat(record , cpw , MAX_STRING_ LEN - 1);
문제점은 strncat()의 마지막 인자는 전체 버퍼 길이가 아니라, strncpy()를 호출한 후에 남아 있는 공간이어야 한다는 점이다. 두 함수 모두 버퍼의 총 크기가 아니라 남아 있는 공간을 지정해 주어야 한다. 남아 있는 공간은 데이터가 매번 더해지거나 지워질 때마다 바뀌기 때문에, 프로그래머는 남은 공간을 기록하고 매번 새로 계산해야 한다. 이런 과정은 실수를 유발하기 쉬워서 취약점으로 연결될 수 있다. strncpy()와 strncat()에 관련한 또 다른 문제는 어느 함수도 문자열이 잘렸을 때 상태 코드를 제공하거나 이를 알려주지 않는다는 점이다. 두 함수 모두 목적 버퍼의 포인터를 돌려주는데 결과 문자열이 잘렸는지 여부를 판단하기 위해서는 개발자의 상당한 노력이 필요하다. strncpy() 함수는 소스 문자열이 목적 문자열과 최소한 같은 길이 이상이면 목적 문자열을 널 종료시키지 않는다. 결과적으로 strncpy() 호출 이후에 목적 문자열을 널 종료시켜주어야 한다. 또한 strncpy()는 소스 데이터가 고갈된 이후에 목적 버퍼를 널 바이트로 모두 채워야 한다는 점에서 성능 문제가 있다. 이런 행동을 해야만 하는 이유는 없지만, 여러 프로그램이 여기에 의존하고 있기 때문에 결과적으로 바꾸기가 힘들다. strncpy_s()와 strncat_s()는 strncpy()와 strncat()를 대체하기 위해 ISO/IEC TR 24731에 정의되어 있다.
마지막으로 서적을 읽고 실습을 따라하면서 중간 중간에 chapter 관련 참고 서적 및 자료를 소개한다면 다음 단계로 나아가는데 많은 도움이 될 것 같다.