웹 서버를 시스템에 설치해서 동작시킨다는 것은 자신의 컴퓨터를 인터넷 상에 아무나 볼 수 있도록 놓아둔 것과 마찬가지라고 할 수 있다. 그런데 대부분의 사람들은 구경만하고 가지만 때로는 보는 것만으로는 만족하지 않고 기어들어 오려는 사람들이 있기 마련이다. 이런 경우를 대비해야만 한다.
소프트웨어 버그가 있으면 보안 헛점이 생길 수 있다. 소프트웨어는 복잡하고 방대한 시스템일 수록 버그가 생길 가능성이 많아지고 따라서 보안 헛점이 생길 가능성도 많아진다. 웹 서버도 복잡한 소프트웨어 시스템 중에 하나로 버그가 있을 가능성이 많아진다.
웹 서버는 CGI란 메카니즘을 통해서 임의의 외부 프로그램을 서버쪽에서 실행한다. CGI 프로그램 자체도 소프트웨어이므로 버그로 인한 보안 헛점의 가능성을 배제할 수 없다. 웹 상에서의 보안은 여러 측면에서 고려할 수 있지만 여기에서는 CGI의 보안에 관해서만 논의하겠다.
CGI가 왜 위험한가?
보안측면에서 CGI가 문제가 될 수 있는 것은 웹 서버가 아무리 안전하게 작성되었다고 하더라도 CGI 자체의 버그로 인해서 외부에 서버가 노출될 가능성이 있기 때문이다.
CGI 자체도 하나의 작은 서버라고 볼 수 있기 때문에 웹 서버와 마찬가지로 조심스럽게 작성되어야만 한다. 그렇지만 많은 웹 서버 관리자들이 CGI를 통해서 처음으로 네트워크 프로그래밍을 해 보는 경우가 많다. CGI 프로그램이 보안 헛점을 가질 수 있는 건 다음과 같은 경우이다.
. 의도적이건 아니건 해커가 칩입하는데 도움을 주는 정보를 제공할 수도 있다.
. 의도하지 않은 입력을 줌으로서 해커가 원하는 명령을 수행할 수도 있다.
웹 서버가 "nobody"로 수행되고 있는 경우라도 CGI 프로그램은 보안 헛점을 갖는다. "nobody"의 권한으로도 passwd 파일을 읽거나 시스템의 네트워크 정보를 읽거나 할 수 있기 때문이다. 따라서 안전한 CGI 프로그램을 위해서 몇가지 고려해야 할 사항을 알아보자.
CGI 프로그램의 디렉토리
CGI 프로그램을 여기저기 둔다고 해서 특별히 보안이 더 나빠지는 것은 아니다. 그러나 CGI 프로그램의 보안 헛점을 관리하기 위해서는 아무래도 한 디렉토리에 두고 관리하는 것이 여기저기 흩뜨러뜨린 것보다 관리하기 쉽기 때문이다.
특히 사용자별로 홈페이지를 가지고 있을 경우에는 누구라도 보안 헛점을 가지고 있는 프로그램을 만들거나 사용할 수 있기 때문에 이렇게 하는 것이 더욱 좋다.
따라서 '/cgi-bin/'이라는 디렉토리에만 두고 CGI 프로그램의 설치는 웹 서버 관리자만 할 수 있도록 한다면 사용자가 작성한 잘못된 프로그램으로 인한 보안 헛점은 피할 수 있을 것이다.
사용언어
일반적으로 말하면 펄이나 쉡 스크립트같은 인터프리터 언어보다는 C와 같은 컴파일 언어가 더 안전하다고 할 수 있다.
첫번째 이유로는 프로그램의 소스를 C 프로그램인 경우는 얻을 수 없기 때문이다. 해커가 프로그램이 어떻게 동작하는지 잘 알면 버그를 찾아내기도 쉬워지기 때문에 소스가 공개되는 것은 바람직하지 않다. C 프로그램은 컴파일 한 후 바이너리를 '/cgi-bin/'에 저장해 두기 때문에 해커가 소스를 얻어낼 수는 없을 것이다.
그렇지만 인터프리터 언어는 잘못하면 소스가 공개될 수 있는 여지가 크다. 서버의 설정을 잘 하면 이렇게 되지는 않겠지만, 예를 들어 .cgi 프로그램을 수정하고 백업 파일을 .bak라는 이름으로 저장해 두었다면 .cgi 프로그램의 소스가 공개될 수도 있을 것이다. 스크립트 프로그램을 URL로 요청을 하면 소스를 얻을 수 없지만 백업 파일에 대한 URL을 요청하는 경우에는 소스를 얻어낼 수도 있다.
http://your-site/the/path/to/your_script.bak
(이것때문에도 CGI 프로그램을 '/cgi-bin/'이라는 디렉토리에 두는 게 좋다) 크기와 복잡성 측면에서도 컴파일된 코드가 인터프리트 코드보다 안전할 수 있다. 쉘이나 펄 프로그램은 자체가 상당히 큰 소프트웨어이기 때문에 C로 작성된 간단한 CGI 프로그램보다는 버그가 생길 가능성이 커지기 때문이다. 펄 인터프리터의 버그로 인한 보안 헛점을 이용해서 해커가 공격해 올 수도 있다.
두번째로 펄이나 쉡과 같은 인터프리터 언어에서는 시스템 명령을 수행하고 그 결과를 캡쳐하는게 컴파일 언어에 비해서 상당히 편하게 되어 있다. 시스템 명령을 수행하는 것이 보안 헛점을 유발할 가능성이 크다. C 언어에서는 시스템 명령을 수행하기 위해서는 상당히 복잡한 과정을 거쳐야 하므로 프로그래머가 시스템 명령을 수행할 가능성은 그 만큼 작아진다.
그렇지만 컴파일된 코드라고 해서 반드시 안전한 것은 아니다. 얼마전에 NCSA 1.4.x에 딸려 있던 util.c라는 파일에 있던 루틴에서 보안 헛점이 발견된 적도 있었다. 또, 펄같은 경우 내부적으로 보안을 체크하는 루틴이 있어서 그 기능을 이용하면 상당히 안전한 스크립트를 짤 수도 있다.
공개용 CGI 프로그램을 설치시 유의 사항
인터넷 상에 공개되어 있는 CGI 프로그램도 마찬가지로 보안 헛점을 가질 수 있으므로 주의깊게 조사하고 그 프로그램의 기능과 작동방식을 잘 이해한 후 설치해야 한다. 다음은 을 검사힐 때 체크해봐야 할 것들이다.
복잡도
복잡하면 할수록 보안 헛점의 가능성은 커진다.
파일쓰기여부
파일을 읽어들이는 프로그램은 시스템 정보를 읽어들여서 해커에게 보낼 수도 있다. 파일을 기록하는 프로그램은 문서를 변경시키거나 손상시킬 수도 있다. 더 심한 경우는 트로이 목마를 집어 넣을 수도 있다.
다른 프로그램과의 연계여부
예를 들어 많은 CGI 프로그램이 전자우편을 보낼 때 sendmail을 사용한다. 이런 상호작용이 안전한 방법으로 이루어지는지 검사해야 한다.
SUID의 권한여부
일반적으로 suid 프로그램은 매우 위험하다. 특별한 경우가 아니라면 이렇게 할 이유가 없다.
입력검사 여부
프로그램의 저작자가 입력을 충분히 검사하는 가를 본다. 입력을 검사한다는 것은 저작자가 보안 헛점을 이미 고려하고 있다는 뜻이 될 것이다.