메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍

버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍

한빛미디어

번역서

절판

  • 저자 : 프레드 롱 외 6명
  • 번역 : 강권학
  • 출간 : 2012-08-27
  • 페이지 : 780 쪽
  • ISBN : 9788979149500
  • 물류코드 :1950
  • 초급 초중급 중급 중고급 고급
4.7점 (3명)
좋아요 : 17

일반적인 코딩 패턴에서 나타나는 보안 취약점을 사전에 제거하는 방어적 프로그래밍

컴퓨터 비상 대응팀(CERT)은 다양한 소프트웨어에서 취약점을 유발하는 안전하지 못한 코딩 습관이 반복되는 것을 보았다. 이 책에서 제시하는 지침을 적용하면 취약점을 유발하는, 안전하지 못한 코딩 습관을 제거해 공격에 더 잘 견디는 튼튼한 고품질 시스템을 만들 수 있다.

이 책에서 제시하는 17개 장을 통해 자바의 핵심 영역별로 구체적인 규칙을 자세하게 설명한다. 각 영역에서 부적합 예제와 문제를 올바르게 해결한 적합 예제를 보여준다. 각 규칙은 부적합 코드가 일으키는 심각성, 악용할 수 있는 취약점을 발생시킬 수 있는 가능성을 설명한다.

코딩 표준에서는 자바 프로그래밍 언어와 라이브러리를 포함한 자바 SE 6 플랫폼에 대한 안전한 코딩 규칙을 정의하고, 자바 SE 7 플랫폼에 새로 추가된 기능에 대해서도 설명한다. javax 패키지가 제공하는 표준 확장 API와 관련된 보안 문제, lang, util, 컬렉션, 동시성 유틸리티, 로그, 리플렉션, 정규 표현식, 압축, 파일 입출력, JMX, JNI, 직렬화, JAXP 라이브러리 등에 적용할 수 있는 보안 문제까지 포괄적으로 설명한다.

행정안전부, SW 개발단계부터 보안취약점 제거(시큐어 코딩) 의무화
2012년 12월부터 행정기관 등에서 추진하는 개발비 40억 원 이상의 정보화 사업에 소프트웨어 개발보안 적용을 의무화하고 단계적으로 의무 대상을 확대하여 2015년에는 감리대상 전 정보화사업에 소프트웨어 개발보안을 적용한다. 보안 코딩은 일반적인 코딩 패턴에서 나타나는 취약점을 사전에 예방하는 습관일 뿐 아니라 현업에서의 요구사항이 되고 있다.

"자바 세계에서는 보안을 부가 기능으로 생각하지 않습니다. 언제나 보안을 고려해야 합니다. 보안을 염두에 두지 않는 개발자가 결국 문제를 일으킵니다. 그러나 보안 기능이 준비되어 있다고 해서 소프트웨어가 저절로 안전해지는 것은 아닙니다. 『버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍』은 수년간 발전해온 표준적인 관습을 요약한 해설서입니다. 그렇다고 해서 이론적인 연구 논문이나 제품 안내 자료도 아닙니다. 이 책은 중요한, 개발에 필수적인, 실전에서 검증된, 기업 규모의 프로젝트에 적용할 수 있습니다."
- 제임스 고슬링(James A. Gosling), 자바 프로그래밍 언어의 아버지

프레드 롱 외 6명 저자

프레드 롱 외 6명

프레드 롱은 영국 애버리스트위스 Aberystwyth 대학 선임 강사이자 교학부장이다. 정형 기법 Formal Methods 과 자바, C++, C 프로그래밍 패러다임과 프로그래밍 관련 보안 문제를 강의하며, 영국 컴퓨터 학회 웨일즈 중부 지역 의장이다. 1992년부터 소프트웨어 공학 연구소 객원 연구원을 역임하고 있으며, 현재는 자바 취약점을 조사하는 연구를 진행하고 있다.

드루브 모힌드라는 인도 Persistent Systems사의 선임 소프트웨어 엔지니어로, 기업 서버의 모니터링 소프트웨어를 개발하고 있다. 소프트웨어 공학 연구소의 CERT 팀에서 일했으며, 프로그래밍 커뮤니티에서 보안 의식 상태를 고취하고자 공동으로 여러 가지 작업을 했다. 정보 보안 정책과 관리로 석사 학위를 받은 후 카네기 멜론 대학교에서 근무했었으며, 인도 퓬 대학교에서 컴퓨터 공학으로 학사 학위를 받았다. 대학 재학 시절 Calsoft사에서 연구원으로 근무했으며, 왕성한 집필 활동으로 기술 잡지와 웹사이트에 글을 기고하기도 한다. 서비스 지향 애플리케이션, 서버 모니터링 소프트웨어, 모바일 앱, 웹 기반 데이터 마이너 Data Miner를 개발하고, 보안을 강화하고 사용자에게 친숙한 보안 인터페이스를 설계하면서 얻은 경험을 세상에 알리고 있다.

로버트 C. 시코드는 컴퓨터 보안 전문가이자 저술가이다. 컴퓨터 보안, 레거시 시스템 현대화, 컴퓨터 기반 소프트웨어 공학에 관한 책을 저술했다. 펜실베니아 피츠버그에 있는 카네기 멜론 소프트웨어 공학 연구소에 위치한 CERT에서 보안 코딩 구상(Secure Coding Initiative)을 관리하고 있다. CERT는 보안 관련 활동을 많이 하고 있지만, 그 중에서 정기적으로 소프트웨어 취약점 보고서를 분석하고 인터넷과 여타 중요 기반 시설에 미치는 위험을 평가한다. 카네기 멜론 대학교 컴퓨터 과학 학부와 정보 네트워킹 연구소에서 겸임 교수를 맡고 있다. 1982년부터 IBM에서 프로그래밍을 시작해서 통신과 운영체제 소프트웨어, 프로세서 개발, 소프트웨어 공학에 관련된 업무를 수행했다. 또한 X 컨소시엄에서 공통 데스크탑 환경(Common Desktop Environment)과 X 윈도 시스템 코드를 개발하고 유지 보수했다. 렌설리어 종합기술대학(Rensselaer Polytechnic Institute)에서 컴퓨터 과학으로 학사 학위를 받았다.

딘 F. 서덜랜드는 CERT의 선임 소프트웨어 보안 엔지니어이다. 2008년도에 카네기 멜론 대학교에서 소프트웨어 공학 박사 학위를 받았으며, 학교에 돌아오기 전 14년 동안 Tartan사에서 소프트웨어 엔지니어로 근무했다. 이 기간 중 마지막 6년 동안 기술 참모 선임 참여자였으며, 컴파일러 후반부 기술 팀장이었다. 회사 R&D 그룹의 핵심 멤버로 Tartan의 신규 소프트웨어 개발 프로세스를 설계하고 집행하는 것을 지휘하고 R&D 프로젝트를 이끌었고, 12명으로 구성된 컴파일러 후반부 개발팀의 기술과 프로젝트 팀장이었다.

데이비드 수오보다는 CERT의 소프트웨어 보안 엔지니어이다. 그는 1991년부터 카네기 멜론 대학교의 다양한 소프트웨어 개발 프로젝트의 주요 개발자였다. 계층 구조 칩 모델링, 소셜 조직 시뮬레이션에서 자동 기계 번역에 이르기까지 다양한 프로젝트에 참여해 개발했으며, 1996년에 개발한 KANTOO 자동 번역기는 현재까지 캐터필라에서 생산 과정에 사용한다. 그는 자바 2부터 시작해 13년이 넘게 자바로 개발해왔으며, 톰캣 서블릿과 이클립스 플러그인 등을 개발해왔다. 그는 C 언어 표준화 JTC1/SC22/WG14 그룹과 C++ 언어 표준화 JTC1/SC22/WG21 그룹 등 ISO의 여러 표준화 그룹에 활발히 참여하고 있다.

강권학 역자

강권학

중앙대학교 컴퓨터공학과에서 학사와 석사학위를 받았다. 국방과학연구소, 퓨쳐시스템, 안철수연구소에서 13년간 개발자, 보안전문가, 프로젝트 관리자로 근무하였으며, 2009년 4월 호주 멜번에 iGonagi Pty. Ltd.를 설립하고 아이폰 애플리케이션을 개발하고 있다. 『Head First iPhone Development』, 『Head First Programming』, 『iPhone Programming 제대로 배우기』, 『iPhone 3D Programming: using OpenGL ES』(이상 한빛미디어)를 번역했다.

CHAPTER 01 개요
잘못된 신뢰 
삽입 공격 
비밀 데이터 유출 
접근 권한 유출 
서비스 거부 
직렬화 
동시성, 가시성, 메모리 
최소 권한 원칙 
보안 관리자 
클래스 로더 
결론 

CHAPTER 02 입력 검증 및 데이터 새니타이즈(IDS)
  규칙 
  위험 평가 요약 
  IDS00-J 신뢰 경계를 넘어온 데이터는 새니타이즈한다 
  IDS01-J 문자열을 검증하기 전에 정규화한다 
  IDS02-J 경로 이름을 검증하기 전에 규범화한다 
  IDS03-J 새니타이즈하지 않은 사용자 입력은 로그에 남기지 않는다 
  IDS04-J ZipInputStream에 전달된 파일 크기를 제한한다 
  IDS05-J 파일과 경로 이름에 ASCII 문자의 일부만 사용한다 
  IDS06-J 포맷 문자열에 사용자 입력을 포함하지 않는다 
  IDS07-J 신뢰하지 않고 새니타이즈하지 않은 데이터를 Runtimeexec( ) 메서드에 전달하지 않는다 
  IDS08-J regex에 전달할 신뢰하지 않는 데이터를 새니타이즈한다 
  IDS09-J 로케일을 설정하기 전에는 로케일에 의존하는 데이터에 로케일에 의존하는 메서드를 사용하지 않는다 
  IDS10-J 두 데이터 구조 간에 문자를 분할하지 않는다 
  IDS11-J 검증하기 전에 비문자 코드를 제거한다 
  IDS12-J 인코딩 변경할 때 문자열 데이터를 무손실 변환한다 
  IDS13-J 파일이나 네트워크에 입출력할 때 양단에 호환되는 인코딩을 사용한다 

CHAPTER 03 선언과 초기화(DCL)
  규칙 
  위험 평가 요약 
  DCL00-J 클래스를 초기화할 때 순환을 예방한다 
  DCL01-J 자바 표준 라이브러리의 식별자를 재사용하지 않는다 
  DCL02-J 향상된 for 문의 모든 루프 변수는 final로 선언한다 

CHAPTER 04 표현식(EXP)
  규칙 
  위험 평가 요약 
  EXP00-J 메서드가 반환한 값을 무시하지 않는다 
  EXP01-J 널 포인터를 역참조하지 않는다 
  EXP02-J 배열 내용을 비교하려면 인자를 두 개 받는 Arraysequals( ) 메서드를 사용한다 
  EXP03-J 박싱된 기본형을 비교할 때 동등 비교 연산자를 사용하지 않는다 
  EXP04-J 오토박싱된 기본형의 값이 의도한 형인지 확인한다 
  EXP05-J 식 하나 안에서 동일 변수에 두 번 이상 쓰지 않는다 
  EXP06-J assert 문 안에 부작용이 있는 표현을 사용하지 않는다 

CHAPTER 05 수치형과 연산 (NUM)
  규칙 
  위험 평가 요약 
  NUM00-J 정수 오버플로우를 탐지하거나 예방한다 
  NUM01-J 동일 데이터에 비트 연산과 수리 연산을 수행하지 않는다 
  NUM02-J 나눗셈과 모듈로 연산할 때 0으로 나누지 않게 보장한다 
  NUM03-J unsigned 형을 저장하는 정수형 변수는 가능한 모든 값을 표현할 수 있어야 한다 
  NUM04-J 정확히 계산해야 할 때는 부동소수점형을 사용하지 않는다 
  NUM05-J 비정규화된 부동소수점을 사용하지 않는다 
  NUM06-J 플랫폼 간 부동소수점 연산의 결과를 동일하게 하려면 strictfp 지시자를 사용한다 
  NUM07-J NaN과 값을 비교하지 않는다 
  NUM08-J 부동소수점 입력 시 예외적인 값을 확인한다 
  NUM09-J 루프 카운터로 부동소수점을 사용하지 않는다 
  NUM10-J 부동소수점 상수를 사용해 BigDecimal 객체를 만들지 않는다 
  NUM11-J 부동소수점을 나타내는 문자열을 비교하거나 검사하지 않는다 
  NUM12-J 수치형 값을 더 작은 형으로 변환할 때 데이터가 손실되거나 잘못 변환되지 않게 확인한다 
  NUM13-J 기본 정수형을 부동소수점형으로 변환할 때 정밀도 손실을 피한다 

CHAPTER 06 객체 지향(OBJ)
  규칙 
  위험 평가 요약 
  OBJ00-J 신뢰하는 하위 클래스만 불변 성질을 가진 클래스나 메서드를 상속할 수 있게 한다 
  OBJ01-J 데이터 멤버는 private로 선언하고 접근 메서드를 제공한다 
  OBJ02-J 상위 클래스를 수정할 때는 하위 클래스가 의존하는 불변 성질을 유지한다 
  OBJ03-J 신규 코드에서 제네릭 클래스와 비제네릭 클래스를 함께 사용하지 않는다 
  OBJ04-J 신뢰하지 않는 코드에 안전하게 객체를 전달할 수 있게 가변 클래스의 복사 기능을 제공한다 
  OBJ05-J 반환하기 전에 클래스의 가변 private 멤버를 복사해 보호한다 
  OBJ06-J 가변 입력과 가변 내부 컴포넌트를 복사해 보호한다 
  OBJ07-J 기밀 클래스는 복제되지 않아야 한다 
  OBJ08-J 중첩된 클래스를 통해 private 멤버를 노출하면 안 된다 
  OBJ09-J 클래스를 비교할 때 클래스 이름으로 비교하면 안 된다 
  OBJ10-J final이 아닌 public static 변수를 사용하지 않는다 
  OBJ11-J 생성자가 예외를 발생시킬 수 있게 할 때는 주의한다 

CHAPTER 07 메서드(Met)
  규칙 
  위험 평가 요약 
  MET00-J 메서드 인자를 검증한다 
  MET01-J 메서드 인자를 검증할 때 절대로 assert를 사용하지 않는다 
  MET02-J 폐지되거나 폐지 예정인 클래스나 메서드를 사용하지 않는다 
  MET03-J 보안 검사하는 메서드는 반드시 private나 final로 선언해야 한다 
  MET04-J 숨기거나 오버라이드한 메서드의 접근성을 확대하지 않는다 
  MET05-J 오버라이드될 수 있는 메서드를 생성자가 호출하지 않게 보장한다 
  MET06-J clone( ) 메서드가 오버라이드될 수 있는 메서드를 호출하면 안 된다 
  MET07-J 상위 클래스나 인터페이스의 메서드를 가리는 클래스 메서드를 선언하지 않는다 
  MET08-J 동등 비교하는 객체는 동등 비교할 수 있게 보장한다 
  MET09-J equals( ) 메서드를 구현하는 클래스는 반드시 hashCode( ) 메서드를 구현해야 한다 
  MET10-J compareTo( ) 메서드를 구현할 때 일반적인 용법을 지원한다 
  MET11-J 비교 연산에 사용하는 키는 불변형이어야 한다 
  MET12-J finalize( ) 메서드를 사용하지 않는다 

CHAPTER 08 예외 처리(ERR)
  규칙 
  위험 평가 요약 
  ERR00-J 필수처리 예외를 억제하거나 무시하지 않는다 
  ERR01-J 예외에 의해 기밀 정보가 유출되지 않게 한다 
  ERR02-J 로그를 저장하는 동안 예외가 발생하지 않게 한다 
  ERR03-J 메서드가 실패하면 객체를 이전 상태로 복구한다 
  ERR04-J finally 블럭에서 갑작스럽게 빠져나가지 않는다 
  ERR05-J 필수처리 예외가 finally 블럭을 빠져나가지 못하게 한다 
  ERR06-J 선언하지 않은 예외를 발생시키지 않는다 
  ERR07-J RuntimeException, Exception, Throwable 예외를 발생시키지 않는다 
  ERR08-J NullPointerException과 상위 예외를 잡지 않는다 
  ERR09-J 신뢰하지 않는 코드가 JVM을 종료하지 못하게 한다 

CHAPTER 09 가시성과 원자성(VNA)
  규칙 
  위험 평가 요약 
  VNA00-J 공유된 기본형 변수에 접근할 때 가시성을 보장한다 
  VNA01-J 불변 객체에 대한 공유된 참조의 가시성을 보장한다 
  VNA02-J 공유된 변수에 대한 복합 연산의 원자성을 보장한다 
  VNA03-J 독립적으로 호출한 일련의 원자적 메서드 전체를 원자적이라고 가정하지 않는다 
  VNA04-J 연결된 메서드를 호출할 때 호출된 전체 메서드의 원자성을 보장한다 
  VNA05-J 64비트 값을 읽고 쓸 때 연산의 원자성을 보장한다 

CHAPTER 10 락(LCK)
  규칙 
  위험 평가 요약 
  LCK00-J 신뢰하지 않는 코드에 접근하는 클래스를 동기화하려면 private final 락 객체를 사용한다 
  LCK01-J 재사용될 수 있는 객체를 이용해 동기화하지 않는다 
  LCK02-J getClass( )에 의해 반환된 클래스 객체를 이용해 동기화하지 않는다 
  LCK03-J 상위 수준의 동시성 객체를 이용해 동기화하지 않는다 
  LCK04-J 지원 컬렉션에 접근할 수 있을 때 컬렉션 뷰로 동기화하지 않는다 
  LCK05-J 신뢰하지 않는 코드가 수정할 수 있는 static 필드를 접근할 때는 동기화한다 
  LCK06-J 공유된 static 데이터를 보호하고자 인스턴스 객체를 락으로 사용하지 않는다 
  LCK07-J 락을 동일한 순서로 요청하고 해제하여 데드락을 피한다 
  LCK08-J 예외 조건 처리 시 활성화된 락을 반드시 해제한다 
  LCK09-J 락을 활성화한 후 블럭될 수 있는 연산을 수행하지 않는다 
  LCK10-J 이중 검사 동기화의 잘못된 형태를 사용하지 않는다 
  LCK11-J 락 정책을 완전히 구현하지 않는 클래스를 사용할 때 클라이언트 측에서 락하지 않는다 

CHAPTER 11 스레드 API(THI)
  규칙 
  위험 평가 요약 
  THI00-J Threadrun( ) 메서드를 호출하지 않는다 
  THI01-J ThreadGroup 메서드를 호출하지 않는다 
  THI02-J 특정 스레드 대신 대기하는 모든 스레드에 노티피케이션을 보낸다 
  THI03-J wait( )와 await( ) 메서드는 언제나 루프 안에서 호출한다 
  THI04-J 블럭된 연산을 수행하는 스레드는 종료될 수 있음을 보장한다 
  THI05-J 스레드를 종료하고자 Threadstop( ) 메서드를 사용하지 않는다 

CHAPTER 12 스레드 풀(TPS)
  규칙 
  위험 평가 요약 
  TPS00-J 트래픽이 폭주할 때 성능이 완만히 저하되게 스레드 풀을 사용한다 
  TPS01-J 스레드 풀 안에서 상호 의존적인 작업을 수행하지 않는다 
  TPS02-J 스레드 풀에 들어간 작업은 인터럽트될 수 있음을 보장한다 
  TPS03-J 스레드 풀에서 수행되는 작업이 에러 없이 실패하지 않게 보장한다 
  TPS04-J 스레드 풀을 사용할 때 스레드 로컬 변수가 다시 초기화되게 보장한다 

CHAPTER 13 그 외 스레드 안전(TSM)
  규칙 
  위험 평가 요약 
  TSM00-J 스레드 안전한 메서드를 스레드 안전하지 않은 메서드로 오버라이드하지 않는다 
  TSM01-J 객체 생성 중 this 참조가 유출되지 않게 한다 
  TSM02-J 클래스 초기화 중 백그라운드 스레드를 사용하지 않는다 
  TSM03-J 일부분만 초기화된 객체를 공개하지 않는다 

CHAPTER 14 입출력(FIO)
  규칙 
  위험 평가 요약 
  FIO00-J 공유 디렉터리에 있는 파일에 작업하지 않는다 
  FIO01-J 파일 생성 시 적절한 접근 권한을 부여한다 
  FIO02-J 파일 관련 에러를 탐지하고 처리한다 
  FIO03-J 작업을 종료하기 전에 임시 파일을 삭제한다 
  FIO04-J 필요 없어진 리소스는 닫는다 
  FIO05-J 신뢰하지 않는 코드에 wrap( )이나 duplicate( ) 메서드로 생성한 버퍼를 노출하지 않는다 
  FIO06-J 한 InputStream에 여러 버퍼 래퍼를 만들지 않는다 
  FIO07-J 외부 프로세스가 입출력 스트림을 기다리게 하지 않는다 
  FIO08-J 글자나 바이트를 읽는 메서드의 반환값을 저장하려면 int 형을 사용한다 
  FIO09-J 0부터 255 이외의 정수를 출력할 때 write( ) 메서드를 사용하면 안 된다 
  FIO10-J read( )로 배열을 채울 때 배열이 제대로 채워졌음을 확인한다 
  FIO11-J 이진 데이터를 문자 데이터로 읽지 않는다 
  FIO12-J 리틀-엔디안 데이터를 읽고 쓰는 메서드를 제공한다 
  FIO13-J 신뢰 경계 외부에 기밀 정보 로그를 남기지 않는다 
  FIO14-J 프로그램을 종료할 때 적절히 정리한다 

CHAPTER 15 직렬화(SER)
  규칙 
  위험 평가 요약 
  SER00-J 클래스를 변경할 때 직렬화 호환성을 유지한다 
  SER01-J 직렬화 메서드의 적절한 시그너처를 유지한다 
  SER02-J 신뢰 경계 외부로 기밀 객체를 전송할 때 서명하고 봉인한다 
  SER03-J 암호화 안 한 기밀 데이터를 직렬화하지 않는다 
  SER04-J 보안 관리자를 피해 직렬화 및 역직렬화할 수 없게 한다 
  SER05-J 내부 클래스 객체를 직렬화하지 않는다 
  SER06-J 역직렬화하는 동안 private 가변 컴포넌트를 복사해 보호한다 
  SER07-J 불변 성질을 갖고 있는 객체는 기본 직렬화 형태를 사용하면 안 된다 
  SER08-J 높은 권한을 갖고 있으면 역직렬화하기 전에 권한을 최소화한다 
  SER09-J readObject( ) 메서드 안에서 오버라이드될 수 있는 메서드를 호출하지 않는다 
  SER10-J 직렬화하는 동안 메모리와 리소스가 누수되지 않게 한다 
  SER11-J Externalizable 객체의 내용을 덮어쓰지 못하게 한다 

CHAPTER 16 플랫폼 보안(SEC)
  규칙 
  위험 평가 요약 
  SEC00-J 권한이 있는 코드가 신뢰 경계 외부에 기밀 정보를 유출하지 못하게 한다 
  SEC01-J 권한이 있는 코드 안에서 신뢰하지 않는 변수를 사용하지 않는다 
  SEC02-J 신뢰하지 않는 외부 데이터를 직접 보안 검사하지 않는다 
  SEC03-J 신뢰하지 않는 코드가 임의의 클래스를 로드하게 허용한 후 신뢰하는 클래스를 로드하면 안 된다 
  SEC04-J 보안 관리자 검사를 이용해 기밀 연산을 보호한다 
  SEC05-J 리플렉션으로 클래스, 메서드, 필드에 접근성을 확대하면 안 된다 
  SEC06-J URLClassLoader와 javautiljar가 제공하는 기본 자동 서명 검증 기능에 의존하지 않는다 
  SEC07-J 사용자 정의 클래스 로더를 작성할 때 상위 클래스의 getPermissions( ) 메서드를 호출한다 
  SEC08-J 네이티브 메서드에 대한 래퍼를 정의한다 

CHAPTER 17 런타임 환경(ENV)
  규칙 
  위험 평가 요약 
  ENV00-J 권한이 없는 연산만 실행하는 코드는 서명하지 않는다 
  ENV01-J 모든 보안 코드는 단 하나의 jar 파일에 넣어 서명하고 봉인한다 
  ENV02-J 환경 변수 값을 신뢰하지 않는다 
  ENV03-J 위험한 권한 조합을 부여하지 않는다 
  ENV04-J 바이트 코드 검증을 비활성화하면 안 된다 
  ENV05-J 원격에서 감시할 수 있는 애플리케이션은 배포하지 않는다 

CHAPTER 18 기타(MSC)
  규칙 
  위험 평가 요약 
  MSC00-J 안전하게 데이터를 교환하려면 Socket 대신 SSLSocket을 사용한다 
  MSC01-J 빈 무한 루프를 사용하면 안 된다 
  MSC02-J 강력한 난수를 생성한다 
  MSC03-J 기밀 정보는 결코 하드코딩하면 안 된다 
  MSC04-J 메모리를 누수시키지 않는다 
  MSC05-J 힙 영역을 고갈시키지 않는다 
  MSC06-J 루프에서 나열하는 동안 참조하는 컬렉션을 수정하지 않는다 
  MSC07-J 싱글톤 클래스가 여러 객체를 만들지 않게 한다   

소프트웨어를 만드는데 중요한 것은 무엇일까요? 이 질문에 대한 답은 답변을 요구받은 사람마다 제 각각 다를것입니다. "버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"은 보안적인 측면에서 바라본 소프트웨어의 중요한 점을 실제적인 관점에서 예시와 코드를 함께 제시한 책입니다.


책의 부제인 "당신의 코딩 습관은 안전하지 않다"는 본 도서가 어떤 부분에 초점을 두고 있는지 알게 합니다. 바로 우리가 배운 프로그래밍 습관에서 보안 문제가 가장 쉽게 검출된다고 보는 것이지요.

자바 언어의 창시자인 "제임스 고슬링"은 추천사에서 보안은 지난 수십 년 동안 심각한 주제로 다루어졌고 자바 역시 보안을 염두에 둔 언어라고 소개합니다.

PHP와 같은 스크립트 언어에서도 보안(동 출판사의 PHP 보안: 몇 줄의 코드로 안전하게 참고)이 다루어지는 것을 보면 보안이 컴퓨팅 세계에서 중요한 키워드로 자리 잡은건 사실로 받아들여야 할 것 같습니다.

책의 내용 자체는 자바로 멀티 플랫폼, 멀티 스레드 프로그램을 만드는 개발자에게도 도움이 될만한 Lock, Sanitization, 가시성과 원자성, Thread API, Thread Pool, Thread 안전 등이 다수 기술되어 있습니다.

자바로 안전한 프로그램을 짜는 법과 규칙이 아닌 안전한 프로그램을 만드는데 자바 언어에선 어떻게 할 수 있을까? 이 질문에 대해서 답을 찾아가 보겠습니다.


신뢰할 수 없는 곳에서 데이터가 넘어오면 신뢰해선 안된다.



프로그램에서 가장 믿을 수 없는 건 어떤 부분일까요? 바로 데이터입니다. 외부에서 입력받는 데이터는 모두 오염된 데이터이고 심지어 프로그램 내부에서 조차도 데이터를 주고 받는 코드가 신뢰할 수 있는 코드인지 아닌지에 따라서도 검증하고 규제해야 한다고 말합니다.

한동안 웹 세계를 떠들석하게 했던 SQL Injection 공격도 바로 입력에 대해 검증하지 않아서 발생했던 문제였습니다.

자바 역시 다른 언어와 마찬가지로 SQL, 인자 공격 등을 받을 수 있습니다. 바로 이런면에서 데이터는 적절히 규범화와 Sanitization이 되어야 하는데 이는 특히 시스템에 치명상을 입힐 수 있으므로 각별히 주의해야 합니다.


선언과 표현식. 그 미묘한 틈으로 해오는 공격 막아내기



자바 언어는 객체지향 언어 중에서도 선언이 꼭 필요하며 표현식에 있어서도 다른 언어와 차별되는 특징을 가지고 있습니다. 다른 언어에도 있는 특징이라고 본다면 대수롭지 않게 넘길수도 있는 부분이겠지만 안전을 고집하는 프로그램에서는 간과할 수 없는 내용입니다.

예를 들어 문자열의 비교와 같은 부분도 다른 언어가 == 와 같은 연산자를 사용하더라도 자바에선 == 연산자는 문자열 내용의 비교가 아니라는 점에 주의해야 합니다.

해커와 크래커가 타격을 줄 수 있는 지점은 사전에 제거해야 합니다. 문법적으로는 맞더라도 보안 코딩이 필요한 지점이 바로 선언과 표현식에 관한 부분입니다.


이 보다 더 위험할 수 없다. 수치 다루기



일본 애니메이션 중 공각 기동대엔 어떤 악당이 정부의 재정 창고에서 사이버 상으로 돈 일부를 계속해서 훔쳐내는 장면이 나옵니다. 그런데 정부는 이걸 모르지요.

어떻게 이런 일이 가능할까요? 이유는 컴퓨터가 가지고 있는 수치 연산 특징 때문인데 이 문제는 수치를 다루는 프로그램에서 수치 연산이 특히 중요한 문제로 다뤄집니다.

그런데 수치를 다루는 프로그램이 부정확하다기만 하면 정확성을 높이면 되겠지만 이 문제는 보안 버그를 발생시키는 지점이기도 합니다. 따라서 수치를 다루는 프로그램일수록 정밀도와 보안 버그가 발생하지 않도록 각별히 신경써야 합니다.


객체. 그 영원한 손님과 메서드를 잘못 놀리기



객체는 데이터와 데이터를 처리할 수 있는 메서드가 함께 들어가 있습니다. 하지만 자바 언어에서 객체는 크게 2종류로 나뉘어집니다. 불변과 가변 객체로 말이죠. 불변 객체는 말 그대로 변경할 수 없지만 가변 객체는 변할 수 있는 객체입니다. 저는 그래서 가변 객체를 손님 객체라고 부르기도 합니다.

보안적인 측면에 있어서도 객체를 수정할 수 있거나 상속해서 기능을 고칠 수 있다면 해당 객체를 사용하는 코드는 보안 위험에 노출될 수 밖에 없습니다. 혹은 해커의 코드로부터 전달받은 데이터에 위험이 있을거란 건 자명한 사실입니다.

한편, 메서드 사용에 있어서도 해커는 폐지 예정이거나 상속 등을 통해서 프로그램을 공격할 수 있습니다.

프로그래머가 의도하든 의도하지 않았던 메서드를 사용하거나 정의하는 일은 신중해야 합니다.


잠자면서 침흘리지 말고 항상 보이는데 있을 것



에러는 어떤 프로그램이던지 항상 발생할 수 있습니다. 하지만 사용자에게 에러 내용을 내보이는 일은 해커에게 공격해달라는 것과 다를바 없습니다. 프로그램 사용성에 있어서도 에러를 내보이는 일은 좋지 않다고 합니다.

무엇보다 에러가 해커에게 공격정보를 제공할 수 있으니 제품 개발 중을 제외하고 에러 처리는 적재 적소에 적절하게 사용되어야 함을 설명합니다.

뿐만 아니라 스레드 프로그램이 안정적으로 동작하기 위해서 전재되어야 하는 가시성과 원자성에 대한 이야기가 담겨 있습니다. 하지만 가시성과 원자성은 이후 나오는 Lock과 스레드 관련 기술과 밀접한 관련이 있으니 9장부터 13장까진 함께 보시는게 좋습니다.


하드 디스크 동작 램프가 꿈벅이고 있을때 왜 그럴까?



많은 프로그램에서 프로그램이 더 이상 사용자의 요청에 응답하지 않을 때 우리는 블럭되었다라고 말합니다. 블럭되었다는 말은 프로그램이 뭔가를 하고 있지만 사용자의 요청에 불응하고 있는 상태를 말하지요.

이런 현상은 디스크에 대한 입출력과 네트워크에 대한 입출력 그리고 시간이 오래 걸리는 일을 수행했을때 생깁니다.

입출력에 대한 블럭 문제는 단지 사용자의 요청에 반응하는 것 뿐 아니라 프로그램의 동작과 해커의 공격을 유도할 수 있기도 합니다. 따라서 이러한 입출력에 대한 내용을 주도 면밀하게 따져봐야 합니다.


데이터 다시 갖다 쓰기의 위험성



어떤 프로그램에서든 이진화된 포맷으로 데이터를 저장한다면 그 데이터를 읽는 프로그램은  후속작업이 쉬워집니다.

물론 사용자가 알아볼 수 있는 데이터로 출력되는 것도 있기도 합니다. 이렇게 프로그램에서 데이터를 바로 파일로 저장하거나 다른 네트워크로 보내거나 하는 것들을 우리는 직렬화된 데이터라고 부릅니다.

15장에선 바로 이런 데이터의 올바른 직렬화 방법과 직렬화로 발생할 수 있는 보안 버그를 설명합니다.

상태를 가지고 있는 직렬화 데이터나 높은 권한을 가지고 있는 직렬화 데이터는 보안 공격의 우려를 지니고 있으니 한번쯤은 데이터 직렬화/역직렬화시 주의할 필요가 있습니다.


샌드박스안에서 동작시키기



16장과 17장은 자바 프로그램이 샌드박스 안에서 안전하게 동작할 수 있는 방법을 제시합니다. 자바 언어가 이미 샌드박스 모델인데 무슨 또 샌드박스냐 하겠지만 자바 언어에선 클래스를 로드하는 로더를 통해서도 보안 문제가 발생할 수 있기도 합니다.

본 도서에서는 톰캣과 아파치 제로니모의 예를 들어서 클래스 로더에서도 문제를 발생시킬 수 있음을 지적합니다.

한편 자바 실행에 있어서도 어떤 권한을 어디에 줄것인지 명시하거나 런타임에서 보안 문제를 일으킬 수 있는 문제도 피해야죠.


뻔하거나 뻔하지 않은 것들 다루기



마지막으로 다루는 내용은 어느 부류에 속하기도 애매한 것들만 모아놓았습니다. 데이터 통신을 SSLSocket을 사용하거나 난수 생성, 기밀정보의 하드 코딩 금지, 메모리 누수 등에 대한 내용을 다룹니다.

이런 내용들은 프로그래머라면 당연히 알고 있거나 그렇게 해야 하는 내용이 다수입니다. 하지만 그렇게 알고 있어도 실천은 어렵지요.


어쩌면...



어쩌면 우리가 프로그램을 작성하고 있는 동안에도 해커는 끊임없이 우리의 프로그램을 공격할 준비를 하고 있을 겁니다. 설령 운이 좋아 공격당하지 않는다고 해도 마찬가지입니다.

"버그없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"도 우리 프로그래머의 코딩 취약성에 대해 설명하고 있는 것으로 본다면 우리가 품질 좋은 소프트웨어를 만들어내는데 한걸음 더 나아가있을 겁니다.

책을 덮으면서 아쉬웠던건 책의 코드에 대한 상세 설명이 부족했다는 점인데, 이는 본 도서의 독자층을 고려한다면 쉽게 넘어갈 수 있는 부분일겁니다.

끝으로 번역하시느라 고생하셨던 역자 "강권학"님에게도 특별한 감사 말씀 드려요. 보안에 관련된 내용은 어떻게 해서든 어려운 축에 속하는 내용이라 애로가 많으셨을텐데 매끄럽게 번역하시려고 고생하신게 눈에 보입니다.

자바 언어로 먹고 사시는 분들에게도 이 책을 통해 보안 코딩이 한 걸음 더 나아가기를 진심으로 바라봅니다.

"Java 세계에서는 보안을 부가 기능으로 생각하지 않습니다. 언제나 보안을 고려해야 합니다.보안을 염두에 두지 않는 개발자가 결국 문제를 일으킵니다. 그러나 보안 기능이 준비되어 있다고 해서 소프트웨어가 저절로 안전해지는 것은 아닙니다. "CERT; Secure Coding Standard for Java"는 수 년간 발전해온 표준적인 관습을 요약한 해설서입니다. 그렇다고 해서 이론적인 연구 논문이나 제품 안내 자료도 아닙니다. 이 책은 중요한, 개발에 필수적인, 실전에서 검증된, 기업 규모의 프로젝트에 적용할 수 있습니다."- James A. Gosling

이 책의 원 제목은 "CERT; Secure Coding Standard for Java"이다. 직역하자면 "자바를 위한 보안 코딩 표준"정도가 되겠다. CERT는 "Computer Emergency Response Team"을 의미한다. "컴퓨터 긴급 대책 팀" 정도로 해석이 될려나?
그런데 번역한 제목은 "버그 없는"으로 시작한다. 물론 뒤에 안전한 이라는 형용사가 있어서 버그 없는 이라는 말의 의미를 어느 정도 가늠할 수도 있겠다. 하지만 보통 버그가 수식하는 의미는 프로그램 상 정상적인 구동을 가로막는 프로그래밍적 오류를 말하는데, 여기서는 보안 상의 구멍 정도로 의미한다고 보겠다.


이 책을 보면 상당히 놀라운 면이 많다. 일반 프로그래머의 경우 정상적으로 프로그램이 구현되면 그만이라고 생각하지만, 그 안에 인지하지 못한 수 많은 구멍들이 산재해 있다. 처음부터 그러한 점을 염두에 두지 않으면 버그 없는 버그 투성이의 프로그램이 탄생할 수 있다. 즉 작동은 잘 되지만, 해킹의 염려가 매우 높을 수 있다는 것이다.


이 책은 입력 검증 부터 시작해, 객체 지향, 선언, 표현식, 연산, Method, Exception 등으로 파트를 나누어 보안성을 갖춘 Java Programming을 위한 Rule을 서술형 제목으로 갖고 있다.사실 프로그래밍을 어느 정도 한 사람이라면 이 책의 목차만 참고해도 꽤나 솔깃할 법한 서술형의 제목들이 가득하다. Java에 대해 어느 정도 아는 사람이라면 직관적으로 와 닿는 제목이라고 여길 것이다. 책의 내용도 그렇다. 예시된 Code과 설명은 "보안 개론"서가 아니라 당장 Code를 뜯어 고칠 법한 실전적 예시 중심의 설명을 하고 있다.


어느 정도 연차가 쌓이게 되면 사실 무엇을 더 해야 내가 더 프리미엄이 있는 프로그래머가 될 지 방향을 가늠하기 어려울 때도 있을 것이다. 다른 프로그래머와 차별화되는 프로그래머가 되려면 아마도 이러한 보안적으로도 우수한 프로그래밍을 하는 프로그래머가 아닐까? 사실 처음에 밝힌 Java의 아버지 James A. Gosling의 말 처럼 Java에서는 보안을 부가기능으로 보지 않는다고 했다. 그건 선택적인 요소가 아니라 필수적인 요소이다.
영화 300을 보면 스파르타의 전사에게 필수는 창 뿐 아니라 몸 전체를 막는 방패도 포함되었다. 이 책을 본 뒤에 문제를 해결해 주는 창과 해킹으로부터 안전한 방패를 갖춘 스파르타 전사 같은 프로그래밍이라면 당신에게 강인한 프로그래머(?)라는 칭호와 함께 더욱 업그레이드 된 자신을 볼 수 있으리라 생각 된다.

제가 컨설팅 업무를 하면서, 그리고 현재 보안 기술적 취약점 진단 업무를 하면서 어플리케이션 취약점에 대한 이슈는 계속 되고 있습니다. 모의해킹 진단 업무는 대부분 BlackBox 형태이기 때문에 이후에 동일한 진단을 할시에도 매년마다 계속 취약점이 도출되는 것에 대해서 반박을 하였고, 이에 개발단에서부터 취약점을 제거해야 한다는 "Secure Coding"에 대한 단어가 떠올랐습니다. 분명히 이전에도 사업이 간간히 진행되었고, 공공기관 대상으로도 많은 SI 업체들은 항상 "개발단계의 보안성 검토"를 RFP에 추가를 하곤 하였습니다.

하지만, 행안부에서는 "SW 개발단계에서부터 보안취약점 제거 의무화" (공공기관 개발사업) 을 하면서 더욱 이슈가 되었습니다. 그리고 행안부에서는 시큐어코딩 교육 사업을 진행하여 "시큐어 코딩 진단원"을 양성하기 시작하였습니다.
이에 행안부에는 2011년에 각 개발환경에 맞는 "C/C++, Java, Android, iOS" 대상으로 시큐어 코딩 가이드를 배포하기도 했습니다.

하지만, 실제 이 가이드를 보면서 현업에 사용될 수 있을지에 대해서 많은 의문을 남겼고, 이 가이드를 통해서 진단원을 양성 시킬 수 있을지는 저도 의문입니다. 이것을 이해하는 개발경력 및 보안전문가를 통해서 전달되어야 하지만, 이 가이드의 항목을 모두 충족하기 위해서는 많은 시행착오가 있을거 같습니다.

행안부에서 진행된 가이드는 CVE 를 많이 참고하여 진행되었습니다. 이 가이드가 아쉬었던 것은 취약점에 대한 설명이 너무 부족했던 것이고 (개발자가 이해하기에는 부족하다는 의미), [예제]를 너무 생략하는 감이 있어서 많이 아쉬웠습니다.

저는 실제 시큐어 코딩 진단 업무를 3년이상 하면서 참고했던 자료는 https://www.securecoding.cert.org 에서 발간되고 있는 현재 책의 원본 페이지들이었습니다. 아무리 Standard라고 할지라도 실 업무에서 바로 사용될 수 있는 코드가 인상적이며, 보안품질, 코드품질 등 우리가 놓칠 수 있는 부분까지 항목을 자세히 분류를 시켰기 때문에 개발자 입장에서든, 컨설턴트 입장에서든 선택할 수 있는 권리를 주었다는 것입니다.

시큐어 코딩을 사람의 손으로(수동 작업)으로 모두 하나하나 작업을 할 수 없어서 "Fortify"라는 도구를 많이 사용합니다. 하지만, 여기에서 내놓는 예제도 이책과 비교를 하였을 경우, 객관적으로 이 책이 참고하기에는 아주 좋습니다.

하지만, 문제는 행안부에서 진행되고 있는 항목들이 이 책을 참고하여 권고를 할 수 있을지는 아직 의문입니다. 꼭 가이드를 참고를 해야 할지에 대해서는 내년에 진행을 해봐야 저도 알거 같습니다.

저도 개인적으로 Secure Coding에 대해서 아주 관심이 많기 때문에 다양한 문서를 연구하여 배포하고 있으며 현재도 ESAPI, SAMATE 등을 참고하고 있습니다. 아래 링크를 참조하시면 됩니다.


[번역 문서 배포] OWASP Top 10 for .NET developer

[번역문서배포] iOS Application (In)Security


[같이 보면 좋은 책]
버그 없는 안전한 소프트웨어를 위한 CERT C 프로그래밍

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원이 주문하신 경우 무료배송

무료배송 상품을 포함하여 주문하신 경우에는 구매금액에 관계없이 무료로 배송해 드립니다.

닫기

리뷰쓰기

닫기
* 도서명 :
버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?

자료실

최근 본 책0