C & C++ 시큐어 코딩(개정판)(에이콘 해킹 보안 시리즈)
버그 없는 안전한 소프트웨어를 위한
[C & C++ 시큐어 코딩]은 소프트웨어 취약점의 근본 원인을 설명하고 침투를 막기 위해 취할 수 있는 대책을 소개하는 책이다. 책에서는 C나 C++ 애플리케이션의 전체 보안을 향상시킬 수 있는 방법, 동적 메모리 관리 함수의 잘못된 사용으로 발생하는 취약점과 보안 허점을 예방하는 방법, 시큐어 I/O를 수행해 파일 시스템 취약점을 예방하는 방법, 형식 문자열 취약점을 만들지 않고 형식화된 출력 함수를 올바르게 사용하는 방법, 동시 발생 코드를 개발하는 동안에 경합 상태와 기타 무단 이용 가능한 취약점을 예방하는 방법 등을 다루고 있다.
Couldn't load pickup availability
출판사 리뷰
출판사 리뷰
이 책은 소프트웨어 취약점의 근본 원인을 설명하고 침투를 막기 위해 취할 수 있는 대책을 알려준다. 더욱이 이 책을 통해 프로그래머는 당장 오늘만이 아니라 미래의 공격으로부터 소프트웨어를 보호하는 최상의 보안 업무 채택과 보안 사고 방식을 발전시킬 수 있다. 로버트 시코드는 CERT 보고서와 결론을 활용해 프로그램 에러가 대부분 보안 구멍이 되는 것을 체계적으로 확인하고, 그 보안 구멍이 어떻게 무단 이용될 수 있는지를 보이며, 가능한 결과를 고찰해보고 안전한 방법을 내놓는다. 이 책에는 윈도우와 리눅스에서 구현한 수백 개의 안전한 코드, 불안전한 코드, 익스플로잇 예제가 들어있다. 안전한 C 또는 C++ 소프트웨어를 만들(또는 안전하게 지킬) 책임이 있다면 이 책에서 가장 자세하고 전문적인 지원을 얻을 수 있다.
★ 추천의 글 ★
사회가 네트워크 소프트웨어 시스템에 의존할수록 이런 시스템을 겨냥한 공격 횟수는 나날이 증가했다. 또한 이런 공격(정부, 기업, 교육 기관, 개인이 대상)으로 중요 데이터의 파괴와 손상, 시스템 피해, 생산성 하락, 경제적 손실이 발생했다.
오늘날 인터넷에서 행해지는 공격의 대부분은 단순한 골칫거리 수준에서 끝나긴 하지만, 점점 범죄, 테러, 그 외의 악의적인 목적을 띠고 소프트웨어의 취약점을 노리는 일들이 점점 늘어나는 추세다. 최근 통계에 따르면 연간 4,000개 이상의 소프트웨어 취약점이 발견된다고 한다. 이런 취약점은 소프트웨어를 개발할 때 시스템 보호를 적절히 하지 않았거나 보안 결함을 제거하는 데 충분히 집중하지 못했기 때문에 발생한다.
취약점이 증가함에 따라 공격의 복잡성과 효율성도 꾸준히 발전했다. 침입자는 제품에서 발견된 취약점을 파고들 스크립트를 재빨리 개발했으며, 스크립트를 이용해 컴퓨터를 손상시키는 것은 물론, 다른 공격자들이 사용할 수 있게 스크립트를 공유하기까지 한다. 이렇게 공유된 스크립트를 활용한 프로그램이 만들어지면 취약점이 있는 시스템을 자동 검색해 공격하고 손상시키며, 그런 시스템들을 경유해 더 많은 시스템을 공격한다.
매년 막대한 수의 취약점이 발견되므로 관리자들은 기존 시스템을 패치하는 데 더욱 골머리를 앓고 있다. 패치 적용이 어려울 수 있고 예상치 못한 부작용이 있을지도 모른다. 업체가 보안 패치를 내놓은 후에 취약점이 있는 컴퓨터의 90~95%가 패치를 적용하기까지는 수개월, 심지어 수년이 걸릴 수 있다.
인터넷 사용자들은 공신력 있는 보안 관련 인터넷 커뮤니티에 크게 의존한다. 그러나 오늘날 그런 해결 방식은 점점 한계에 부딪히고 있다. 각각의 처리 조직이 절차를 능률적이고도 자동화하는 데 모두 열심이긴 하지만, 상용 소프트웨어 제품의 취약점 수가 너무 많아 아주 뛰어난 조직이 아니라면 이제 해결이 불가능한 수준에 와 있다.
대부분 제품에서 보안이 더 강화됐다고는 볼 수 없다. 즉, 많은 소프트웨어 개발자들은 취약점의 원인으로 얻은 교훈을 이해하지 못하거나 적절한 완화 전략을 펼치지 못하고 있다. CERT/CC가 초기 버전의 제품에서 발견했던 것과 똑같은 종류의 취약점을 이후 버전에서도 계속 발견하는 사실로 미루어 이 점을 알 수 있다.
위 요소들을 하나로 합쳐 생각해보면 실제로 시스템 속도가 빨라진 만큼 단시간 내에 많은 공격으로 상당한 경제적 손실과 서비스 혼란이 발생할 것으로 보인다.
일사불란한 처리가 계속 필요하지만 쉽게 공격 당하지 않게 더 많은 보안 시스템을 갖춰야 한다.
이 책에서는 1988년에 CERT를 설립한 이래로 기록된 가장 흔하고 위험하며 파괴적인 소프트웨어 취약점에 대한 C/C++ 프로그래밍 주요 에러를 다룬다. 이 책으로 프로그래밍 에러를 깊이 있게 기술적으로 분석하고, 침투 위험을 줄이거나 제거하는 데 효과적이고도 실용적인 완화 전략 모두를 배울 수 있다.
1987년 4월, 로버트가 소프트웨어 공학 연구소(SEI, Software Engineering Institute)에 처음으로 합류할 때부터 줄곧 함께 일해 왔다. 로버트는 노련하고도 지식이 풍부한 소프트웨어 엔지니어인데, 소프트웨어 취약점을 세세하게 분석하고 자신이 관찰하고 발견한 내용을 잘 설명했다. 그렇기 때문에 이 책은 소프트웨어 개발자들이 직면하는 가장 일반적인 문제들에 대해 매우 신중한 처리와 실질적 해결책을 제공한다. 로버트는 소프트웨어 개발에 대해 광범위한 배경 지식을 갖고 있어 소스코드 개발 시에 이해득실을 따져야 하는 성능 균형, 유용성, 기타 품질 속성에도 신경을 기울였다. 로버트의 능력에 더해 이 책에는 CERT를 운용하면서 얻은 축적된 지식들이 들어있고, SEI의 CERT/CC 취약점 분석 팀, CERT 운영 스태프, 그리고 편집 및 지원 스태프의 특별한 작업도 들어있다.
- 리차드 페시아(Richard D. Phethia)/CERT 디렉터
★ 이 책에서 다루는 내용 ★
■ C나 C++ 애플리케이션의 전체 보안을 향상시킬 수 있는 방법
■ 불안전한 조작 로직을 무단 이용하는 버퍼 오버플로, 스택 스매싱, 반환 지향적 프로그래밍 공격 등을 무력화시킬 방법
■ 동적 메모리 관리 함수의 잘못된 사용으로 발생하는 취약점과 보안 허점을 예방하는 방법
■ 부호 정수 오버플로, 무부호 정수 래핑, 잘림 에러로 인해 발생하는 정수 관련 문제를 제거하는 방법
■ 시큐어 I/O를 수행해 파일 시스템 취약점을 예방하는 방법
■ 형식 문자열 취약점을 만들지 않고 형식화된 출력 함수를 올바르게 사용하는 방법
■ 동시 발생 코드를 개발하는 동안에 경합 상태와 기타 무단 이용 가능한 취약점을 예방하는 방법
■ C11와 C++11에 대한 내용 업데이트
■ 문자열, 동적 메모리 관리, 정수 보안 관련 내용 업데이트
■ 동시 발생에 대한 새로운 단원 추가
★ 이 책의 대상 독자 ★
이 책은 C와 C++로 소프트웨어 개발과 유지 보수에 종사하는 사람에게 유용하다.
■ C/C++ 프로그래머라면 소프트웨어 취약점이 되는 통상적인 프로그래밍 에러를 확인하고 이러한 에러가 어떻게 무단 이용되는지를 이해하며 안전 방식으로 해결책을 구현하는 방법을 알 수 있다.
■ 소프트웨어 프로젝트 관리자라면 소프트웨어 취약점의 중요성과 위험을 식별해 시큐어 소프트웨어 개발에 투자 해야 할지를 판단할 수 있다.
■ 컴퓨터공학과 학생이라면 나쁜 습관이 드는 것을 막아주며 프로 직업인이 돼서 시큐어 프로그램을 개발할 수 있는 프로그래밍 실기를 익힐 수 있다.
■ 보안 분석가라면 일상적인 취약점에 대해 세부적인 설명을 이해하고 이러한 취약점을 발견하는 방법을 알게 되며 실제적인 예방 전략을 익힐 수 있다.
★ 이 책의 구성 ★
1장, '가위들고 뛰기'에서는 문제의 개략을 제공하고, 보안 용어와 개념을 소개하며 그토록 많은 취약점이 C와 C++ 프로그램에서 발견되는 이유를 알려준다.
2장, '문자열'에서는 C와 C++에서의 버퍼 오버플로와 스택 스매싱 같은 문자열 조작, 통상적인 보안 결함, 그 결과로 나타나는 취약점을 설명한다. 코드 인젝션과 아크 인젝션 익스플로잇을 모두 알아본다.
3장, '포인터 변조'에서는 공격자가 메모리의 어느 위치에서든 주소를 쓸 수 있는 임의 메모리 쓰기 익스플로잇을 소개하고, 이런 익스플로잇이 들어간 머신에서 임의 코드를 실행하는 데 사용될 수 있는 방법을 설명한다. 임의 메모리 쓰기로 발생한 취약점은 이후의 장에서 다룬다.
4장, '동적 메모리 관리'에서는 동적 메모리 관리를 설명한다. 동적으로 할당된 버퍼 오버플로, 해제된 메모리에 쓰기, 이중 해제 취약점을 설명한다.
5장, '정수 보안'에서는 정수 오버플로, 부호 에러, 잘림 에러 등의 필수 보안 문제(정수를 취급하는 보안 문제)를 다룬다.
6장, '형식화된 출력'에서는 형식화된 출력 함수의 적절하거나 부적절한 사용을 설명한다. 이들 함수의 부적절한 사용으로 인한 형식 문자열과 버퍼 오버플로 취약점 모두를 설명한다.
7장, '동시성'에서는 교착 상태, 경합 상태, 부적절한 메모리 접근 순서로 인해 발생하는 동시성과 취약점에 초점을 맞춘다.
8장, '파일 I/O'에서는 파일 I/O와 관련된 통상적인 취약점을 설명하는데, 여기에는 경합 상태와 TOCTOU 취약점이 포함된다.
9장, '권고 관행'에서는 C/C++ 애플리케이션의 전체 보안을 향상시키기 위해 특정 개발 관행을 권고한다. 이런 권고안은 특정 취약점 부류의 문제를 해결하기 위해 각 장에 있는 권장 사항들에 이어지는 것이다.
★ 저자 서문 ★
1988년 11월, 인터넷 시스템의 10%를 멈추게 만든 모리스(Morris) 웜 사건이 계기가 돼 미국 방위 고등 연구 계획국(DARPA, Defense Advanced Research Projects Agency)은 CERT를 출범시켰다. CERT는 펜실베이니아 주 피츠버그의 소프트웨어 공학 연구소(SEI, Software Engineering Institute) 내에 있으며, 연방 정부 기금으로 운영되는 연구개발 센터인 SEI를 미 국방부가 지원한다.
초기에 CERT는 사건 대응과 분석에 집중했다. 공격 시도, 시험, 탐색 같은 사건이 있었고, 서비스 손상이나 거부와 같이 공격에 성공한 사건들도 있다. 1988년부터 CERT는 정보를 요청하거나 컴퓨터 보안 사고를 신고하는 22,665건 이상의 긴급전화를 받았으며, 319,992건 이상의 컴퓨터 보안 사건을 처리했다. 매년 보고되는 사건 수는 계속 증가하는 추세다.
사건에 대한 대응이 필요하지만 상호 정보 시스템과 인터넷을 지키기에는 역부족이다. 분석해보면 대다수의 사건이 트로이 목마 악성코드, 사회공학(social engineering), 소프트웨어 취약점을 이용해 발생하는데, 소프트웨어 결함, 디자인 결정, 구성 결정, 그리고 시스템 간의 이상 작동들도 원인이 된다. CERT는 취약점 정보에 대한 공개된 소스들을 살펴보고 정기적으로 취약점 보고를 받는다. 1995년 이래로 16,726건 이상의 취약점이 보고됐다. 보고를 받으면 CERT는 취약점이 될 만한 부분을 분석하고, 그 제품의 기술 프로듀서들과 함께 작업해 보안 결함을 해결한다.
통계로 보면 사건 보고와 비슷하게 취약점 보고도 불안할 정도로 계속 늘어나고 있다. 취약점을 관리하려면 처리 과정을 되짚어 보게 되는데, 인터넷과 정보 시스템 보안 문제에 대처하기에는 충분치 않다. 늘어나는 취약점과 사건 모두에 대처하려면 소프트웨어 개발 및 유지 관리하는 동안에 소프트웨어 취약점이 끼어들지 못하게 하는 것이 문제 공략에 대한 더 확실한 방법이 된다. 기존 취약점을 분석해보면 상대적으로 사소한 근본 원인들 때문에 대다수의 취약점이 발생한다는 것을 알게 된다. 이 책의 목표는 개발자들에게 이런 근본 원인과 취약점이 일어나지 않게 취할 수 있는 조치에 관해 교육하는 것이다.
★ 옮긴이의 말 ★
스위스 제네바 소재 유럽입자물리연구소에 근무하던 팀 버너스리(Tim Berners-Lee)가 1989최근 우리나라에 보안 사고가 끊이지 않고 있다. 은행과 통신사를 비롯한 기업체에서 개인에 이르기까지 자료 유출과 훼손은 그 심각성에도 불구하고 잊을 만하면 터져 나온다. 비단 우리나라에 국한된 것도 아니다. 이 글을 작성하는 지금도 TV 뉴스에서 미국 소니 픽처스의 보안이 뚫려 미개봉작들이 유출된 소식이 흘러나오고 있다. 각 업체는 앞다퉈 보안을 강화하고 있지만 쉽사리 완벽한 대비를 못하고 있다. 공격자는 어떻게든 새 방법을 동원해 허점을 찾으려 하기 때문에 프로그램 개발자는 조금도 방심할 수 없는 입장이다.
이런 때에 이 책을 번역하게 돼 기쁘게 생각한다. 이 책의 저자인 시코드는 현업에서는 물론이고 인터넷에서도 보안 전문가로 명성이 높다. 그가 시큐어 프로그래밍을 위한 제반 사항을 한 권의 책에 담으려 노력한 흔적이 곳곳에 보인다. 이 책의 내용은 프로그래밍에 어느 정도 경험이 있는 독자를 위한 것으로, 프로그래밍 초보자가 보기에는 어려운 부분들이 더러 있다. 하지만 프로그래밍 걸음마부터 안전한 프로그래밍 습관을 들이는 것이 중요하다는 점에서 프로그래밍을 시작하는 초보자도 이 책을 곁에 두길 권한다. 어느 수준의 독자가 이 책을 읽든 프로그램 보안 참고서로 활용한다면 그 가치를 충분히 해내리라 믿는다.
목차
목차
1.1 위협 알아보기
__손실 비용은 얼마인가?
__누가 위협하는가?
__소프트웨어 보안
1.2 보안 개념
__보안 정책
__보안 결함
__취약점
__익스플로잇
__완화
1.3 C와 C++
__간략한 역사
__C 언어에서의 문제점
__레거시 코드
__기타 언어
1.4 개발 플랫폼
__운영체제
__컴파일러
1.5 정리
1.6 추가 참고 자료
2장. 문자열
2.1 문자열
__문자열 데이터 형
__UTF-8
__확장 문자열
__문자열 리터럴
__C++에서의 문자열
__문자형
__int
__unsigned char
__wchar_t
__문자열 크기 지정
2.2 일반 문자열 처리 에러
__길이 제한 없는 문자열 복사
__1바이트 오버플로 에러
__null 종료 에러
__문자열 잘림
__함수 없이 발생하는 문자열 에러
2.3 문자열 취약점과 익스플로잇
__오염된 데이터
__보안 결함: IsPasswordOK
__버퍼 오버플로
__프로세스 메모리 조직
__스택 관리
__스택 스매싱
__코드 인젝션
__아크 인젝션
__복귀 지향 프로그래밍
2.4 문자열에 대한 완화 전략
__문자열 처리
__C11 Annex K 경계 점검 인터페이스
__동적 할당 함수
__C++ std::basic_string
__문자열 객체 참조의 무효화
__basic_string 사용에서의 기타 일반적 실수
2.5 문자열 처리 함수
__gets()
__C99
__C11 Annex K 경계 점검 인터페이스: gets_s()
__동적 할당 함수
__strcpy()와 strcat()
__C99
__strncpy()와 strncat()
__memcpy()와 memmove()
__strlen()
2.6 런타임 방지 전략
__검출과 복구
__입력 유효화
__객체 크기 점검
__비주얼 스튜디오 컴파일러가 생성하는 런타임 점검
__스택 카나리아
__스택 스매싱 프로텍터(프로폴리스)
__운영체제 전략
__검출과 복구
__비실행 스택
__W^X
__PaX
__향후 방향
2.7 주목할 만한 취약점
__원격 로그인
__커버로스
2.8 정리
2.9 추가 참고 자료
3장. 포인터 변조
3.1 데이터 위치
3.2 함수 포인터
3.3 객체 포인터
3.4 명령 포인터 수정
3.5 전역 오프셋 테이블
3.6 .dtors 섹션
3.7 가상 포인터
3.8 atexit()와 on_exit() 함수
3.9 longjmp() 함수
3.10 예외 처리
__구조적 예외 처리
__시스템 기본 예외 처리
3.11 완화 전략
__스택 카나리아
__W^X
__함수 포인터의 인코딩/디코딩
3.12 정리
3.13 추가 참고 자료
4장. 동적 메모리 관리
4.1 C 메모리 관리
__C 표준 메모리 관리 함수
__정렬
__alloca()과 가변 크기 배열
4.2 일반적인 C 메모리 관리 에러
__초기화 에러
__반환 값 점검 생략
__Null이나 부적절한 포인터의 역참조
__해제된 메모리 참조
__메모리의 여러 번 해제
__메모리 누수
__0 길이 할당
__DR #400
4.3 C++ 동적 메모리 관리
__할당 함수
__할당 해제 함수
__가비지 콜렉션
4.4 일반적인 C++ 메모리 관리 에러
__할당 실패를 올바로 처리 못함
__짝이 잘못된 메모리 관리 함수
__메모리 여러 번 해제
__할당 해제 함수의 예외 처리
4.5 메모리 관리자
4.6 더그 리의 메모리 할당자
__힙에서의 버퍼 오버플로
4.7 이중 해제 취약점
__해제된 메모리에 쓰기
__RtlHeap
__버퍼 오버플로(리덕스)
4.8 완화 전략
__Null 포인터
__일관성 있는 메모리 관리 습관
__phkmalloc
__무작위화
__OpenBSD
__jemalloc 메모리 관리자
__정적 분석
__런타임 분석 도구
4.9 중요한 취약점
__CVS 버퍼 오버플로 취약점
__마이크로소프트 데이터 액세스 컴포넌트(MDAC)
__CVS 서버의 이중 해제
__MIT 커버로스 5의 취약점
4.10 정리
5장. 정수 보안
5.1 정수 보안 소개
5.2 정수 데이터 형
__부호 없는 정수형
__랩어라운드
__부호 있는 정수형
__부호 있는 정수형의 범위
__정수 오버플로
__문자형
__데이터 모델
__기타 정수형
5.3 정수 변환
__정수 변환
__정수 변환 순위
__정수 프로모션
__보통의 산술 변환
__부호 없는 정수형의 변환
__부호 있는 정수형의 변환
__암시적 변환
5.4 정수 연산
__대입
__덧셈
__뺄셈
__곱셈
__나눗셈과 나머지
__시프트
5.5 정수 취약점
__취약점
__랩어라운드
__변환과 잘림 에러
__예외가 아닌 정수 로직 에러
5.6 완화 전략
__정수형 선택
__추상 데이터 형
__임의 정확 연산
__범위 점검
__선행 조건과 후행 조건 검사
__시큐어 정수 라이브러리
__오버플로 검출
__컴파일러가 생성한 런타임 검사
__입증 가능한 범위 내 연산
__AIR 정수 모델
__검사와 분석
5.7 정리
6장. 형식화된 출력
6.1 배리어딕 함수
6.2 형식화된 출력 함수
__형식 문자열
__GCC
__비주얼 C++
6.3 형식화된 출력 함수 공격
__버퍼 오버플로
__출력 스트림
__프로그램의 비정상적 종료
__스택 내용 보기
__메모리 내용 보기
__메모리 덮어쓰기
__국제화
__확장 문자 형식 문자열 취약점
6.4 스택 무작위화
__스택 무작위화 없애기
__두 개의 워드로 주소 기록
__직접 인자 접근
6.5 완화 전략
__형식 문자열에서 사용자 입력 배제
__정적 내용의 동적 사용
__기록될 바이트 제한
__C11 Annex K 경계 점검 인터페이스
__iostream과 stdio
__검사
__컴파일러 점검
__정적 오염 분석
__배리어딕 함수 구현 수정
__Exec 실드
__포맷가드
__정적 바이너리 분석
6.6 주목할 만한 취약점
__워싱턴 대학의 FTP 데몬
__CDE 툴토크
__이터캡 버전 NG-0.7.2
6.7 정리
6.8 추가 참고 자료
7장. 동시성
7.1 멀티스레딩
7.2 병렬 처리
__데이터 병렬 처리
__작업 병렬 처리
7.3 성능 목표
__암달의 법칙
7.4 일반적인 에러
__경합 상태
__손상된 값
__휘발성 객체
7.5 완화 전략
__메모리 모델
__동기화 기본 연산
__스레드 역할 분석(연구)
__불변 데이터 구조
__현재 코드 성질
7.6 완화 함정
__교착 상태
__일찍 해제한 잠금
__쟁탈
__ABA 문제
7.7 주목할 만한 취약점
__멀티코어 DRAM 시스템에서의 DoS 공격
__시스템 호출 래퍼에서의 동시성 취약점
7.8 정리
8장. 파일 I/O
8.1 파일 I/O 기본
__파일 시스템
__특수 파일
8.2 파일 I/O 인터페이스
__데이터 스트림
__파일 열고 닫기
__POSIX
__C++에서의 파일 I/O
8.3 접근 제어
__유닉스 파일 권한
__프로세스 특권
__특권 변경
__특권 관리
__권한 관리
8.4 파일 식별
__디렉토리 이동
__동일 에러
__심볼릭 링크
__정규화
__하드 링크
__장치 파일
__파일 속성
8.5 경합 상태
__점검 시간, 사용 시간
__교체 없이 생성
__배타적 접근
__공유 디렉토리
8.6 완화 전략
__경합 윈도우 닫기
__경합 객체 제거
__경합 객체에 대한 접근 제어
__경합 검출 도구
8.7 정리
9장. 권고 관행
9.1 보안 개발 생명주기
__TSP 시큐어
__계획과 추적
__품질 관리
9.2 보안 훈련
9.3 요구 사항
__시큐어 코딩 표준
__보안 품질 요구 공학
__유즈/미스유즈 케이스
9.4 설계
__시큐어 소프트웨어 개발 원칙
__위협 모델링
__공격면 분석
__기존 코드의 취약점
__시큐어 래퍼
__입력 검증
__신뢰 경계
__블랙리스팅
__화이트리스팅
__검사
9.5 구현
__컴파일러 보안 기능
__무한 범위 정수 모델
__안전한 시큐어 C/C++
__정적 분석
__소스코드 분석 실험기
__철저한 방어
9.6 검증
__정적 분석
__침투 테스팅
__퍼즈 검사
__코드 감사
__개발자 지침과 점검표
__독립 보안 리뷰
__공격면 리뷰
9.7 정리
9.8 참고 자료
저자
저자
Your payment information is processed securely. We do not store credit card details nor have access to your credit card information.

