소프트웨어를 만드는데 중요한 것은 무엇일까요? 이 질문에 대한 답은 답변을 요구받은 사람마다 제 각각 다를것입니다. "버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"은 보안적인 측면에서 바라본 소프트웨어의 중요한 점을 실제적인 관점에서 예시와 코드를 함께 제시한 책입니다.
책의 부제인 "당신의 코딩 습관은 안전하지 않다"는 본 도서가 어떤 부분에 초점을 두고 있는지 알게 합니다. 바로 우리가 배운 프로그래밍 습관에서 보안 문제가 가장 쉽게 검출된다고 보는 것이지요.
자바 언어의 창시자인 "제임스 고슬링"은 추천사에서 보안은 지난 수십 년 동안 심각한 주제로 다루어졌고 자바 역시 보안을 염두에 둔 언어라고 소개합니다.
PHP와 같은 스크립트 언어에서도 보안(동 출판사의 PHP 보안: 몇 줄의 코드로 안전하게 참고)이 다루어지는 것을 보면 보안이 컴퓨팅 세계에서 중요한 키워드로 자리 잡은건 사실로 받아들여야 할 것 같습니다.
책의 내용 자체는 자바로 멀티 플랫폼, 멀티 스레드 프로그램을 만드는 개발자에게도 도움이 될만한 Lock, Sanitization, 가시성과 원자성, Thread API, Thread Pool, Thread 안전 등이 다수 기술되어 있습니다.
자바로 안전한 프로그램을 짜는 법과 규칙이 아닌 안전한 프로그램을 만드는데 자바 언어에선 어떻게 할 수 있을까? 이 질문에 대해서 답을 찾아가 보겠습니다.
신뢰할 수 없는 곳에서 데이터가 넘어오면 신뢰해선 안된다.
프로그램에서 가장 믿을 수 없는 건 어떤 부분일까요? 바로 데이터입니다. 외부에서 입력받는 데이터는 모두 오염된 데이터이고 심지어 프로그램 내부에서 조차도 데이터를 주고 받는 코드가 신뢰할 수 있는 코드인지 아닌지에 따라서도 검증하고 규제해야 한다고 말합니다.
한동안 웹 세계를 떠들석하게 했던 SQL Injection 공격도 바로 입력에 대해 검증하지 않아서 발생했던 문제였습니다.
자바 역시 다른 언어와 마찬가지로 SQL, 인자 공격 등을 받을 수 있습니다. 바로 이런면에서 데이터는 적절히 규범화와 Sanitization이 되어야 하는데 이는 특히 시스템에 치명상을 입힐 수 있으므로 각별히 주의해야 합니다.
선언과 표현식. 그 미묘한 틈으로 해오는 공격 막아내기
자바 언어는 객체지향 언어 중에서도 선언이 꼭 필요하며 표현식에 있어서도 다른 언어와 차별되는 특징을 가지고 있습니다. 다른 언어에도 있는 특징이라고 본다면 대수롭지 않게 넘길수도 있는 부분이겠지만 안전을 고집하는 프로그램에서는 간과할 수 없는 내용입니다.
예를 들어 문자열의 비교와 같은 부분도 다른 언어가 == 와 같은 연산자를 사용하더라도 자바에선 == 연산자는 문자열 내용의 비교가 아니라는 점에 주의해야 합니다.
해커와 크래커가 타격을 줄 수 있는 지점은 사전에 제거해야 합니다. 문법적으로는 맞더라도 보안 코딩이 필요한 지점이 바로 선언과 표현식에 관한 부분입니다.
이 보다 더 위험할 수 없다. 수치 다루기
일본 애니메이션 중 공각 기동대엔 어떤 악당이 정부의 재정 창고에서 사이버 상으로 돈 일부를 계속해서 훔쳐내는 장면이 나옵니다. 그런데 정부는 이걸 모르지요.
어떻게 이런 일이 가능할까요? 이유는 컴퓨터가 가지고 있는 수치 연산 특징 때문인데 이 문제는 수치를 다루는 프로그램에서 수치 연산이 특히 중요한 문제로 다뤄집니다.
그런데 수치를 다루는 프로그램이 부정확하다기만 하면 정확성을 높이면 되겠지만 이 문제는 보안 버그를 발생시키는 지점이기도 합니다. 따라서 수치를 다루는 프로그램일수록 정밀도와 보안 버그가 발생하지 않도록 각별히 신경써야 합니다.
객체. 그 영원한 손님과 메서드를 잘못 놀리기
객체는 데이터와 데이터를 처리할 수 있는 메서드가 함께 들어가 있습니다. 하지만 자바 언어에서 객체는 크게 2종류로 나뉘어집니다. 불변과 가변 객체로 말이죠. 불변 객체는 말 그대로 변경할 수 없지만 가변 객체는 변할 수 있는 객체입니다. 저는 그래서 가변 객체를 손님 객체라고 부르기도 합니다.
보안적인 측면에 있어서도 객체를 수정할 수 있거나 상속해서 기능을 고칠 수 있다면 해당 객체를 사용하는 코드는 보안 위험에 노출될 수 밖에 없습니다. 혹은 해커의 코드로부터 전달받은 데이터에 위험이 있을거란 건 자명한 사실입니다.
한편, 메서드 사용에 있어서도 해커는 폐지 예정이거나 상속 등을 통해서 프로그램을 공격할 수 있습니다.
프로그래머가 의도하든 의도하지 않았던 메서드를 사용하거나 정의하는 일은 신중해야 합니다.
잠자면서 침흘리지 말고 항상 보이는데 있을 것
에러는 어떤 프로그램이던지 항상 발생할 수 있습니다. 하지만 사용자에게 에러 내용을 내보이는 일은 해커에게 공격해달라는 것과 다를바 없습니다. 프로그램 사용성에 있어서도 에러를 내보이는 일은 좋지 않다고 합니다.
무엇보다 에러가 해커에게 공격정보를 제공할 수 있으니 제품 개발 중을 제외하고 에러 처리는 적재 적소에 적절하게 사용되어야 함을 설명합니다.
뿐만 아니라 스레드 프로그램이 안정적으로 동작하기 위해서 전재되어야 하는 가시성과 원자성에 대한 이야기가 담겨 있습니다. 하지만 가시성과 원자성은 이후 나오는 Lock과 스레드 관련 기술과 밀접한 관련이 있으니 9장부터 13장까진 함께 보시는게 좋습니다.
하드 디스크 동작 램프가 꿈벅이고 있을때 왜 그럴까?
많은 프로그램에서 프로그램이 더 이상 사용자의 요청에 응답하지 않을 때 우리는 블럭되었다라고 말합니다. 블럭되었다는 말은 프로그램이 뭔가를 하고 있지만 사용자의 요청에 불응하고 있는 상태를 말하지요.
이런 현상은 디스크에 대한 입출력과 네트워크에 대한 입출력 그리고 시간이 오래 걸리는 일을 수행했을때 생깁니다.
입출력에 대한 블럭 문제는 단지 사용자의 요청에 반응하는 것 뿐 아니라 프로그램의 동작과 해커의 공격을 유도할 수 있기도 합니다. 따라서 이러한 입출력에 대한 내용을 주도 면밀하게 따져봐야 합니다.
데이터 다시 갖다 쓰기의 위험성
어떤 프로그램에서든 이진화된 포맷으로 데이터를 저장한다면 그 데이터를 읽는 프로그램은 후속작업이 쉬워집니다.
물론 사용자가 알아볼 수 있는 데이터로 출력되는 것도 있기도 합니다. 이렇게 프로그램에서 데이터를 바로 파일로 저장하거나 다른 네트워크로 보내거나 하는 것들을 우리는 직렬화된 데이터라고 부릅니다.
15장에선 바로 이런 데이터의 올바른 직렬화 방법과 직렬화로 발생할 수 있는 보안 버그를 설명합니다.
상태를 가지고 있는 직렬화 데이터나 높은 권한을 가지고 있는 직렬화 데이터는 보안 공격의 우려를 지니고 있으니 한번쯤은 데이터 직렬화/역직렬화시 주의할 필요가 있습니다.
샌드박스안에서 동작시키기
16장과 17장은 자바 프로그램이 샌드박스 안에서 안전하게 동작할 수 있는 방법을 제시합니다. 자바 언어가 이미 샌드박스 모델인데 무슨 또 샌드박스냐 하겠지만 자바 언어에선 클래스를 로드하는 로더를 통해서도 보안 문제가 발생할 수 있기도 합니다.
본 도서에서는 톰캣과 아파치 제로니모의 예를 들어서 클래스 로더에서도 문제를 발생시킬 수 있음을 지적합니다.
한편 자바 실행에 있어서도 어떤 권한을 어디에 줄것인지 명시하거나 런타임에서 보안 문제를 일으킬 수 있는 문제도 피해야죠.
뻔하거나 뻔하지 않은 것들 다루기
마지막으로 다루는 내용은 어느 부류에 속하기도 애매한 것들만 모아놓았습니다. 데이터 통신을 SSLSocket을 사용하거나 난수 생성, 기밀정보의 하드 코딩 금지, 메모리 누수 등에 대한 내용을 다룹니다.
이런 내용들은 프로그래머라면 당연히 알고 있거나 그렇게 해야 하는 내용이 다수입니다. 하지만 그렇게 알고 있어도 실천은 어렵지요.
어쩌면...
어쩌면 우리가 프로그램을 작성하고 있는 동안에도 해커는 끊임없이 우리의 프로그램을 공격할 준비를 하고 있을 겁니다. 설령 운이 좋아 공격당하지 않는다고 해도 마찬가지입니다.
"버그없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"도 우리 프로그래머의 코딩 취약성에 대해 설명하고 있는 것으로 본다면 우리가 품질 좋은 소프트웨어를 만들어내는데 한걸음 더 나아가있을 겁니다.
책을 덮으면서 아쉬웠던건 책의 코드에 대한 상세 설명이 부족했다는 점인데, 이는 본 도서의 독자층을 고려한다면 쉽게 넘어갈 수 있는 부분일겁니다.
끝으로 번역하시느라 고생하셨던 역자 "강권학"님에게도 특별한 감사 말씀 드려요. 보안에 관련된 내용은 어떻게 해서든 어려운 축에 속하는 내용이라 애로가 많으셨을텐데 매끄럽게 번역하시려고 고생하신게 눈에 보입니다.
자바 언어로 먹고 사시는 분들에게도 이 책을 통해 보안 코딩이 한 걸음 더 나아가기를 진심으로 바라봅니다.