Category Archives: 해킹보안

PHP 보안의 약방의 감초 open_basedir

오늘은 PHP보안에 있어 중요하지만 또한 많은 사람이 모르고 있는 open_basedir이라는 옵션에 대해 이야기 해보도록 하자.

우선 내가 운영하는 서버의 경우 php.ini에 다음과 같은 무식한 옵션이 있었다.

[code]disable_functions = php_uname, putenv, getmyuid, getmypid, passthru, leak, listen, diskfreespace,
tmpfile, link, ignore_user_abord, shell_exec, popen, dl, set_time_limit, exec, system,
highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd,
posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups,
posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam,
posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo,
posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times,
posix_ttyname, posix_uname[/code]

이 얼마나 무식한가? 하지만 저것도 다 막은것이 아니다.

심지어 fopen같은 경우에는 사용하는 웹어플리케이션이 너무 많아 막을수가 없었다.

뭐랄까, 도둑이 들까봐, 창문 잠그고 굴둑도 막아버렸는데, 대문을 활짝 열어놓은 기분이랄까?

PHP에는 safe_mode라는 훌륭한 보안 모드가 있다. 하지만 이것을 사용하면 대부분의 웹어플리케이션이 비정상 작동을 하게 된다.

제로보드가 잠식하고 있는 우리나라의 웹호스팅 업계에서는 엄두도 낼수 없는 옵션이다.

다음과 같은 코드를 작성하여 실행해 보자.

[code]<?
    $fp=fopen(“/etc/passwd”, “r”);
    while(!feof($fp)) {
        print(fread($fp, 4096));
        flush();
    }
?>[/code]

어떤 결과가 나오는가? 아주 멋지게 우리가 필요로 하는 정보를 내뿜어 준다.

disable_function에 fopen을 추가해 보자. 수많은 난관을 만나게 된다. 당장에 테터툴즈가 설치가 안되더라;

php.ini에 있는 open_basedir에 현재 서비스 하고 있는 페이지의 Document Root를 넣어보자. (예 : /var/www)

그리고 다시 시도해보자. 되는가? 잔인한 Fatal Error를 만나게 될것이다.

하지만 마찬가지로, PHP에서 세션을 저장하거나 업로드 파일을 올릴때 사용하는 /tmp등도 접근할수 없게 된다.

어떻게 해야 할까? 옵션을 지정할때 :를 구분자로 주어 여러개 지정할수 있다.

[code]open_basedir /var/www:/tmp[/code]

와 같이 설정해보자. 어떤가? 잘 되는것을 확인할수 있다.

안된다면 upload_tmp_dir 와 session.save_path 가 /tmp로 지정되어있는지부터 확인하여야 할것이다.

만약에 웹호스팅을 하고 있다면? open_basedir옵션이 없으면 더더욱 골치가 아파지게 된다.

누구든지 다른 사람의 계정의 파일을 열어볼수 있다면? “항상 적은 내부에 있다”

apache의 설정파일에서 VirtualHost부분을 찾아서 다음과 같이 php_admin_value로 값을 설정하자.

[code]<VirtualHost *>
    DocumentRoot /home/USER
    ServerName USER.domain
    <IfModule mod_php5.c>
        php_admin_value open_basedir /home/USER:/tmp
    </IfModule>
</VirtualHost>[/code]

이런식으로 모든 가상호스트에 대해 설정을 하면 동일한 결과를 볼수 있다.

하지만 이것은 PHP의 함수들에 대한 제제일뿐이다. system(“cat /etc/passwd”)같은 명령은 어찌할수가 없다.

system명령을 disable_function에 추가해 버릴까? 이부분에 대해서는 다음에 좀더 이야기 해보도록 하자.

PS : upload_tmp_dir, session.save_path 을 /tmp가 아닌, 다른곳으로 변경한다면, 웹인젝션을 시도하는 나쁜놈들이 좀더 헷갈리게 할수 있겠죠?

PHP 취약점의 마지막 보루 Suhosin(수호신)

사용자 삽입 이미지  사실 제목처럼 마지막 보루는 조금 오버인것 같고, 아무튼 PHP에 관심 있는 분들이라면 한번쯤은 들어봤을 Suhosin(수호신)에 대하여 이야기 해 보겠다.

자세한 이야기는 KLDP 에서 볼수 있다. Stefan Esser라는 PHP의 보안관련 리포팅을 담당하던 사람이 PHP내부에서 어떠한 일이 있었는지는 확실하지 않지만 내부에서 좋은 소리를 듣지 못하던 사람이(현재는 PHP를 나와서 보안상 문제점을 까발리고 있다) 만든 패치이다.

이사람은 한국을 좋아하는 모양이다. 외국인이 만든 프로그램의 이름이 수호신이라니. 홈페이지에도 보면 한국영화와 음식을 사랑하는 독일인이라고 적혀있다. 반가워요~♥

패치와, 익스텐션의 총 2가지 형태로 제공되어지고 있으며, 한가지만 사용하거나 혹은 조합하여 사용할수 있다.

홈페이지에서는 수호신을 다음과 같이 소개하고 있다.

Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination.
The first part is a small patch against the PHP core, that implements a few low-level protections against bufferoverflows or format string vulnerabilities and the second part is a powerful PHP extension that implements all the other protections.


Suhosin는 PHP를 위한 진보된 보안 시스템이다.
이것은 서버와 사용자로 하여금 알려진 또는 알려지지 않은 PHP 어플리케이션 및 PHP 코어의 결함을 보호하기 위해 디자인 되었다.
Suhosin은 2개의 독립적인 부분으로 나누어진다, 이것은 따로 사용되거나 조합되어 사용될 수 있다.
첫번째 부분은 PHP의 코어에 대한 작은 패치이다. 이것은 버퍼 오버플로우나 포맷 스트링 취약점에 대한 낮은 레벨의 보호를 제공한다.
그리고 두번째 부분은 다른 모든 보호를 제공하는 매우 강력한 PHP 익스텐션이다.

매우 허접하게 번역해 보았다. 이정도로 독해를 할수 있다는것만으로도 나 자신에게 감사하며 다음으로 넘어가자.

수호신의 익스텐션과 패치는 다음의 링크에서 다운받을수 있다.

http://www.hardened-php.net/suhosin/download.html

보면 알겠지만, 패치의 경우 자신이 사용하고 있는 PHP의 버젼에 맞게 사용하면 된다.

자, 이제 설치를 해보자.

1. 수호신 패치 설치
[code]# tar -zxvf php-5.2.1.tar.gz
# gzip -d suhosin-patch-5.2.1-0.9.6.2.patch.gz
# cd php-5.2.1
# patch -p1 -i ../suhosin-patch-5.2.1-0.9.6.2.patch.gz[/code]

위와같이 php에 패치를 적용한후에 정상적인 방법으로 php를 컴파일 하면 된다.
만약 rpm으로 설치를 하는 경우, srpm을 구하여 patch를 추가하도록 하자.

예를 들어 rpm -ivh 명령어를 이용해 srpm을 spec파일로 변환후에 다음의 내용을 추가하여 rpmbuild -bb로 재컴파일 하자.
[code]Patch9000: suhosin-patch-5.2.1-0.9.6.2.patch.gz
%patch9000 -p1[/code]

2. 수호신 익스텐션 설치
[code]# tar -zxvf suhosin-0.9.18.tar
# cd suhosin-0.9.18
# phpize
# ./configure
# make
# make install[/code]

이후에 php의 익스텐션으로 모듈을 등록한다.
[code]extension=suhosin.so[/code]

3. 설치 결과 확인
phpinfo()명령으로 설치가 정상적으로 되었는지 확인해 보자
사용자 삽입 이미지