책 이미지
책 정보
· 분류 : 국내도서 > 컴퓨터/모바일 > OS/Networking > 네트워크 보안/해킹
· ISBN : 9788960775176
· 쪽수 : 1996쪽
책 소개
목차
『소프트웨어 보안 평가 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. 권한 취소가 성공적으로 수행됐는지 보장하라