소프트웨어 보안 평가 The Art of Software Security Assessment
- 원서명The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities (ISBN 9780321444424)
- 지은이마크 다우드, 존 맥도날드, 저스틴 슈
- 옮긴이삼성SDS 정보보안연구회
- ISBN : 9788960775114
- 58,000원
- 2013년 12월 31일 펴냄
- 페이퍼백 | 1,256쪽 | 188*250mm
- 시리즈 : 해킹과 보안
책 소개
이 책은 소프트웨어 보안 감사에 대하여 이전까지 쓰여진 어떤 책보다 상세하고, 정교하고 유용한 가이드를 제공한다. 능력 있는 보안 컨설턴트이자 VPN 같은 애플리케이션의 알려지지 않은 취약점을 개인적으로 연구하는 저자들의 특별한 경험을 바탕으로, 감지하기 어렵고 잘 숨겨진 보안 취약점들을 처음부터 끝까지 밝혀내는 방법을 소개한다. 이 책에서는 유닉스/리눅스와 윈도우 환경 모두에 대한 소프트웨어 취약점에 대한 모든 범위를 다룸으로써 네트워크와 웹 소프트웨어를 포함한 모든 종류의 애플리케이션과 함수에 대한 보안감사를 할 수 있게 해준다. 또한 과거 산업 전반에서 이목을 끌었던 취약점에 대한 소스코드 사례를 이용해 기술을 가르쳐준다.
이 책에서 다루는 내용
■ 소스코드 감사: 이론, 실전, 방법론, 알려지지 않은 자료 교환
■ 보안 소프트웨어 디자인과 보안심사 간 불일치 조율
■ 구조 리뷰 수행
■ 메모리 관리, 데이터 타입, 비정상적인 데이터와 관련된 취약점 식별 방법
■ 유닉스/리눅스 평가: 권한, 파일 및 절차
■ 객체나 파일시스템을 포함한 윈도우 관련 이슈
■ 프로세스 간 통신, 동기화 및 상태 감사
■ 네트워크 소프트웨어 평가: IP 스택, 방화벽, 일반적인 애플리케이션 프로토콜
■ 웹 애플리케이션과 기술 감사
이 책의 대상 독자
이 책은 경험이 있는 개발자가 이해할 수 있게 작성됐다. 독자는 적어도 하나의 프로그래밍 언어에 능통해야 하며, 기본적인 C/C++ 프로그래밍에 익숙해야 한다. 이 책의 여러 단계에 걸쳐 인텔 어셈블리 언어가 사례로 사용됐지만, 최소한으로 사용했으며 최대한 C코드와 비슷하게 옮기려고 노력했다. 가장 일반적인 운영체제와 자주 사용되는 플랫폼을 사용했고, 최대한 플랫폼에 제약을 받지 않은 일반적인 내용을 포함하게 최선을 다해 만들었다. 필요에 따라 이 책에서 다루지 않는 배경 지식을 제공하기 위해 추가적인 리소스를 참조했다.
이 책의 구성
1부, 소프트웨어 보안 평가 소개(1~4장): 1부는 코드 진단 방법을 소개하고, 이를 어떻게 소프트웨어 개발 과정에 적용하는지 설명한다. 디자인 검토, 위협 모델링, 운영 검토의 기능(코드뿐 아니라 애플리케이션 전체의 평가를 위한 유용한 틀)을 배울 수 있다. 마지막으로 다양한 기능과 크기를 갖는 애플리케이션의 코드 검토를 수행하기 위한 포괄적이고 고차원적인 방법을 배울 수 있다.
2부, 소프트웨어 취약점(5~13장): 2부는 실질적인 점검 방법으로 관심을 옮겨 애플리케이션 코드에서 어떻게 특정 취약점을 찾아낼 수 있는지에 대해 배운다. 공격에 주로 이용되는 소프트웨어 취약 클래스들을 설명하며, 애플리케이션에서 어떻게 치명적인 보안 결함을 발견하는지에 대해 배울 수 있다. 실전에 적용할 수 있는 많은 보안 취약점의 사례가 주어지는데, 이러한 예를 통해 소스코드에서 소프트웨어 버그가 어떻게 동작하는지 이해할 수 있다.
3부, 소프트웨어 취약점 사례(14~18장)" 3부는 앞에서 배운 기법들의 실제적인 사례를 보여준다. 3부에서는 일반적인 애플리케이션 클래스들과 취약점을 내포하고 있는 여러 타입의 버그를 설명한다. 또한 2부에서 얻은 기술적인 지식을 어떻게 애플리케이션에 적용할 수 있는지 보여준다. 특히 네트워킹, 방화벽 기술, 웹 보안 기술 등을 설명하며, 각 장에서는 애플리케이션의 일반적인 프레임워크와 설계에서 일반적으로 나타날 수 있는 결함을 설명한다.
최소한 한 번은 책을 처음부터 끝까지 정독하는 것이 내용을 숙지하고 저자의 의도를 알 수 있는 가장 효과적인 학습 방법이다. 이런 접근 방법이 가장 효과적인 이유는 각 장마다 핵심적인 기술과 툴을 사용하기 위한 기회를 제공했기 때문이며, 이를 통한 애플리케이션 평가를 수행할 수 있다. 특히 각 섹션에서 중요한 개념에 대해 정리를 하는 데 사용한 칼럼과 참고에 관심을 기울이길 바란다.
물론 바쁜 일정 때문에 정독이 불가능한 독자를 위해 다른 타입의 검토에 초점을 맞춰 몇 개의 트랙으로 구분했다. 그러나 1~4장은 책 전체에 대한 개념을 확립하는 부분이므로, 모든 독자는 1부를 정독하기를 바란다. 그 후 필요에 따라 다음 트랙에 따라 해당 장들을 읽으면 된다.
유닉스 트랙(5~10장, 13장): 이 트랙은 일반적인 소프트웨어 취약점 클래스, 메모리 오염(corruption), 프로그램 제어 흐름, 형식이 정해진 데이터에 대해 언급하는 것으로 시작한다. 다음으로 다양한 유닉스 운영체제에 있는 특이점 때문에 비롯되는 유닉스 보안 문제점에 대해 설명하고, 마지막으로 대부분 플랫폼에서 공통적으로 존재하는 동기화 취약점을 언급한다.
윈도우 트랙(5~8장, 11~13장): 이 트랙도 유닉스와 마찬가지로 일반적으로 플랫폼이 갖고 있는 보안 문제를 다룬다. 그런 다음, 두 장에서 윈도우 API 및 관련 취약점을 설명한다. 마지막으로 이 트랙은 일반적인 동기화 취약점을 설명한다.
웹 보안 트랙(8장, 13장, 17~18장): 웹 진단은 일반적인 보안 취약점에 대한 이해뿐 아니라 웹 기반 프레임워크와 언어에 대한 이해를 필요로 한다. 이 트랙은 웹 기반 언어와 관련된 일반적인 취약 클래스를 설명하고, 웹에 특정하게 나타나는 보안을 언급한다. 유닉스/윈도우 관련 내용은 이 트랙에 포함되지 않았지만, 웹 애플리케이션의 운영 환경에 따라 연관이 있을 수 있다.
네트워크 응용 트랙(5~8장, 13장, 16장): 이 장들에서는 네트워크 클라이언트/서버 응용상에 나타날 수 있는 취약점을 잘 설명한다. 16장은 응용 프로토콜을 주로 설명하고, 또한 일반적인 응용 프로토콜 진단 방법에 대한 내용을 포함하고 있다. 다른 트랙과 마찬가지로 개발 환경에 따라 유닉스 또는 윈도우 관련 장이 필요할 수 있다.
네트워크 분석 트랙(5~8장, 13~16장): 이 트랙은 방화벽이나 IPS, 스니퍼, 라우팅 소프트웨어 등과 같은 네트워크 분석 애플리케이션을 상세히 설명한다. 널리 사용되는 네트워크 기반 기술 또는 이 제품에서 공통적으로 나타나는 일반적인 취약점들을 포함한다. 다른 트랙과 마찬가지로 개발 환경에 따라 유닉스 또는 윈도우 관련 장이 필요할 수 있다.
목차
목차
- 1부 소프트웨어 보안 평가 소개
- 1장 소프트웨어 기본 취약점
- 소개
- 취약점
- 보안 정책
- 보안 요구 사항
- 감사의 필요성
- 코드 감사와 블랙박스 테스트
- 코드 감사와 개발 라이프 사이클
- 취약점 분류
- 설계 취약점
- 구현 취약점
- 운영 취약점
- 구별의 애매모호함
- 공통점
- 입력과 데이터 흐름
- 신뢰 관계
- 가정과 잘못된 신뢰
- 인터페이스
- 환경 공격
- 예외 조건
- 정리
- 2장 설계 검토
- 소개
- 소프트웨어 설계의 기본
- 알고리즘
- 추상화와 분해
- 신뢰 관계
- 소프트웨어 설계의 원칙
- 설계 결함
- 보안 정책 강화
- 인증
- 인가
- 책임 추적성
- 기밀성
- 무결성
- 가용성
- 위협 모델링
- 정보 수집
- 애플리케이션 아키텍처 모델링
- 위협 식별
- 발견한 위협의 문서화
- 구현 리뷰에 대한 우선순위 매기기
- 정리
- 3장 운영 검토
- 소개
- 취약점 노출
- 공격 영역
- 안전하지 않은 초기 설정
- 접근 제어
- 불필요한 서비스
- 보안 채널
- 스푸핑과 식별
- 네트워크 프로파일
- 웹과 관련된 고려 사항
- HTTP 요청 방법
- 디렉토리 인덱싱
- 파일 처리기
- 인증
- 기본 사이트 설치
- 너무 자세한 에러 메시지
- 대중화된 관리자 인터페이스
- 보호 대책
- 개발 대책
- 호스트 기반 대책
- 네트워크 기반 대책
- 정리
- 4장 애플리케이션 검토 프로세스
- 소개
- 애플리케이션 검토 프로세스의 개요
- 근거
- 프로세스 개요
- 사전 평가
- 범위 산정
- 애플리케이션 접근
- 정보 수집
- 애플리케이션 검토
- 단순 검토의 회피
- 반복 프로세스
- 초기 준비
- 계획
- 작업
- 반영
- 문서화와 분석
- 보고와 치료 지원
- 코드 탐색
- 외부 흐름 민감도
- 추적 방향
- 코드 감사 전략
- 코드 이해 전략
- 후보 지점 전략
- 설계 일반화 전략
- 코드 감사 기법
- 내부 흐름 분석
- 서브시스템과 의존성 분석
- 코드 다시 읽기
- 탁상 검사
- 테스트 케이스
- 코드 감사자의 도구상자
- 소스코드 탐색기
- 디버거
- 이진 탐색 도구
- 퍼지 테스팅 도구
- 사례 연구: OpenSSH
- 사전 평가
- 구현 분석
- 고수준 공격
- 결과의 문서화
- 정리
- 2부 소프트웨어 취약점
- 5장 메모리 오염
- 소개
- 버퍼 오버플로우
- 프로세스 메모리 레이아웃
- 스택 오버플로우
- 힙 오버플로우
- Off-by-One 에러
- 전역, 정적 데이터 오버플로우
- 셸코드
- 코드 작성법
- 메모리에서 코드 찾기
- 보호 메커니즘
- 스택 쿠키
- 힙 구현 강화
- 비실행 스택과 힙 보호
- 주소 공간 구조 랜덤화
- SafeSEH
- 함수 포인트 난독화
- 메모리 오염의 영향 평가
- 메모리에서 버퍼의 위치
- 다른 데이터로 덮어쓰기 되는 것
- 덮어쓰기가 가능한 바이트 수
- 메모리를 오염시키는 데 사용될 수 있는 데이터
- 메모리 블록의 공유
- 적용해야 할 보호
- 정리
- 6장 C 언어 이슈
- 소개
- C 언어 배경
- 데이터 저장 개요
- 바이너리 인코딩
- 바이트 오더
- 보편적 구현
- 산술적 경계 조건
- 부호 없는 정수 경계
- 부호 있는 정수 경계
- 형 변환
- 개요
- 변환 규칙
- 단순 변환
- 정수 승격
- 정수 승격의 응용
- 일반 산술 변환
- 일반 산술 변환 응용
- 형 변환 요약
- 형 변환 취약점
- 부호 있는/부호 없는 변환
- 부호 확장
- 절단
- 비교
- 연산자
- sizeof 연산자
- 예상하지 못한 결과
- 포인터 연산
- 포인터 개요
- 포인터 연산 개요
- 취약점
- 기타 C 특성
- 연산 순서
- 구조체 패딩
- 우선순위
- 매크로/전처리기
- 오탈자
- 정리
- 7장 프로그램 구성 요소
- 소개
- 감사 변수의 사용
- 변수의 관계
- 구조체와 객체의 잘못된 처리
- 변수 초기화
- 산술 연산 경계
- 변수 타입 혼동
- 리스트와 테이블
- 제어 흐름 감사
- 반복문의 구조
- 흐름 전환 구문
- Switch 구문
- 함수 감사
- 함수 감사 로그
- 반환 값의 확인과 해석
- 함수 부수 효과
- 인자의 의미
- 메모리 관리에 대한 감사
- ACC 로그
- 할당 함수
- 할당자의 스코어카드와 에러의 영역
- 이중 메모리 해제
- 정리
- 8장 문자열과 메타문자
- 소개
- C 언어의 문자열 처리
- 범위가 제한되지 않은 문자열 함수
- 범위를 제한하는 문자열 함수
- 일반적인 이슈
- 메타문자
- 삽입된 구분자
- NUL 문자 주입
- 절단
- 일반적인 메타문자 형식
- 경로 메타문자
- C 형식 문자열
- 셸 메타문자
- 펄 open()
- SQL 질의
- 메타문자 필터링
- 메타문자 제거
- 이스케이프 메타문자
- 메타문자 회피
- 문자 집합과 유니코드
- 유니코드
- 윈도우 유니코드 함수
- 정리
- 9장 유닉스 I: 권한과 파일
- 소개
- 유닉스 기초
- 사용자와 그룹
- 파일과 디렉토리
- 프로세스
- 권한 모델
- 권한 프로그램
- 사용자 ID 함수
- 그룹 ID 함수
- 권한 취약점
- 권한의 무모한 사용
- 영구적인 권한 제거
- 임시 권한 제거
- 감사 권한 관리 코드
- 권한 확장
- 파일 보안
- 파일 ID
- 파일 권한
- 디렉토리 권한
- 파일 운영과 권한 관리
- 파일 생성
- 디렉토리 안정성
- 파일명과 경로
- 위험한 장소
- 흥미로운 파일
- 파일 내부
- 파일 디스크립터
- inode
- 디렉토리
- 링크
- 심볼릭 링크
- 하드 링크
- 경쟁 상태
- 검사 시점과 사용 시점
- stat() 함수 계열
- 돌아온 파일 경쟁
- 권한 상승
- 소유권 상승
- 디렉토리 권한 획득
- 임시 파일
- 고유 파일 생성
- 파일 재사용
- 임시 디렉토리 청소
- 표준 입출력 파일 인터페이스
- 파일 열기
- 파일에서 읽기
- 파일에 쓰기
- 파일 닫기
- 정리
- 10장 유닉스 II: 프로세스
- 소개
- 프로세스
- 프로세스 생성
- fork() 변형 모델
- 프로세스 종료
- fork()와 파일 오픈
- 프로그램 호출
- 직접 호출
- 간접 호출
- 프로세스 속성
- 프로세스 속성 유지
- 리소스 제한
- 파일 디스크립터
- 환경 배열
- 프로세스 그룹, 세션, 터미널
- 프로세스 간 통신
- 파이프
- 명명된 파이프
- 시스템 V IPC
- 유닉스 도메인 소켓
- 원격 프로시저 호출
- RPC 정의 파일
- RPC 디코딩 경로
- 인증
- 정리
- 11장 윈도우 I: 객체와 파일 시스템
- 소개
- 배경
- 객체
- 객체 네임스페이스
- 객체 핸들
- 세션
- 보안 ID
- 로그온 권한
- 액세스 토큰
- 보안 기술자
- 액세스 마스크
- ACL 상속
- 기술자 프로그래밍 인터페이스
- ACL 권한 감사
- 프로세스와 스레드
- 프로세스 로딩
- ShellExecute와 ShellExecuteEx
- DLL 로딩
- 서비스
- 파일 접근
- 파일 권한
- 파일 I/O API
- 링크
- 레지스트리
- 키 권한
- 키와 값 스쿼팅
- 정리
- 12장 윈도우 II: 프로세스 간 통신
- 소개
- 윈도우 IPC 보안
- 리다이렉터
- 가장
- 윈도우 메시징
- 윈도우 스테이션 객체
- 데스크톱 객체
- 윈도우 메시지
- 섀터 공격
- DDE
- 터미널 세션
- 파이프
- 파이프 권한
- 명명된 파이프
- 파이프 생성
- 파이프에서의 가장
- 파이프 스쿼팅
- 메일슬롯
- 메일슬롯 권한
- 메일슬롯 스쿼팅
- 원격 프로시저 호출
- RPC 연결
- RPC 전송
- 마이크로소프트 인터페이스 정의 언어
- IDL 파일 구조
- 애플리케이션 설정 파일
- RPC 서버
- RPC에서의 가장
- 컨텍스트 핸들과 상태
- RPC에서의 스레드
- RPC 애플리케이션 감사
- COM
- COM: 빠른 지침서
- DCOM 설정 유틸리티
- DCOM 서브시스템 접근 권한
- DCOM 접근 제어
- DCOM에서의 가장
- MIDL 다시 살펴보기
- 액티브 템블릿 라이브러리
- DCOM 애플리케이션 감사
- COM 등록 리뷰
- 액티브X 보안
- 정리
- 13장 동기화와 상태
- 소개
- 동기화 문제
- 재진입과 비동기 안전 코드
- 경쟁 상태
- 기아 상태와 교착 상태
- 프로세스 동기화
- 시스템 V 프로세스 동기화
- 윈도우 프로세스 동기화
- 내부 프로세스 동기화의 취약점
- 신호
- 신호 전송
- 신호 처리
- 위치 점프
- 신호 취약점
- 신호 스코어보드
- 스레드
- PThreads API
- 윈도우 API
- 스레딩 취약점
- 정리
- 3부 소프트웨어 취약점 사례
- 14장 네트워크 프로토콜
- 소개
- 인터넷 프로토콜
- IP 주소 기초
- IP 패킷의 구조
- IP 헤더 검증 기초
- IP 옵션 처리
- 발신지 라우팅
- 단편화
- UDP
- 기본적인 UDP 헤더 검증
- UDP 이슈
- 전송 제어 프로토콜
- 기본적인 TCP 헤더 검증
- TCP의 옵션 처리
- TCP 커넥션
- TCP 스트림
- TCP 처리
- 정리
- 15장 방화벽
- 소개
- 방화벽 개요
- 프록시와 패킷 필터
- 공격 지점
- 프록시 방화벽
- 패킷 필터링 방화벽
- 상태 비보존 방화벽
- TCP
- UDP
- FTP
- 단편화
- 간단한 상태 보존 방화벽
- TCP
- UDP
- 방향성
- 단편화
- 상태 보존 인스펙션 방화벽
- 계층화 이슈
- 스푸핑 공격
- 떨어진 곳에서의 스푸핑
- 근거리에서의 스푸핑
- 멀리 떨어진 곳에서의 유령 공격
- 정리
- 16장 네트워크 응용 프로토콜
- 소개
- 응용 프로토콜 감사
- 문서 수집
- 알려지지 않은 프로토콜의 요소 확인
- 데이터 타입과 프로토콜 매치
- 데이터 검증
- 시스템 리소스 접근
- 하이퍼텍스트 전송 규약
- 헤더 해석
- 리소스 접근
- 유틸리티 함수
- 데이터 포스팅
- 인터넷 보안 연합과 키 관리 프로토콜
- 페이로드
- 페이로드 유형
- 암호화 취약점
- 추상 구문 기법(ASN.1)
- 기본 인코딩 규칙
- 표준 인코딩과 식별 인코딩
- BER, CER, DER 구현의 취약점
- 묶음 인코딩 규칙(PER)
- XML 인코딩 규칙
- XER 취약점
- 도메인 네임 시스템
- 도메인 네임과 리소스 레코드
- 네임 서버와 리졸버
- 영역
- 리소스 레코드 규약
- 기본 사용 사례
- DNS 프로토콜 구조 입문
- DNS 네임
- 길이 변수
- DNS 스푸핑
- 정리
- 17장 웹 애플리케이션
- 소개
- 웹 기술 개요
- 기본
- 정적 콘텐츠
- CGI
- 웹 서버 API
- 서버 측 인클루드
- 서버 측 변환
- 서버 측 스크립팅
- HTTP
- 개요
- 버전
- 헤더
- 메소드
- 매개변수와 폼
- 상태(State)와 HTTP 인증
- 개요
- 클라이언트 IP 주소
- 레퍼러 요청 헤더
- HTML과 URL에 상태 삽입
- HTTP 인증
- 쿠키
- 세션
- 아키텍처
- 중복
- 프레젠테이션 로직
- 비즈니스 로직
- 다층 구조
- 비즈니스 계층
- 웹 계층: 모델-뷰-컨트롤러
- 문제 영역
- 클라이언트 관점
- 클라이언트 제어
- 페이지 흐름
- 세션
- 인증
- 인가와 접근 제어
- 암호화와 SSL/TLS
- 피싱과 위장
- 일반 취약점
- SQL 인젝션
- 운영체제와 파일 시스템 상호작용
- XML 인젝션
- XPath 인젝션
- 크로스사이트 스크립팅
- 스레딩 이슈
- C/C++ 문제
- 웹의 척박한 현실
- 점검 전략
- 정리
- 18장 웹 테크놀로지
- 소개
- 웹 서비스와 서비스 지향 아키텍처
- SOAP
- REST
- AJAX
- 웹 애플리케이션 플랫폼
- CGI
- 인덱스된 쿼리
- 환경 변수
- 경로 혼란
- 펄
- SQL 인젝션
- 파일 접근
- 셸 호출
- 파일 포함
- 인라인 계산
- 크로스사이트 스크립팅
- 테인트 모드
- PHP
- SQL 인젝션
- 파일 접근
- 셸 호출
- 파일 포함
- 인라인 계산
- 크로스사이트 스크립팅
- 설정
- 자바
- SQL 인젝션
- 파일 접근
- 셸 호출
- 파일 포함
- JSP 파일 포함
- 인라인 계산
- 크로스사이트 스크립팅
- 스레딩 이슈
- 설정
- ASP
- SQL 인젝션
- 파일 접근
- 셸 호출
- 파일 포함
- 인라인 계산
- 크로스사이트 스크립팅
- 설정
- ASP.NET
- SQL 인젝션
- 파일 접근
- 셸 호출
- 파일 포함
- 인라인 계산
- 크로스사이트 스크립팅
- 설정
- ViewState
- 정리