Search Results for '보안'

2 POSTS

  1. 2006.11.20 자바 보안 안티패턴(antipattern) 3
  2. 2006.09.10 혼동된 대리인(confused deputy) 문제

자바 보안 안티패턴(antipattern)

Posted 2006. 11. 20. 23:54
오랜만에 포스팅합니다. 블로그에 글을 안 쓰는 것도 관성이 있는지 한 번 쉬기 시작하니깐, 계속 쉬게 되는군요.

12월 마소 원고 마감이 다가와서, 오늘 또 열심히 달렸습니다. 12월 호의 주제는 "자바 보안 프로그래밍"입니다. 흔히 C/C++ 프로그램에만 보안 문제가 있을 것이라고 생각하는데, 자바 프로그램도 C처럼 버퍼 오버플로나 포맷 스트링 버그는 없어도 다른 유형의 보안 문제들이 존재하고 있습니다. 실제로 자바원(JavaOne) 2006에서 Secure Coding Antipatterns: Avoiding Vulnerabilities라는 세션이 열리기도 하였습니다.

이번 마소 원고는 이 자바원 세션에 소개된 예제를 중심으로 자바 프로그램에는 어떤 보안 문제가 있고 어떻게 해결해야 할지를 다루고 있습니다. 사실 새로운 이야기는 별로 없고, 주로 자바원에서 다루었던 내용을 조금 더 상세히 설명하는 방식으로 했습니다.

자바 보안 안티패턴

[1] 객체가 불변(immutable)한다고 가정한다.
[2] 신뢰하지 못하는 출처(source)에 기초하여 보안 검사를 한다.
[3] 슈퍼 클래스의 변화를 무시한다.
[4] 입력 값 검사(input validation)를 하지 않는다.
[5] public static 필드를 잘못 사용한다.
[6] 생성자에서 발생한 예외(exception)가 객체를 파괴할 것이라 믿는다.

각각의 자세한 내용은 마소 12월 호에서 만나요 :) 미리 궁금하신 분은 웹으로 제공되는 자바원 세션을 직접 들어보시면 됩니다.
소프트웨어는 보통 각각 전문화(specialized)된 서비스를 제공하는 여러 서브젝트(혹은 컴포넌트, 프로시저, 함수, 서브루틴, 오브젝트)로 구성된다. 안전한 시스템의 경우 이런 서브젝트가 일을 수행하기 위해서는 이를 사용하는 클라이언트가 적절한 권한을 가지고 있어야 한다. 이 경우 서비스 서브젝트는 대리인이라고 불리는데, 클라이언트에게 위임 받은 권한으로 필요한 일을 해주기 때문이다.

혼동된 대리인(confused deputy)는 서브젝트가 클라이언트의 권한을 사용해야 하는 경우에 실수로 자기 자신의 권한으로 일을 수행했을 경우를 일컫는다. 클라이언트는 권한이 없지만 대리인은 권한이 있는 일을 부탁했을 때 대리인이 혼동하여 이 일을 수행해 준다면 보안 문제가 발생하게 되는 것이다. [위키피디아]

혼동된 대리인 문제는 소프트웨어와 시스템의 권한 분리에서 기인한다. 유닉스와 윈도를 비롯한 대부분의 운영체제는 접근 제어 리스트(access control list, ACL)를이용해 어떤 서브젝트가 어떤 권한을 가지고 있는지 검사하는데, 소프트웨어는 별다른 권한 검사를 할 필요가 없다는 면에서 관심의 분리(separation of concerns)는 확실히 보안을 강화시키는 긍정적인 효과가 있다. 하지만 이 때문에 대리인은 스스로 필요한 일을 하는 경우와 클라이언트의 일을 대신해 주는경우를 구분하기 힘들게 되었다.

이런 서브젝트의 구체적인 예로 유닉스(UNIX) 시스템의 passwd 프로그램이 있다. passwd는 프로그램을 이용해 유닉스 시스템의 사용자는 자기 자신의 암호 파일을 고치게 되는데, 이 경우 클라이언트는 /etc/passwd 파일을 고칠 권한이 없다. 대리인인 passwd 프로그램은 setuid root인 프로그램이므로 루트 권한을 가지고 있다. 여기서 의도한 바는 각각의 유저는 자기 자신의 암호만 고칠 수 있도록 하는 것이지만, 이 방식은 전적으로 passwd 프로그램의 입력 값 검사(암호 검사)에 의존하게 된다. 버퍼오버플로우(buffer overflow)를 일으켜서 암호 검사만 우회할 수 있다면(대리인을 속일 수만 있다면) passwd 프로그램(대리인)의 모든 권한을 손에 넣을 수 있게 된다.

또 다른 예로는 서버 프로그램이 있다. 서버 프로그램은 네트워크로 들어오는 요청을 받아서 처리해준다는 면에서 대표적인 대리인에 해당한다. 서버 프로그램도 UID를 가지고 있으면 해당 UID의 권한으로 프로세스가 수행된다. 만약 루트 권한으로 서버가 돌고 있다면 이 대리인의 권한은 루트인 셈이다. 문제는 서버에 서비스를 요청해 온 클라이언트는 이러한 서버 프로그램을 혼동시켜 실제로는 권한이 없는 일을 수행하도록 부탁할 수 있다는 점이다.

이런 문제를 해결하기 위해서는 케이퍼빌러티(capability)라는 보안 메커니즘이 필요하다.