9.8. PHP

SecureReality 는 "A Study in Scarlet - Exploiting Common Vulnerabilities in PHP" 라는 매우 흥미로운 논문을 발표하였다 [Clowes 2001]. 이 논문은 PHP, 특히 PHP 4.1.0 이전 버전에서 보안적인 프로그램을 작성하는데 있어서 다소의 문제들을 논의하고 있다. Clowes 는 ``디폴트 PHP 설정에서 보안적인 PHP 애플리케이션을 작성하는 것은 각자 노력한다고 하더라도 매우 어렵다" 고 결론지었다.

모든 언어에 보안 문제가 있다고 하더라도 PHP 에는 PHP 를 대부분의 언어들보다 비보안적이게 하는 한가지 특별한 문제가 있다; 이는 데이타를 이름공간에 적재하는 방식이다. 디폴트로 PHP (버전 4.1.0 이하) 에서는 웹을 통해 PHP 로 보내지는 모든 환경 변수 및 값이 일반적인 변수들이 적재되는 동일한 이름공간 (전역변수) 내로 자동적으로 적재된다 - 따라서 공격자는 임의의 변수에 임의의 값을 설정할 수 있으며 PHP 프로그램이 명시적으로 재설정하지 않는다면 이 값이 유지된다. 게다가 PHP 는 처음 요청될 때 디폴트 값을 갖는 변수를 자동적으로 생성하는데 따라서 PHP 프로그램이 변수를 초기화하지 않는 것이 일반적이다. 변수 설정을 하지 않는 경우 PHP 가 이를 보고할 수는 있지만 디폴트로 그렇게 하지 않을 것이다 - 이는 단순히 에러 보고로 이러한 에러를 야기하는 예외적인 방식을 발견한 공격자를 막지 못할 것음을 주목해라. 따라서 디폴트로 PHP 는 프로그램이 공격자를 무시하기 위해 특별히 주의를 하지 않는다면 공격자가 프로그램내의 모든 변수 값을 완전히 제어할 수 있도록 한다. 일단 공격자가 프로그램을 제어하게 된다면 이러한 변수를 재설정할 수 있으며 따라서 각자 어떤 변수(명확하진 않지만 적어도 한개의 변수) 를 재설정하지 못한다면 PHP 프로그램을 취약하게 만들 수도 있다.

예를 들어 다음 PHP 프로그램 (Clowes 로부터의 예제) 은 패스워드를 알고 있는 사람들에게 단지 어떤 중요한 정보를 얻도록 하지만 공격자는 그 사람들의 웹 브라우저에 ``auth" 를 설정해 인가 검사를 파괴할 수 있다:

 <?php
  if ($pass == "hello")
   $auth = 1;
  ...
  if ($auth == 1)
   echo "some important information";
 ?>

저자와 많은 사람들은 이러한 특별히 위험한 문제에 대해 푸념해왔지만 이는 PHP 가 널리 사용되고 있기 때문에 특별한 문제이다. 결국 사용하기 쉽다고 알려진 언어는 보안적인 프로그램 작성을 더욱 쉽게한다. PHP 에서 ``register_globals" 를 ``off" 로 설정함으로써 이러한 잘못된 특징을 금지하는 것은 가능하지만 디폴트로 4.1.0 이상의 PHP 버전은 이를 ``on" 으로 설정하며 4.1.0 이전 PHP 버전은 register_globals 를 off 설정하는 경우 더욱 사용하기 어렵다. PHP 개발자들은 4.1.0 버전 발표에서 ``다음 semi-major 버전에서는 PHP 의 신규 설치시 디폴트로 register_globals 를 off 로 설정할 것이다" 라고 공표했다.

``register_globals" 가 ``on" 으로 설정되어 있는 경우 중요한 프로그램에 대해 PHP 는 위험하다 - 비보안적인 프로그램을 작성하는 것이 너무나도 쉽다. 그러나 ``register_globals" 가 일단 ``off" 로 설정된다면 PHP 는 합당한 개발 언어이다.

보안적인 디폴트는 ``register_globals" 를 ``off" 로 설정해야 하며 또한 사용자들이 외부 출처로부터 받아들일 수 있는 입력을 지정하고 제한하는 것을 더욱 쉽게 하는 몇몇 함수를 포함해야 한다. 아파치와 같은 웹 서버들은 이러한 보안적인 PHP 설치를 개별적으로 설정할 수 있다. 사용자들이 받아들이길 원하는 입력 변수를 열거하기 쉽게 하는 루틴들이 PHP 라이브러리에 놓일 수도 있다; 몇몇 함수들은 이러한 변수들이 가져야하는 패턴 및/또는 요구되는 변수 타입을 검사해야 한다. 저자 의견으로는 PHP (register_globals 가 on 으로 설정) 는 현재 훌륭한 보안적인 웹 개발 언어는 아니다. 그러나 합당한 개발 언어로 사용되도록 쉽게 수정될 수 있다.

PHP 를 사용하기로 한 경우 다음은 얼마간의 저자의 충고이다 (이러한 충고 중 많은 부분은 Clowes 가 제기한 문제에 대처하기 위한 방법에 기초한다):