logo
logo
x
바코드검색
BOOKPRICE.co.kr
책, 도서 가격비교 사이트
바코드검색

인기 검색어

실시간 검색어

검색가능 서점

도서목록 제공

안전한 소프트웨어를 위한 보안 코딩과 평가 세트 - 전3권

안전한 소프트웨어를 위한 보안 코딩과 평가 세트 - 전3권

마크 다우드, 존 맥도날드, 저스틴 쉬허, 로버트 C. 시코드 (지은이), 현동석, 삼성SDS 정보보안연구회 (옮긴이)
  |  
에이콘출판
2014-01-20
  |  
88,000원

일반도서

검색중
서점 할인가 할인률 배송비 혜택/추가 실질최저가 구매하기
yes24 로딩중
교보문고 로딩중
영풍문고 로딩중
인터파크 로딩중
11st 로딩중
G마켓 로딩중
쿠팡 로딩중
쿠팡로켓 로딩중
notice_icon 검색 결과 내에 다른 책이 포함되어 있을 수 있습니다.

중고도서

검색중
로딩중

e-Book

검색중
서점 정가 할인가 마일리지 실질최저가 구매하기
로딩중

책 이미지

안전한 소프트웨어를 위한 보안 코딩과 평가 세트 - 전3권

책 정보

· 제목 : 안전한 소프트웨어를 위한 보안 코딩과 평가 세트 - 전3권 
· 분류 : 국내도서 > 컴퓨터/모바일 > OS/Networking > 네트워크 보안/해킹
· ISBN : 9788960775176
· 쪽수 : 1996쪽

책 소개

능력 있는 보안 컨설턴트이자 VPN 같은 애플리케이션의 알려지지 않은 취약점을 개인적으로 연구하는 저자들의 특별한 경험을 바탕으로, 감지하기 어렵고 잘 숨겨진 보안 취약점들을 처음부터 끝까지 밝혀내는 방법을 소개한다.

목차

『소프트웨어 보안 평가 The Art of Software Security Assessment』

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
___정리

『버그 없는 안전한 소프트웨어를 위한 CERT® C 프로그래밍』

| 1장 | 표준 사용법
___시스템 품질
___자동 생성 코드
___표준 준수

| 2장 | 전처리기(PRE)
___PRE00-C. 함수형의 매크로보다는 인라인이나 정적 함수를 사용하라
___PRE01-C. 매크로에서는 매개변수에 괄호를 사용하라
___PRE02-C. 매크로로 치환될 영역은 반드시 괄호로 둘러싸야 한다
___PRE03-C. 타입 인코딩 시 매크로 정의 대신 타입 정의를 사용하라
___PRE04-C. 표준 헤더 파일 이름을 재사용하지 마라
___PRE05-C. 토큰들을 연결하거나 문자열 변환을 할 때 매크로 치환을 고려하라
___PRE06-C. 헤더 파일에 항상 인클루전 가드를 둬라
___PRE07-C. 연속되는 물음표를 사용하지 마라
___PRE08-C. 중복된 헤더 파일 이름이 없는지가 보장돼야 한다
___PRE09-C. 안전한 함수를 덜 안전한 함수로 바꾸지 마라
___PRE10-C. 복수 구문 매크로를 do-while 루프로 감싸라
___PRE30-C. 유니버설 문자열 이름을 여러 문자열을 붙여서 만들지 마라
___PRE31-C. 절대로 불안전한 매크로를 할당, 증가, 감소, 메모리 변수 접근, 함수 호출과 함께 사용하지 마라

| 3장 | 선언과 초기화(DCL)
___DCL00-C. 변하지 않는 객체는 const로 보장해둬라
___DCL01-C. 내부 스코프에서 변수 이름을 재사용하지 마라
___DCL02-C. 시각적으로 구별되는 식별자를 사용하라
___DCL03-C. 상수 수식의 값을 테스트할 때 정적 어썰션을 사용하라
___DCL04-C. 한 번에 여러 변수를 선언하지 마라
___DCL05-C. 코드의 가독성을 높이기 위해 타입 정의를 사용하라
___DCL06-C. 프로그램 로직상의 고정적인 값을 나타낼 때는 의미 있는 심볼릭 상수를 사용하라
___DCL07-C. 함수 선언 시 적절한 타입 정보를 포함시켜라
___DCL08-C. 상수 정의에서는 상수 간의 관계가 적절하게 나타나도록 정의하라
___DCL09-C. errno 에러 코드를 반환하는 함수의 반환 타입을 errno_t로 정의하라
___DCL10-C. 가변 인자를 가진 함수에서는 함수 작성자와 함수 사용자 간의 약속이 지켜져야 한다
___DCL11-C. 가변 인자 함수와 연관된 타입 문제를 파악하고 있어야 한다
___DCL12-C. 불투명한 타입을 사용해 추상 데이터 타입을 구현하라
___DCL13-C. 함수에 의해 바뀌지 않을 값에 대한 포인터를 함수의 매개변수로 사용할 때는 const로 정의하라
___DCL14-C. 여러 컴파일 단위를 거치는 전역 변수 초기화의 순서에 대해서는 어떤 가정도 하지 마라
___DCL15-C. 현재 범위를 넘어서까지 사용되지 않을 객체는 static으로 선언하라
___DCL30-C. 객체를 선언할 때 적절한 지속공간을 지정하라
___DCL31-C. 식별자를 사용하기 전에 먼저 선언하라
___DCL32-C. 서로에게 보이는 식별자가 유일한지를 보장하라
___DCL33-C. 함수 인자에서 restrict로 지정된 소스 포인터와 목적 포인터가 동일한 객체를 참조하지 않게 하라
___DCL34-C. 캐시될 수 없는 데이터에는 volatile을 사용하라
___DCL35-C. 함수 정의와 맞지 않는 타입으로 함수를 변환하지 마라
___DCL36-C. 링크 분류에서 충돌되는 식별자를 선언하지 마라

| 4장 | 표현식(EXP)
___EXP00-C. 연산자 우선순위를 나타내는 데 괄호를 사용하라
___EXP01-C. 포인터로 가리키는 타입의 크기를 결정하기 위해 포인터의 크기를 사용하지 마라
___EXP02-C. 논리 연산자 AND와 OR의 단축 평가 방식을 알고 있어라
___EXP03-C. 구조체의 크기가 구조체 멤버들 크기의 합이라고 가정하지 마라
___EXP04-C. 구조체끼리 바이트 단위로 비교하지 마라
___EXP05-C. const를 캐스트로 없애지 마라
___EXP06-C. sizeof의 피연산자가 다른 부수 효과를 가지면 안 된다
___EXP07-C. 표현식의 상수에 특정 값을 가정함으로써 상수를 사용해 얻는 이득을 없애지 마라
___EXP08-C. 포인터 연산이 정확하게 수행되고 있는지 보장하라
___EXP09-C. 타입이나 변수의 크기를 결정할 때는 sizeof를 사용하라
___EXP10-C. 하위 표현식의 평가 순서나 부수 효과가 발생할 수 있는 영역의 순서에 의존하지 마라
___EXP11-C. 호환되지 않는 타입들에는 연산자를 적용하지 마라
___EXP12-C. 함수에 의해 반환되는 값을 무시하지 마라
___EXP30-C. 시퀀스 포인트들 간의 평가 순서에 의존하지 마라
___EXP31-C. 어썰션의 부수 효과를 피하라
___EXP32-C. volatile 지정자를 캐스팅하여 없애지 마라
___EXP33-C. 초기화되지 않은 메모리를 참조하지 마라
___EXP34-C. 널포인터가 역참조되지 않음을 보장하라
___EXP35-C. 함수의 반환 값을 인접한 다음 시퀀스 포인트에서 접근하거나 수정하지 마라
___EXP36-C. 포인터를 더 엄격하게 할당된 포인터 타입으로 변환하지 마라
___EXP37-C. API에 의해 의도된 인자들로 함수를 호출하라
___EXP38-C. 유효하지 않은 타입이나 비트 필드 멤버들에 대해 offsetof(`)를 호출하지 마라

| 5장 | 정수(INT)
___INT00-C. 구현 시 사용되는 데이터 모델을 이해하고 있어라
___INT01-C. 객체의 크기를 나타내는 정수 값은 rsize_t나 size_t를 사용하라
___INT02-C. 정수 변환 규칙을 이해하라
___INT03-C. 안전한 정수 라이브러리를 사용하라
___INT04-C. 불분명한 소스에서 얻어지는 정수 값은 제한을 강제하라
___INT05-C. 모든 가능한 입력을 처리할 수 없다면 문자 데이터 변환을 위해 입력 함수를 사용하지 마라
___INT06-C. 문자열 토큰을 정수로 변환할 때는 strtol(`)이나 관련 함수를 사용하라
___INT07-C. 숫자 값에는 명시적으로 signed나 unsigned 값을 사용하라
___INT08-C. 모든 정수가 지정한 범위 내에 있음을 확인하라
___INT09-C. 열거형 상수가 유일한 값으로 매핑되도록 보장하라
___INT10-C. % 연산자를 쓸 때 나머지가 양수라고 가정하지 마라
___INT11-C. 정수를 포인터로 혹은 그 반대로 변환할 때 주의하라
___INT12-C. 표현식에서 signed, unsigned 표시가 없는 int 비트 필드의 타입을 가정하지 마라
___INT13-C. 비트 연산자는 unsigned 피연산자에만 사용하라
___INT14-C. 동일한 데이터에 비트 연산자와 산술 연산자를 수행하지 마라
___INT15-C. 프로그래머 정의 정수 타입의 포맷 지정 I/O에 대해 intmax_t나 uintmax_t를 사용하라
___INT30-C. unsigned 정수 연산이 래핑되지 않도록 주의하라
___INT31-C. 정수 변환으로 데이터가 손실되거나 잘못 처리되지 않도록 주의하라
___INT32-C. signed 정수의 연산이 오버플로되지 않도록 보장하라
___INT33-C. 나눗셈이나 모듈로 연산에서 0으로 나누는 에러가 발생하지 않게 하라
___INT34-C. 음수나 피연산자의 비트보다 더 많은 비트를 시프트하지 마라
___INT35-C. 정수 표현식으로 비교하거나 할당할 때 더 큰 타입으로 표현식을 평가하라

| 6장 | 부동소수점(FLP)
___FLP00-C. 부동소수점 수의 제한을 이해하라
___FLP01-C. 부동소수점 표현식을 재배치할 때 주의하라
___FLP02-C. 정확한 계산이 필요할 때는 부동소수점 수를 배제할 수 있는지 고려하라
___FLP03-C. 부동소수점 에러를 발견하고 처리하라
___FLP30-C. 부동소수점 변수를 루프 카운터로 사용하지 마라
___FLP31-C. 함수에 복소수를 사용하면서 실제 값을 얻을 거라 기대하지 마라
___FLP32-C. 수학 함수에서 도메인 에러나 영역 에러를 찾고 예방하라
___FLP33-C. 부동소수점 연산용 정수는 먼저 부동소수점으로 바꿔라
___FLP34-C. 부동소수점 변환이 새로운 타입의 범위 안에 들어가는지 확인하라

| 7장 | 배열(ARR)
___ARR00-C. 배열이 어떻게 동작하는지 이해하라
___ARR01-C. 배열의 크기를 얻을 때 포인터를 sizeof의 피연산자로 사용하지 마라
___ARR02-C. 암시적으로 초기화된 경우라도 배열의 경계를 명시적으로 지정하라
___ARR30-C. 배열의 인덱스가 유효한 범위 안에 있음을 보장하라
___ARR31-C. 모든 소스 파일에서 일관된 배열 표기를 사용하라
___ARR32-C. 가변 배열에서 크기를 나타내는 인자가 유효한 범위에 있음을 보장하라
___ARR33-C. 충분한 크기의 공간에서 복사가 진행됨을 보장하라
___ARR34-C. 표현식에서 배열 타입이 호환 가능함을 보장하라
___ARR35-C. 루프에서 반복자가 배열의 끝을 넘어 접근하지 않게 하라
___ARR36-C. 같은 배열을 참조하고 있지 않다면 두 개의 포인터를 빼거나 비교하지 마라
___ARR37-C. 배열이 아닌 객체에 대한 포인터에 정수를 더하거나 빼지 마라
___ARR38-C. 반환 값이 유효한 배열 원소를 참조하고 있지 않은 경우 포인터에 정수를 더하거나 빼지 마라

| 8장 | 문자와 문자열(STR)
___STR00-C. 적절한 타입으로 문자를 표현하라
___STR01-C. 문자열 관리를 위해 일관된 계획을 사용해 일관되게 구현하라
___STR02-C. 복잡한 하위 시스템으로 전달되는 데이터를 검열하라
___STR03-C. 널문자로 종료된 문자열이 부적절하게 잘리지 않게 하라
___STR04-C. 기본 문자 집합에서는 문자들을 위해 char를 사용하라
___STR05-C. 문자열 상수를 가리키는 포인터는 const로 선언하라
___STR06-C. strtok(`)에서 파싱되는 문자열이 보존된다고 가정하지 마라
___STR07-C. 문자열을 처리하는 코드를 수정할 때는 TR 24731을 사용하라
___STR08-C. 문자열을 처리하는 새로운 코드를 개발할 때 관리 문자열을 사용하라
___STR30-C. 문자열 리터럴을 수정하려고 하지 마라
___STR31-C. 문자열을 위한 공간이 문자 데이터와 널 종료문자를 담기에 충분함을 보장하라
___STR32-C. 요구되는 대로 문자열을 널문자로 종료하라
___STR33-C. 와이드 문자 스트링의 크기를 정확히 하라
___STR34-C. 문자들을 더 큰 타입인 정수로 변환하기 전에 unsigned 타입으로 캐스팅하라
___STR35-C. 경계가 불분명한 소스로부터 고정된 길이의 배열에 데이터를 복사하지 마라
___STR36-C. 문자열 리터럴로 초기화된 문자 배열의 경계를 지정하지 마라
___STR37-C. 문자를 처리하는 함수로 전달되는 인자는 반드시 unsigned char로 표현 가능해야 한다

| 9장 | 메모리 관리(MEM)
___MEM00-C. 동일한 추상화 레벨의 같은 모듈 안에서 메모리를 할당하고 해제하라
___MEM01-C. free(`) 후 즉시 포인터에 새로운 값을 저장하라
___MEM02-C. 메모리 할당 함수의 반환 값을 즉시 할당된 타입의 포인터로 변환시켜라
___MEM03-C. 재사용을 위해 반환된 재사용 가능한 리소스에 있는 중요한 정보를 클리어하라
___MEM04-C. 크기가 0인 할당을 수행하지 마라
___MEM05-C. 큰 스택 할당을 피하라
___MEM06-C. 중요한 데이터가 디스크에 기록되지 않도록 보장하라
___MEM07-C. calloc(`)의 인자가 곱해지는 경우 size_t로 표현될 수 있게 하라
___MEM08-C. 동적으로 할당된 배열을 리사이즈하는 경우에만 realloc(`)을 사용하라
___MEM09-C. 메모리 할당 루틴이 메모리를 초기화해줄 것이라 가정하지 마라
___MEM10-C. 포인터 검증 함수를 사용하라
___MEM30-C. 해제된 메모리에 접근하지 마라
___MEM31-C. 동적으로 할당된 메모리는 한 번만 해제하라
___MEM32-C. 메모리 할당 에러를 찾아 해결하라
___MEM33-C. 유연한 배열 원소에 정확한 문법을 사용하라
___MEM34-C. 동적으로 할당된 메모리만 해제하라
___MEM35-C. 객체에 충분한 메모리를 할당하라

| 10장 | 입력과 출력(FIO)
___FIO00-C. 포맷 문자열을 사용할 때 주의하라
___FIO01-C. 파일 이름이나 식별자를 사용하는 함수를 쓸 때 주의하라
___FIO02-C. 신뢰할 수 없는 소스로부터 얻은 경로 이름을 정형화해 사용하라
___FIO03-C. fopen(`)이나 파일 생성에 대해 특정 조건을 가정하지 마라
___FIO04-C. 입출력 에러를 찾아 해결하라
___FIO05-C. 여러 파일 속성을 통해 파일을 식별하라
___FIO06-C. 적절한 접근 권한으로 파일을 생성하라
___FIO07-C. rewind(`)보다 fseek(`)을 사용하라
___FIO08-C. 열린 파일에 대해 remove(`)를 호출할 때 주의하라
___FIO09-C. 시스템 간에 바이너리 데이터를 전송할 때는 주의하라
___FIO10-C. rename(`) 함수를 사용할 때는 주의하라
___FIO11-C fopen(`)의 모드 매개변수를 지정할 때 주의하라
___FIO12-C. setbuf(`)보다 setvbuf(`)를 사용하라
___FIO13-C. 방금 읽은 한 개의 문자 외의 것을 다시 넣지 마라
___FIO14-C. 파일 스트림에서 텍스트 모드와 바이너리 모드의 차이를 이해하라
___FIO15-C. 파일 연산이 안전한 디렉토리에서 수행되고 있음을 보장하라
___FIO16-C. jail을 만들어 파일 접근을 제한하라
___FIO30-C. 포맷 문자열에서 사용자 입력을 배제하라
___FIO31-C. 동시에 같은 파일을 여러 번 열지 마라
___FIO32-C. 파일에만 적용 가능한 연산을 장치에 대해 수행하지 마라
___FIO33-C. 정의되지 않은 동작을 초래하는 입출력 에러를 발견하고 처리하라
___FIO34-C. 문자 I/O 함수의 반환 값을 캡처할 때는 int를 사용하라
___FIO35-C. sizeof(int) == sizeof(char)일 때는 EOF나 파일 에러를 찾기 위해 feof(`)와 ferror(`)를 사용하라
___FIO36-C. fgets(`)를 사용할 때 개행문자가 읽힌다고 가정하지 마라
___FIO37-C. 문자 데이터를 읽었다고 가정하지 마라
___FIO38-C. 입출력 FILE 객체를 복사해 사용하지 마라
___FIO39-C. 플러시나 위치 조정 함수 호출 없이 스트림으로부터 입출력을 교대로 수행하지 마라
___FIO40-C. fgets(`) 실패 시 문자열을 리셋하라
___FIO41-C. 부수 효과가 있는 스트림 인자로 getc(`)나 putc(`)를 호출하지 마라
___FIO42-C. 더 이상 필요 없어진 파일이 적절히 닫혔는지 확인하라
___FIO43-C. 공유 디렉토리에 임시 파일을 생성하지 마라
___FIO44-C. fsetpos(`)에는 fgetpos(`)에서 반환된 값만 사용하라

| 11장 | 환경(ENV)
___ENV00-C. getenv(`)에서 반환한 문자열을 가리키는 포인터를 저장하지 마라
___ENV01-C. 환경변수의 크기를 함부로 가정하지 마라
___ENV02-C. 이름이 같은 여러 개의 환경변수가 존재할 수 있음을 알아두자
___ENV03-C. 외부 프로그램을 호출할 때는 환경변수를 정리하라
___ENV04-C. 커맨드 프로세서가 필요하지 않다면 system(`)을 호출하지 마라
___ENV30-C. getenv(`)가 반환한 문자열을 수정하지 마라
___ENV31-C. 환경변수의 값을 무효화할 수 있는 연산을 수행했다면 더 이상 그 값에 의존하지 마라
___ENV32-C. atexit 핸들러는 반환 외의 방법으로 종료돼선 안 된다

| 12장 | 시그널(SIG)
___SIG00-C. 인터럽트될 수 없는 시그널 핸들러로 처리되는 시그널을 마스크하라
___SIG01-C. 구현마다 다른 시그널 핸들러의 지속성에 대한 세부사항을 이해하라
___SIG02-C. 일반적인 기능을 구현하는 경우에는 시그널의 사용을 피하라
___SIG30-C. 시그널 핸들러에서는 비동기적으로 안전한 함수만 호출하라
___SIG31-C. 시그널 핸들러에서 공유 객체에 접근하거나 수정하지 마라
___SIG32-C. 시그널 핸들러 안에서 longjmp(`)를 호출하지 마라
___SIG33-C. raise(`) 함수를 재귀적으로 호출하지 마라
___SIG34-C. 인터럽트 가능한 시그널 핸들러 안에서 signal(`)을 호출하지 마라

| 13장 | 에러 처리(ERR)
___ERR00-C. 일관되고 이해할 수 있는 에러 처리 정책을 적용하고 구현하라
___ERR01-C. FILE 스트림 에러 체크 시 errno보다 ferror(`)를 사용하라
___ERR02-C. in-band 에러 표시자를 피하라
___ERR03-C. TR 24731-1에 정의된 함수를 호출할 때는 런타임 지정 핸들러를 사용하라
___ERR04-C. 적절한 종료 방법을 선택하라
___ERR05-C. 애플리케이션 독립적인 코드는 별도의 에러 처리 설명이 없는 에러 감지 코드를 제공해야 한다
___ERR06-C. assert(`)와 abort(`)의 종료 시 동작을 이해하라
___ERR30-C. errno를 사용하는 라이브러리 함수를 호출하기 전에 errno 값을 0으로 설정하고, 함수가 에러를 의미하는 값을 반환했을 때는 errno 값을 체크하라
___ERR31-C. errno를 재정의하지 마라
___ERR32-C. 애매한 errno 값에 의존하지 마라

| 14장 | 기타(MSC)
___MSC00-C. 컴파일 시 높은 경고 메시지 옵션을 줘라
___MSC01-C. 논리적으로 완전해지도록 노력하라
___MSC02-C. 실수로 누락하지 않도록 하라
___MSC03-C. 실수로 추가하지 않도록 하라
___MSC04-C. 주석은 일관되고 가독성 있게 사용하라
___MSC05-C. time_t 타입 값을 직접 조작하지 마라
___MSC06-C. 중요한 데이터를 다룰 때는 컴파일러 최적화를 고려하라
___MSC07-C. 죽은 코드를 찾아 제거하라
___MSC08-C. 라이브러리 함수는 자신의 매개변수를 검증해야 한다
___MSC09-C. 문자 인코딩: 안전을 위해 ASCII의 부분집합을 사용하라
___MSC10-C. 문자 인코딩: UTF-8 관련 이슈
___MSC11-C. 어썰션을 사용한 부적절한 진단 테스트
___MSC12-C. 아무 효과도 없는 코드를 찾아 제거하라
___MSC13-C. 사용되지 않는 값을 찾아 제거하라
___MSC14-C. 불필요하게 플랫폼 의존성을 끌어들이지 마라
___MSC15-C. 정의되지 않은 동작에 의존하지 마라
___MSC30-C. 의사난수를 만들기 위해 rand(`) 함수를 사용하지 마라
___MSC31-C. 반환 값이 적절한 타입으로 비교되는지 보장하라

| 부록 | POSIX(POS)
___POS00-C. 멀티스레드의 경쟁 상태를 피하라
___POS01-C. 링크의 유무를 확인하라
___POS02-C. 가장 적은 권한의 원리를 따르라
___POS30-C. readlink(`) 함수를 알맞게 사용하라
___POS31-C. 다른 스레드 뮤텍스를 잠금해제하거나 없애지 마라
___POS32-C. 멀티스레드 환경에서 비트 필드를 사용할 때는 뮤텍스를 도입하라
___POS33-C. vfork(`)를 사용하지 마라
___POS34-C. putenv(`)에 자동 변수에 대한 포인터를 인자로 전달하지 마라
___POS35-C. 심볼릭 링크를 체크할 때 교착 상태를 피하라
___POS36-C. 권한을 취소할 때 해제 순서가 올바른지 확인하라
___POS37-C. 권한 취소가 성공적으로 수행됐는지 보장하라

저자소개

마크 다우드 (지은이)    정보 더보기
맥아피(McAfee)의 수석 보안 아키텍트로 근무하고 있으며, 애플리케이션 보안 분야에서 다년간의 경험을 갖고 있다. 인터넷 보안 시스템(ISS)인 엑스포스(X-Force)에서 다년간 수석 연구가로 근무한 경험을 기반으로 유비쿼터스 인터넷 소프트웨어 분야에서 수많은 취약점을 발견했으며, 마이크로소프트의 익스체인지 서버 같은 메일 전송 서비스, OpenSSH, 파이어폭스의 모질라 같은 인터넷 브라우저, VPN, 마이크로소프트의 SSL 같은 분야에서 주소 체계 등의 심각한 문제점을 찾거나 식별하는 데 탁월한 능력을 보여준다. 그의 연구는 산업계의 유명 컨퍼런스인 블랙햇이나 럭스콘(RUXCON)의 주제를 포괄하고 있다.
펼치기
존 맥도날드 (지은이)    정보 더보기
다양한 분야의 기술 및 플랫폼을 포괄해 진보된 애플리케이션 보안 평가를 수행할 수 있는 전문성을 가진 네오햅시스(Neohapsis)의 상급 컨설턴트다. 보안 아키텍처나 맥아피, GmbH, 시티은행 등을 위한 취약점 연구가로 높은 평판을 갖고 있다. 취약점 연구가로서 솔라리스, BSD, 방화벽, OpenSSL, BIND 등의 이슈를 포함해 많은 분야의 취약점을 해결하는 데 도움을 주거나 취약점을 식별한다.
펼치기
저스틴 쉬허 (지은이)    정보 더보기
애플리케이션 보안 점검을 수행하는 네오햅시스의 상급 컨설턴트이자 점검 리더로서 이식된 장치의 펌웨어부터 배포되는 기업 웹 애플리케이션까지 시스템의 다양한 범위에 걸쳐 보안 평가를 수행하고 있다. 네오햅시스에 들어가기 전에는 미국 국방부 및 관련 업체의 컴퓨터 보안 분야에서 10년 동안 근무했다. 대정부서비스를 할 때에는 미국 국가안전보장국(National Security Agency)의 침투 테스트 팀(Red Team)의 수석 선임 연구원의 역할을 했다.
펼치기
로버트 C. 시코드 (지은이)    정보 더보기
NCC 그룹의 기술 이사로 C, C++ 및 다른 언어의 시큐어 코딩을 개발하고 가르친다. C 프로그래밍 언어의 국제 표준화 작업 그룹인 ISO/IEC JTC1/SC22/WG14의 전문가이기도 하다. 또한, 『CERT C 프로그래밍 2/e』(에이콘출판, 2022)와 『(개정판) C & C++ 시큐어 코딩』(에이콘출판, 2015), 『자바 시큐어 코딩 가이드라인』(인피니티북스, 2017) 등의 다른 책도 저술했다. 소프트웨어 보안과 구성 요소 기반 소프트웨어 엔지니어링, 웹 기반 시스템 설계, 레거시 시스템 현대화, 구성 요소 저장소 및 검색 엔진 그리고 사용자 인터페이스 설계 및 개발에 관한 50편 이상의 논문도 발표했다.
펼치기
현동석 (옮긴이)    정보 더보기
마이크로소프트 본사에서 분산 저장소와 코타나 서비스를 개발하다 귀국해 네이버 검색 시스템의 가시화 프로젝트를 진행 중이다. 개발과 디자인이 함께 어우러져 진행되는 일에 관심이 많으며 단순함과 간결함을 절대 포기하면 안 되는 미덕으로 여기는 개발자다. 에이콘출판사에서 펴낸 『버그 없는 안전한 소프트웨어를 위한 CERT C 프로그래밍』(2010)을 번역했고, 『구글 개발자가 들려주는-HTML5 활용』(2010)을 공역했다.
펼치기
삼성SDS 정보보안연구회 (엮은이)    정보 더보기
2001년 해킹바이러스연구회로 시작한 삼성SDS 정보보안연구회는 해킹 기술을 공격자 입장에서 생각하고, 이를 토대로 안전한 시스템 운영 방안을 찾기 위해 보안성 검토 기술, 점검 기술, 신기술 트렌드 등을 연구하는 사내 연구회다. 보안에 대해 이야기하며 이를 통한 발전을 지향한다. 에이콘출판사에서 출간한 『소프트웨어 보안 평가 The Art of Software Security Assessment』(2013)를 번역했다.
펼치기
삼성SDS 정보보안연구회의 다른 책 >

추천도서

이 포스팅은 쿠팡 파트너스 활동의 일환으로,
이에 따른 일정액의 수수료를 제공받습니다.
도서 DB 제공 : 알라딘 서점(www.aladin.co.kr)
최근 본 책