[조사 결과] PHP 보안은 해결 불가능으로 결론...

geekforum의 이미지

[조사 결과] PHP보안은 해결 불가능으로 밝혀졌습니다.

PHP School에서 1년 넘도록 논란의 대상이 되어왔던 PHP보안에
대한 최종 결과가 나와서 적수네동네 여러분들께 알려드립니다.

우리들은 이때까지 외부로부터의 보안에만 관심을 가졌지 시스템 내부로
부터의 보안에는 무관심 했다는 생각이 듭니다.

많은 참고가 되시길 바랍니다.

출처: PHP School (http://www.phpschool.com)

-----

[조사 결과] PHP보안은 해결 불가능으로 밝혀졌습니다.

제목: PHP의 보안은 가능한 것인가? 결론은 불가능...
필자: PHP기자

PHP School에서 1년 넘도록 해결책을 찾지 못하던 PHP의 보안에
대한 최종 조사 결과 입니다.

결론은 PHP 보안은 절대로 불가능하다는 것입니다.

Web Hosting을 이용할때 DB연동을 위해 PHP를 이용하는 것은
절대로 해서는 않됩니다. 남이 알아도 상관 없는 간단한 작업에만
PHP를 이용해야 합니다. (즉 HTML만으로 작성해도 되는 것을
단지 작업의 편리함을 위해 사용해야 합니다.)

Perl의 경우도 마찮가지 입니다.

다수의 사용자가 존재하는 회사, 학교, 무료 계정을 제공하는 시스템에서
DB연동을 할때는 모든 DB연동 프로그램을 C나 C++언어로 작성하여
컴파일하여 사용하고 소스는 안전한 곳에 보관해야 합니다.
절대로 타인에게 DB의 dbname, user, password를
노출시켜서는 안됩니다.

중요한 자료를 꼭 PHP로 DB연동을 해야만 한다면 자신만의
전용 시스템을 이용하는 Server Hosting 서비스를
이용해야 합니다. 물론 인터넷 서비스회사의 안전에 대한
책임의식이 있을때만 안전하겠습니다.

시스템이 동작하고 있는 곳의 관리자가 마음만 먹으면 root password를
몰라도 시스템의 접근이 가능하니까요. 그래서 보안이 필요하다면
시스템 Bios상의 암호를 걸고, 그것도 믿을 수 없다면 Hard Disk 자체를
암호화 해주는 특수한 장비를 이용해야 합니다.

그러나 모든 방어도 현실적인 여건을 고려하면 불가능 합니다.
정전이나 시스템의 유지보수를 위해 root암호는 결국 인터넷 회사의
관리자에게 알려집니다.

그래서 외국에서는 아예 컴퓨터 시스템에 케이스에 자물쇠를 달아서
열쇠가 없이는 시스템을 열어 볼 수 없도록 하고 있습니다.

PHP 보안 문제의 언급은 PHP School에서 1년 전에 나왔습니다.
아무도 제대로 된 해결책을 주시지 못 했습니다.

많은 학생들이 전문가들은 할 수 있겠지 하는 믿음으로 질문을 던졌지만

답변은 잘 하면 될 것이다...
혹시 이렇게 하면 되지않을까...

짐작성 대답을 하셨지만 모두가 오답이었습니다. 이유는 뒤에서 밝히겠습니다.

본 기자도 PHP보안에 대해 관심을 가지고 조사를 해보고 실험을 해보았습니다.
PHP School에서 답변란에 나오는 방법을 찾아 실험을 했지만 제대로 된 답은
단 한건도 없었습니다. 많은 분들이 해결책을 제시해 주셨지만 조사 결과
모두 헛점이 있었습니다.

chmod 명령을 사용하여 권한을 바꾸어 주면 된다는 의견이
주류였습니다.

그러나 전문가들의 의견은 오히려 더 위험한 방법이란 결론입니다.
자신의 파일과 디렉토리를 nobody로 바꾼다 하더라도
PHP보안에 아무런 도움이 되지 않고 타인의 cgi를
이용한 공격에 더 위험해져서 최악의 경우 파일을 삭제 당하여
원본도 찾을 수 없는 결과가 생긴다고 합니다.

자,... PHP보안에 대한 조사 결과를 보고합니다.

제가 여러 통로로 전문가들의 조언을 받아 조사를 해본 결과
PHP의 보안 문제는 해결 할 수 없는 것으로 밝혀졌습니다.

그 원인을 살펴 보면 유닉스계열은 어떤 프로세스가 동작하려면
그 실행의 id가 할당되는데 이 pid에는 소유자가 정해집니다.

보통 Web Server는 아무런 사용자도 아닌 nobody란 사용자로서
동작을 하고 pid를 할당을 받습니다.

모든 cgi나 PHP, Perl Script는 nobody로서 실행을 합니다.

C나 C++언어로 작성하여 컴파일되어 있는 cgi 프로그램은 적어도 nobody로서
실행권한이 주어져야 동작을 합니다.

shell script와 같은 경우 일단 읽어서 실행을 하므로 nobody가
읽고, 실행할 수 있는 권한이 주어져야합니다.

PHP와 같은 경우 보통 Apache에서 모듈로 동작하므로 실행 권한은 필요치 않으나

nobody로서 읽을 수는 있어야 합니다.

결론을 말씀 드리자면

Web Hosting이나 여러 사용자가 계정을 가지고 있는 unix시스템을 사용할경우
nobody가 읽을 수 있는 shell script, perl script, PHP와 같은 경우
그 시스템의 계정을 가진 사람이라면 어렵지 않게 그 소스를 읽어 낼 수 있습니다.
따라서 사용하고 있는 DB를 보호할 수가 없습니다. 다른 사람이 자신의 DB 내용을
변경하고 삭제가 가능합니다.

C나 C++로 컴파일한 cgi는 DB접속 프로그램에 암호화 루틴을 넣어서 작성한다면
어느 정도 안전하겠으나 전문가들이라면 디버깅 툴을 이용하여 쉽게 DB접속
암호를
알 수 있다고 합니다. 그래서 자신 이외에는 읽을 수 없도록 권한을 주면
안전합니다. 실행만 할 수 있고 읽을 수 없도록 한다는 뜻입니다.

자료실과 같이 upload가 가능한 디렉토리나 파일인 경우 그 시스템의 사용자들로
부터 자료 회손 공격에 대해서 막을 방법은 원천적으로 없습니다.

업로드 파일인 경우 그 파일의 생성시 nobody의 권한이 주어지므로
타인이 cgi를 이용하여 얼마든지 들어와서 파일의 삭제, 내용변경이 가능합니다.

본 기자의 투고는 이것으로 마치겠습니다.

----

즐거운 리눅싱 되세요...

한꺼번에 읽기

익명 사용자의 이미지

결론을 너무 빠르게 내신것 같네요.
제가 보기에는 불가능한것 같지는 않아요.
제가 리눅스를 좋아하는 이유중의 하나가
물과 비슷하다는 점이죠.
어느 그릇에 담기느냐에 따라 모양도 변하니까요.
밑의 이야기 하시는거는 PHP자체의 보안의 문제가 아니고
웹서버의 보안에 해당하는 일반적인 이야기같네요.
시스템 관리자가 해줘야하는 일같네요.

PHP학생 wrote..
:
:
: [조사 결과] PHP보안은 해결 불가능으로 밝혀졌습니다.
:
: PHP School에서 1년 넘도록 논란의 대상이 되어왔던 PHP보안에
: 대한 최종 결과가 나와서 적수네동네 여러분들께 알려드립니다.
:
: 우리들은 이때까지 외부로부터의 보안에만 관심을 가졌지 시스템 내부로
: 부터의 보안에는 무관심 했다는 생각이 듭니다.
:
: 많은 참고가 되시길 바랍니다.
:
: 출처: PHP School (http://www.phpschool.com)
:
: -----
:
: [조사 결과] PHP보안은 해결 불가능으로 밝혀졌습니다.
:
: 제목: PHP의 보안은 가능한 것인가? 결론은 불가능...
: 필자: PHP기자
:
: PHP School에서 1년 넘도록 해결책을 찾지 못하던 PHP의 보안에
: 대한 최종 조사 결과 입니다.
:
: 결론은 PHP 보안은 절대로 불가능하다는 것입니다.
:
: Web Hosting을 이용할때 DB연동을 위해 PHP를 이용하는 것은
: 절대로 해서는 않됩니다. 남이 알아도 상관 없는 간단한 작업에만
: PHP를 이용해야 합니다. (즉 HTML만으로 작성해도 되는 것을
: 단지 작업의 편리함을 위해 사용해야 합니다.)

익명 사용자의 이미지

php 보안에 대하여 생각만 하고
한번도 데스트를 못해봤는데
가능하리란 방법이 있어 글을 올립니다.

제 생각은
일반 cgi프로그램들이 하듯이
암호가 필요한 단어들을 암호화시켜서
별도의 화일에 저장해두고
접속시 이전에 다시 그 화일을 열어 암호화된 단어를 역으로 추출해서
DB연결도 하고 패스워드도 넣고 하면 되지 않나요?
이렇게되면 중요정보가 담긴 그 화일을 누가 읽어도
원래 단어를 모르니 보안이 되지 않을까요?
아주 간단하게 php로 구현이 가능하다고 생각이 되는데...

제가 아직 encrypt 사용법을 잘 몰라서 못하고 있는데
아시는 분 테스트 부탁합니다.

-나는 리눅'설' ^^;

익명 사용자의 이미지


같은 시스템의 계정을 가진 자가 먼저 PHP화일을 카피하고
암호화가 되어있는 파일의 위치를 알아 낸뒤 다시 암호화가 되어
있는 파일을 상대로 암호를 깨면 간단히 암호가 깨어집니다.

왜냐하면 PHP소스에는 암호를 복호화하는 방법이 적혀 있기 때문입니다.

설호규 wrote..
: php 보안에 대하여 생각만 하고
: 한번도 데스트를 못해봤는데
: 가능하리란 방법이 있어 글을 올립니다.
:
: 제 생각은
: 일반 cgi프로그램들이 하듯이
: 암호가 필요한 단어들을 암호화시켜서
: 별도의 화일에 저장해두고
: 접속시 이전에 다시 그 화일을 열어 암호화된 단어를 역으로 추출해서
: DB연결도 하고 패스워드도 넣고 하면 되지 않나요?
: 이렇게되면 중요정보가 담긴 그 화일을 누가 읽어도
: 원래 단어를 모르니 보안이 되지 않을까요?
: 아주 간단하게 php로 구현이 가능하다고 생각이 되는데...
:
:
: 제가 아직 encrypt 사용법을 잘 몰라서 못하고 있는데
: 아시는 분 테스트 부탁합니다.
:
: -나는 리눅'설' ^^;

익명 사용자의 이미지

정확하지 않은 정보를 이렇게 선뜻 결론을 내버리는 기자가 있다니...

보안 문제 해결을 위해

제가 한가지 생각해 본 것은

음.... 그렇니까...

우리가 풀어야 할 문제는 다음 3가지 입니다.

1. 각 시스템 유저는 자신의 디렉토리에 엑세스 가능하다.
2. 타 유저는 내 디렉토리에 전혀 접근 할 수 없어야 한다.
3. 아파치 데몬(nobody) 는 1의 유저의 디렉토리, 파일을 읽을수 있어야 한다.

해결방법

1. 각각의 유저디렉토리 디렉토리의 퍼미션을 모두
750 으로 주고
2. 관리자는 모든 계정사용자와 같은 그룹을 만들고 이곳에 각각 nobody 를 넣어준다.

즉 , loveme라는 사용자 등록시 loveme라는 유저 및 loveme 라는 그룹이 만들어지므로 loveme라는 그룹에 nobody 를 추가하고 각 유저의 디렉토리 퍼미션을 750으로 준다는 이야기 입니다.

여러분의 의견을 기다립니다.

익명 사용자의 이미지

정진호 wrote..
: 정확하지 않은 정보를 이렇게 선뜻 결론을 내버리는 기자가 있다니...
:

제가 볼때는 아주 정확한 정보인 것으로 보이니데요.
유닉스의 근본적인 문제가 아닌가요...(99.99% 확신함).

그래도 소프트웨어의 세계에서는 불가능이란 없으니까 머 가능할 수도 있겠지만
지금 사용하고 있는 환경에서는 불가능하다고 알고 있습니다.

혹시 리눅스원에 계시는 개발자 여러분들께 여쭤보셨나요? 그 곳에서도 정확한
결론을 내리지 못했는지 궁금합니다. Can or Can't를 발랍니다.

어림짐작으로 Maybe하지 마시고 확실히 알아 보시고 알려주시면 좋겠군요.

리눅스원의 기술적 수준을 가늠해 볼 좋은 기회겠군요...

다른 리눅스 개발 업체들은 모르고 있는 건지, 아니면 알고도 모른 척하는 건지...

:
: 보안 문제 해결을 위해
:
: 제가 한가지 생각해 본 것은
:
: 음.... 그렇니까...
:
: 우리가 풀어야 할 문제는 다음 3가지 입니다.
:
: 1. 각 시스템 유저는 자신의 디렉토리에 엑세스 가능하다.
: 2. 타 유저는 내 디렉토리에 전혀 접근 할 수 없어야 한다.
: 3. 아파치 데몬(nobody) 는 1의 유저의 디렉토리, 파일을 읽을수 있어야 한다.
:
: 해결방법
:
: 1. 각각의 유저디렉토리 디렉토리의 퍼미션을 모두
: 750 으로 주고
: 2. 관리자는 모든 계정사용자와 같은 그룹을 만들고 이곳에 각각 nobody 를 넣어준다.
:
: 즉 , loveme라는 사용자 등록시 loveme라는 유저 및 loveme 라는 그룹이 만들어지므로 loveme라는 그룹에 nobody 를 추가하고 각 유저의 디렉토리 퍼미션을 750으로 준다는 이야기 입니다.
:
: 여러분의 의견을 기다립니다.

김정균의 이미지

리눅스개발자 wrote..
: 제가 볼때는 아주 정확한 정보인 것으로 보이니데요.
: 유닉스의 근본적인 문제가 아닌가요...(99.99% 확신함).

맞죠. php만의 문제가 아니라 CGI방식의 문제라는 것이죠.
근데 왜 유독 php만 걸고 넘어 지는 것일까요 ^^;

익명 사용자의 이미지

김정균 wrote..
: 리눅스개발자 wrote..
: : 제가 볼때는 아주 정확한 정보인 것으로 보이니데요.
: : 유닉스의 근본적인 문제가 아닌가요...(99.99% 확신함).
:
: 맞죠. php만의 문제가 아니라 CGI방식의 문제라는 것이죠.
: 근데 왜 유독 php만 걸고 넘어 지는 것일까요 ^^;

아무래도 PHP가 DB연동에 많이 쓰이기 때문 아닐까요?

PHP소스의 누출 문제 보다는 DB의 암호가 노출됨으로 해서 생기는
여러가지 파급효과를 볼때 아주 중요한 문제가 되지 않을까 생각합니다.

또한 PHP는 다른 언어와는 달리 시스템을 잘 이해하지 못하는 분들도
어렵지 않게 시스템의 여러 기능을 사용할 수 있도록 해주는데도 그 원인이
있지 않을까요...

C나 Shell Program의 경우 시스템의 이해가 없이는 일반적으로 사용하기도
어려우므로 크게 문제될 것이 없지만 PHP의 경우 총기 교육을 받지 못한 자에게
총을 주는 것과 마찮가지로 그 막강한 기능과 편리성에 비해서 초보자들이
저지르기 쉬운 많은 문제점이 있지 않을까 여겨집니다.

여하튼 저 생각도 위에서 언급한 PHP보안 문제의 해결은 불가능할 것으로 생각이
되는데 아주 실력있는 분께서 최종적인 결론을 내려주시면 고맙겠습니다.

리눅스 배포본 업체에 계신분도 해결을 못하고 이렇게 하면 되지않을까요와 같이
정도의 짐작성 답변을 하시는 것을 보니 지켜 보는 사람도 답답하네요.

누가 결론 좀 내려주시지요...

cdpark의 이미지

공개키 암호를 써서 암호화한다면 가능할 수도 있겠군요.

문제는
1. script 내부에 DB의 비밀번호가 들어있다.
2. 누군가 임의로 script를 복사후 변조해서 사용할 수 있다.

의 두가지니깐 2번 단계는 php를 통째로 암호화하면서 해결할 수 있을겁니다.
(혹은 php에 대한 PGP sign 정도로...)

1번 단계에 대해서는... web 서버에서 sign된 php script에 대해서만
DB에 접근할 수 있도록 제한하는 정도면 될 듯 싶습니다.
웹 서버에 load가 많이 걸리겠지만, 이건 PGP sign check를 늘 하지 않고
검사 결과를 cache하는 정도라면 괜찮지 않을까요?

--
박종대

joshuajh의 이미지

"소스를 보고 DB의 ID와 패스워드를 확인 할 수 있다."의 문제니까요
공개키 암호화 방식을 쓰던, 대칭키 암호화 방식을 쓰던
스크립트를 실행 시키려면 결국 복호화 해야만 하기 때문에
어딘가에는 복호화 키가 저장되어야 하고 그 복호화키를 nobody가
읽을 수 있어야만 한다는 문제가 남아있으니 별반 차이가 없을 듯 합니다.

익명 사용자의 이미지


..(*^^*)..

phpschool에서 쓰신거 확실한가여? ㅡㅡ;

도데체 읽어봐두 무슨말인지 몰르겠군여.. 단지 nobody로 실행가능하기
때문에 보안에 문제가 있다는 말인가여? --> 어허라.~~~

물론 그런 WebHosting System에서 보안을 이야기 한다는것이 우습지만
그 System에 막강한 보안을 약속하는(?) NT를 설치하고 ASP를 사용한다면
그쪽에 보안이 우수해 지나여? --> 통제로다.~~~

글 올리신분의 예가 별로 좋지 않다고 봅니다.
그런 WebHosting System에서 보안을 이야기 하기 보다
ASP의 소스공개나 JSP의 소스공개에 의한 DB ATTACK부분은 이야기 되고
있으나 아직 PHP 소스공개에 의한 DB 공격부분은 이야기 듣지 못했슴당..

또한 제가 보기엔 그런 공격에 방어할 방법이 없다고는 생각치 않군여
제가 잘 몰라서 그런진 모르지만 ^^;..

-- 리눅스 시스템보단 리눅스 정신을 사랑하는 사람이 --

DiNe의 이미지

NT에서는 Windows NT Challenge/Response 라는 방법으로 보호할 수 있지요. 글쎄요. 이 방법조차도 뚫린.. 다고 보는게 (완벽은 없으니) 맞겠지만, 적어도 여기서 제기된 PHP의 보안문제의 경우는 위와 같은 방법으로 해결 가능합니다.

방어할 방법은... NT와 마찬가지라고 생각되는군요. 결국은 인증문제일 듯 합니다. (제 짧은 머리로는 그 방법밖에 모르겠습니다. --;)

김국성 wrote..
:
: ..(*^^*)..
:
: phpschool에서 쓰신거 확실한가여? ㅡㅡ;
:
: 도데체 읽어봐두 무슨말인지 몰르겠군여.. 단지 nobody로 실행가능하기
: 때문에 보안에 문제가 있다는 말인가여? --> 어허라.~~~
:
: 물론 그런 WebHosting System에서 보안을 이야기 한다는것이 우습지만
: 그 System에 막강한 보안을 약속하는(?) NT를 설치하고 ASP를 사용한다면
: 그쪽에 보안이 우수해 지나여? --> 통제로다.~~~
:
: 글 올리신분의 예가 별로 좋지 않다고 봅니다.
: 그런 WebHosting System에서 보안을 이야기 하기 보다
: ASP의 소스공개나 JSP의 소스공개에 의한 DB ATTACK부분은 이야기 되고
: 있으나 아직 PHP 소스공개에 의한 DB 공격부분은 이야기 듣지 못했슴당..
:
: 또한 제가 보기엔 그런 공격에 방어할 방법이 없다고는 생각치 않군여
: 제가 잘 몰라서 그런진 모르지만 ^^;..
:
: -- 리눅스 시스템보단 리눅스 정신을 사랑하는 사람이 --

익명 사용자의 이미지

저는 /~$HOME/public_html/board 라는 디렉토리에 php로 만든 게시판을 넣어두고
사용하고 있는데요..

제 홈디렉토리의 퍼미션을 711로 두고 읽는 권한을 주지 않았는데 게시판을 읽던데요..
그리고, 스크립트와 같이 php도 소유권을 nobody로 쥐야한다고 하셨나요?
저는 그냥 제 소유고 하고 쓰고 있는데 별문제 없는 것 같은데요..

로컬에서 루트나 제가 아니면 접근이 안되던데..
이걸로 문제 해결이 안되나요?

hanbak의 이미지

이제는 많이 아시겠지만 꼭 그런건 아니라는 의미로 글을 적습니다.

성능이야 상당히 줄지만 suphp 같은 랩퍼를 걸 설치함으로써 보안을 강화하실수 있습니다. ( http://suphp.org/ )

아파치 전체에 적용하는 suid 랩퍼도 있기는 하지만 이걸 쓰면 의미없이 정적인 파일을 제공하기 위해서도 변신하니까
엄청난 성능의 저하를 줍니다. 그나마 suphp 를 적용함으로써 php 를 서비스할때만 살짝 성능의 저하를 주게 하는 편이
그나마 보안 과 성능의 타협점 같습니다.

select99의 이미지

이해가 안되는군요..

일반유저가 왜 nobody 권한을 갖고 있어야하죠?

cgi파일은 소유자 user1:apache 로서 750 권한을 가지고

apache 가 cgi 를 실행하는데는 문제가 없고

user2 는 user1 의 cgi 에 접근권한이 없는데..

어째서 볼수 있다는거죠?

-----------의견기다려봅니다.---------------

bushi의 이미지

정말 몰라서 댓글다신 겁니까 ?

서버에 자기 계정이 있다면 서버의 헛점이고 뭐고 다 필요없습니다.
파일을 읽어서 내용을 출력하는 간단한 php(혹은 cgi) 작성해서 자신의 계정에 올리면,
apache 가 접근할 수 있는 모든 문서를 apache 와 똑같은 권한으로 '읽어' 볼 수 있습니다.

OTL

select99의 이미지

아~참 그렇지..;; 지송..

실행파일의 소유자에따라 접근시켜줄수 있는기능이 있다면 가능할것도 같은데..

acgi ( auser )

bcgi ( buser )

----------------

acgi 가 afile 에 접근 허가..

bcgi 가 afile 에 접근 불허..

이런 기능이 OS에 안되면 최소한 apache 에 있어야겠군요..