분야별도서 > 컴퓨터공학 > 해킹/보안

분야별도서

자바 시큐어 코딩 가이드라인

신뢰성 있고 안전한 프로그램을 위한 75가지 권고사항
  • 저자Fred Long, Dhruv Mohindra, Robert C. Seacord, Dean F. Sutherland, David Svododa 저 / 조태남 역
  • 관련분야정보보호, 정보보안, 시큐어 코딩
  • 발행일2017-06-08
  • 정가30,000원
  • 페이지288 페이지
  • ISBN 979-11-85578-15-6
  • 책소개
  • 저자소개
  • 목차
  • 출판사 서평
이 책은 이전의 자바용 CERT 오라클 자바 보안 코딩 표준의 뒤를 이어 중요한 자바 시큐어 코딩 가이드라인들을 다룬다. 특히, 신뢰성 있는 자바 시큐어 코딩 가이드라인에 초점을 맞추고 있다. 지난 몇 년간 나의 주목을 끈 것 중의 하나는 신뢰성과 안전성간의 상호작용이다. 암호 및 인증 등 다양한 보안 툴들이 있지만, 대부분의 침투는 서투르게 마무리된 프로그램의 버그나 보안상의 허점을 공략한다. 신뢰성 있는 시스템 구축과 안전한 시스템 구축은 상당부분 일맥상통한다. 즉, 신뢰성 있는 방식은 보안성을 만족시키고 그 반대도 마찬가지이다.

이 책에서 강조하듯이, 보안은 하나의 기능이 아니라 주의를 기울이는 자세를 의미한다. 이렇듯 보안은 소프트웨어 공학의 모든 단계에 지속적으로 이루어져야 한다. 이 책은 가이드라인 리스트를 중심으로 구성되어 있으며, 핵심은 가이드라인을 이행하기 위해 필요한 구체적인 내용들이다. 예를 들어, "해시 함수를 이용하여 패스워드를 저장하라"는 매우 기본적이고 명백한 사항이지만, 일부 소프트웨어가 미처 고려하지 못하여 발생한 데이터 유출 사고 뉴스를 심심치 않게 볼 수 있다. 공격이 파고들 수 있는 부분들은 수없이 많으며, 이로 인해 높은 보안성을 이루기란 매우 까다롭다. 이 책은 이러한 목표를 위해 필요한 상세 사항들을 다루는 최고의 안내자이다.

◆ 저자 소개 

 

 

Fred Long


영국 Aberystwyth대학 컴퓨터학과의 교수이다. 정형 기법(Formal Method)과 자바, C++, C프로그래밍 언어와 프로그래밍과 관련된 보안 이슈를 강의한다. 영국 컴퓨터 학회 웨일즈 중부지역 의장이기도 하다. 1992년부터 소프트웨어 공학 연구소 객원 연구원을 역임하고 있다. 최근에는 자바 취약점을 연구하고 있다. 

 

 

Dhruv Mohindra


인도 Persistent Systems사의 CTO오피스 부서인 보안 실전 그룹(security practice group)의 기술책임자이다. 클라우드, 협업, 뱅킹과 금융, 텔레커뮤니케이션, 기업, 모빌리티, 생활 과학, 건강 관리와 같은 다양한 기술들에 대해 보안 컨설팅 솔루션을 제공하고 있다. 그는 Fortune 500개 회사, 중소기업, 그리고 신규업체의 고위 관리직과 개발팀을 대상으로 정보보안 모범사례 및 보안요소가 내재된 소프트웨어 개발과정에 대한 컨설팅을 하고 있다. 

 

 

Robert C. Seacord


펜실베니아 피츠버그에 있는 카네기 멜론 소프트웨어 공학 연구소 CERT부서의 보안코딩 기술관리자이며, 카네기 멜론 대학교의 컴퓨터과학대학 및 정보 네트워크 연구소의 교수이다. 소프트웨어 보안, 컴포넌트-기반 소프트웨어 공학, 웹-기반 시스템 설계, 시스템 현대화, 컴포넌트 저장소와 검색엔진 그리고 사용자 인터페이스와 개발에 관련된 60편 이상의 논문을 발표했다. 

 

 

Dean F. Sutherland


CERT의 선임 소프트웨어 보안 엔지니어이다. 2008년도에 카네기 멜론 대학교에서 소프트웨어 공학박사학위를 받았다. 학교로 돌아오기전 14년 동안 Tartan사에서 소프트웨어 엔지니어로 근무했다. 이 기간 중 마지막 6년 동안 선임 기술자였으며, 컴파일러 백엔드 기술 팀장이었다. 

 

 

David Svododa


CERT/SEI의 소프트웨어 보안 엔지니어이다. C, C++, Perl 뿐만 아니라 자바를 위한 CERT보안 코딩 표준 웹사이트를 운영하고 있다. 1991년부터 계층구조의 칩 모델링, 사회적 조직 시뮬레이션, 그리고 자동기계번역(AMT)에 이르기까지 카네기 멜론 대학교의 다양한 소프트웨어 개발 프로젝트의 주요 개발자였다. 

 



◆ 역자 소개 

 

 

조태남


이화여자대학교 전자계산학과를 졸업하고 동대학원에서 석사학위 및 박사학위를 수여받았다. 한국전자통신연구원에서 위성관제시스템 등을 개발하였으며, 현재는 우석대학교 정보보안학과 교수로 재직하면서 암호기술, 인증기술, C언어, 자바, 네트워크 프로그래밍 등을 강의하고 있다. 저역서로는 <모바일시대의 정보보안개론>, , <컴퓨터 보안과 암호>등이 있고, 관심분야는 키관리 체계, 안드로이드 보안과 시큐어 코딩 등이다.

Chapter 01 안전성
01 민감-데이터의 수명을 제한하라
02 클라이언트에 암호화되지 않은 민감-데이터를 저장하지 말라
03 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라
04 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라
05 마구잡이 파일 업로드를 방지하라
06 출력을 적절하게 인코딩하거나 이스케이핑하라
07 코드 인젝션을 방지하라
08 XPath인젝션을 방지하라
09 LDAP인젝션을 방지하라
10 비신뢰-메서드의 매개변수를 clone()메서드로 복제하지 말라
11 암호키를 Object.equals()로 비교하지 말라
12 안전하지 않거나 약한 암호 알고리즘을 사용하지 말라
13 해시 함수를 이용하여 패스워드를 저장하라
14 SecureRandom에 적절한 시드를 제공하도록 보장하라
15 비신뢰-코드가 오버라이드할 수 있는 메서드에 의존하지 말라
16 과도한 권한 승인을 삼가라
17 특권-코드를 최소화하라
18 비신뢰-코드에게 간소화된 보안검사를 하는 메서드를 노출하지 말라
19 섬세한 보안을 위해 맞춤형 보안 퍼미션을 정의하라
20 보안 관리자를 이용하여 안전한 샌드박스를 생성하라
21 비신뢰-코드가 콜백 메서드의 권한을 오용하지 못하도록 방지하라

Chapter 02 방어적 프로그래밍
22 변수들의 영역범위를 최소화하라
23 @SuppressWarnings주석의 범위를 최소화하라
24 클래스와 멤버들에 대한 접근성을 최소화하라
25 쓰레드-안정성을 문서화하고 적절한 곳에 주석을 사용하라
26 메서드의 결과값에 대해 항상 피드백을 제공하라
27 여러 가지 파일 속성을 이용하여 파일을 식별하라
28 enum에서 부여한 순서번호에 의미를 두지 말라
29 숫자의 확대변환 동작을 주의하라
30 가변형 매개변수의 타입에 대해 컴파일 검사를 시행하라
31 이후의 릴리즈에서 변경될 수 있는 상수에 public final을 사용하지 말라
32 패키지간의 순환적 종속성을 피하라
33 일반적인 예외 타입보다는 사용자-정의 예외를 사용하라
34 시스템 오류로부터 정상적으로 복구하도록 노력하라
35 릴리즈하기 전에 인터페이스를 신중하게 설계하라
36 가비지 수집-친화적 코드를 작성하라

Chapter 03 신뢰성
37 부분영역의 식별자들을 섀도잉하거나 차폐하지 말라
38 하나의 선언문에 두 개 이상의 변수를 선언하지 말라
39 프로그램에서 리터럴을 표현할 때 의미있는 심볼릭 상수를 사용하라
40 상수 정의에서 관계를 적절히 인코딩하라
41 배열이나 컬렉션을 반환하는 메서드에서 널 값 대신 빈 배열이나 컬렉션을 반환하라
42 예외적 상황에 대해서만 예외를 사용하라
43 닫을 수 있는 자원을 안전하게 처리하기 위해서는 자원동반-try문장을 사용하라
44 런타임 오류가 없음을 검증하는 용도로 가정검증을 사용하지 말라
45 조건식에서 두 번째와 세 번째 피연산자의 타입을 동일하게 사용하라
46 다이렉트 핸들을 시스템 자원으로 직렬화하지 마라
47 열거형보다는 반복자를 사용하라
48 수명이 짧고 사용빈도가 낮은 객체용으로 다이렉트 버퍼를 사용하지 말라
49 장기 컨테이너 객체로부터 단기 객체를 삭제하라

Chapter 04 프로그램 이해용이성
50 시각적으로 오해의 소지가 있는 식별자와 리터럴 사용에 주의하라
51 가변형 메서드의 모호한 오버로딩을 삼가라
52 인밴드 오류 지표를 삼가라
53 조건식에서 대입문을 실행하지 말라
54 if, for, while문의 몸체에 중괄호를 사용하라
55 if, for, while조건식 직후에 세미콜론을 입력하지 말라
56 case레이블에 연계된 모든 문장은 break문으로 마무리하라
57 반복문 카운터의 부주의한 순환을 피하라
58 연산의 우선순위를 위해 괄호를 사용하라
59 파일 생성에 관하여 가정하지 말라
60 실수 연산을 위해서는 정수를 실수로 변환하라
61 clone()메서드가 super.clone()을 호출하도록 보장하라
62 가독성 있고 일관된 주석을 사용하라
63 과도한 코드와 값을 찾아 제거하라
64 논리적 완벽을 추구하라
65 모호하거나 혼동되는 오버로딩의 사용을 피하라

Chapter 05 프로그래머의 오해
66 레퍼런스를 휘발성으로 선언하면 참조되는 객체 멤버의 안전한 공개가 보장된다고 가정하지 말라
67 sleep(), yield(), getState()메서드가 동기화를 제공한다고 가정하지 말라
68 정수형 피연산자에 대한 나머지 연산 결과는 항상 음수가 아니라고 가정하지 말라
69 추상 객체의 동등성과 래퍼런스의 동등성을 혼동하지 말라
70 비트 연산자와 논리 연산자의 차이를 이해하라
71 문자열이 로드될 때 이스케이프 문자들이 어떻게 해석되는지 이해하라
72 런타임 시의 타입으로 구분되도록 오버로드 메서드를 사용하지 말라
73 레퍼런스의 불변성과 참조되는 객체의 불변성을 절대 혼동하지 말라
74 직렬화 메서드인 wirteUnshared()와 readUnshared()의 사용을 주의하라
75 가비지 수집기를 위해 지역 레퍼런스 변수에 널을 설정하려고 하지 말라
이 책은 전문가를 위한 가이드라인과 권고사항, 그리고 이러한 요구사항을 준수하도록 도와주는 예제들을 제공한다.
75개의 가이드라인들은 일관성 있고 직관적인 방법으로 기술되었다. 각 가이드라인에 대하여 준수해야 하는 요구사항들이 기술되며, 대부분의 요구사항들은 적절하지 못한 코드 예와 적절한 솔루션들과 함께 제공된다. 저자들은 각 가이드라인이 언제 적용되는지 설명하고 있으며 좀 더 상세한 정보를 얻기 위한 참고자료도 제공한다.
이 책은 최신의 자바 보안 연구를 반영하여, 계획적인 공격이나 예상하지 못한 결과를 방지하기 위한 새로운 기술들을 제공한다. 코드의 신뢰성과 명확성을 개선하는데 있어서 최고의 실질적인 도움을 얻게 될 것이다. 불완전한 모드를 초래하는 일반적인 오해에 대해서는 별도의 장을 할애하여 설명하였다.