2016년 9월 19일 월요일

[SW공학 동영상 27화] Java가 C보다 안전한가?



데이비드가 C 코딩 표준을 개발한 후, Java 코딩 표준도 개발하고 보니 Java가 더 안정적인 언어라는 예상과 달리 C 규칙은 100개인데 반해 Java 규칙은 170개가 넘었습니다. 단지 규칙이 더 많다는 이유로 Java가 더 불안한 언어는 아니라는 논쟁의 결론을 얻기 위해 더 심층적인 분석을 시도했습니다.

규칙에는 심각도 미터가 있는데 심각도 수치가 높을수록 보안 규칙의 중요도도 높습니다. 그런데 심각도가 높은 규칙의 수가 C와 Java에서 거의 비슷합니다. 사실 C에는 Java에 없는 종류의 취약점이 많기 때문에 이런 종류의 C 규칙이 Java에서 나타나서는 안 됩니다. 따라서 그 다음에는 심각도가 높은 규칙을 놓고 해당 규칙의 심각도가 높은 이유에 대해 다시 한번 검토했습니다. 심각도가 높은 규칙을 각 언어당 4 범주로 분류했습니다. C에서 가장 비중이 큰 범주는 메모리 변형이었고 Java에서는 내부 권한 상승이었습니다.

C와 Java의 차이점은 Java에는 애플릿과 같은 것들을 보호하기 위해 사용하는 고유의 권한 시스템이 있다는 점입니다. 익숙하거나 신뢰할 수 있는 코드가 없는 컴퓨터에서도 Java 애플릿을 실행할 수 있습니다. Java 애플릿은 Java의 내부 권한 시스템을 통해 보안을 유지합니다. C의 경우에는 내부 권한 시스템이 없습니다. 따라서 C 프로그램을 작성한 사람이 아닌 다른 사람이 해당 프로그램을 실행해도, 그 프로그램은 무엇이든 수행할 수 있습니다.

대부분의 운영체제는 외부 권한 시스템을 제공합니다. 프로그램을 실행하려 하거나 어떤 작업을 실행하려 하면 컴퓨터 팝업 창이 뜨고 암호를 입력하라고 합니다. 윈도우, 리눅스 등의 시스템에는 이러한 권한 시스템이 있지만 이들은 프로그래밍 언어가 아닙니다.

외부 권한 시스템에 대한 규칙은 C와 Java에 모두 적용됩니다. 그러나 C는 그 비중이 아주 작습니다. 이러한 규칙이 특별히 POSIX(Portable Operating System Interface)를 처리하는 C 보안 코딩 표준의 일부라는 이유만으로 이 규칙을 Java에 넣지는 않았습니다. Java의 경우, 내부 권한 시스템에 해당하는 규칙이 가장 큰 부분을 차지합니다.

두 언어 모두 권한 시스템에 대한 규칙을 갖고 있습니다. 이러한 권한 시스템을 무시하고 넘어간다 해도, 또 다른 규칙이 존재하는 두 번째 영역이 존재합니다. 하지만 두번째 영역부터는 심각도가 높은 규칙이 C에 비해 Java에서 갑자기 줄어듭니다. 즉 권한 시스템과 상호작용하는 프로그램을 실행하지 않는다면 권한 시스템 규칙에 대해서는 걱정할 필요가 없다는 뜻입니다. 걱정해야 할 심각도 규칙이 줄어든다는 뜻이지요.

최종 결론은 Java의 내부 권한 시스템을 사용하지 않는다면, 즉, Java 데스크톱 애플리케이션이나 모바일 애플리케이션 또는 애플릿을 실행한다면, 권한 규칙에 대해 걱정할 필요가 없다는 뜻입니다. 또한 심각도가 높은 규칙의 양도 C에서보다 훨씬 줄어든다는 뜻입니다.