http://nchovy.kr/forum/2/article/434 에 대한 트랙백.
해당 문제는 http://secunia.com/advisories/16433/ 와 같이, 다중확장자를 가진 파일을 업로드할 때 문제가 됩니다.
해당 문제를 해결하기 위해선 Apache에서 디렉터리에 대해 명시적으로 -MultiViews 옵션을 주어 기능을 비활성화하면 됩니다.
왜 옵션명이 MultiView 냐면, 사용자가 접속한 지역이나 언어 설정, 혹은 선호하는 기준에 따라 사용자에게 다른 페이지를 보여주고 싶을 때 사용하기 때문입니다.
참고 :
1. http://httpd.apache.org/docs/1.3/content-negotiation.html
2. http://httpd.apache.org/docs/1.3/mod/mod_negotiation.html
3. http://httpd.apache.org/docs/1.3/mod/mod_mime.html
(이 기능은 사양이지 취약점이 아닙니다).
Apache 코드를 분석해보면 이 기능 구현에 몇몇 모듈이 관여하고 있는 것을 알 수 있는데, 서버 측의 Mime 설정과 관련하여 복잡하게 돌아갑니다.
Apache 매뉴얼에도 나와 있듯이
"If the server receives a request for /some/dir/foo and /some/dir/foo does not exist, then the server reads the directory looking for all files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements, and returns that document."
위와 같은 동작이 발생하고,
파일명을 오른쪽에서 왼쪽으로 파싱해나가면서, Apache가 설정 파일을 통해 파악할 수 있는 MIME type 이나 Handler가 나올 때까지 계속 진행합니다. 그러다, 적절한 파일로 판명이 되면 그에 대한 처리를 하는 것이죠. (물론 실제 알고리즘은 훨씬 복잡합니다만, 대체로 오른쪽에서 왼쪽으로 간다고 생각하면 됩니다)
따라서 a.php.rar 나 a.php.hwp 와 같이 Default로 Apache 설정 파일에 MIME type이나 Handler 설정이 없는 확장자에 대해선 가장 오른쪽의 rar, hwp 확장자를 무시하고, 다음의 php 확장자를 본 후, AddHandler (혹은 AddType)에 php 설정이 있기 때문에, PHP 처리기로 넘기는 것입니다. 물론 a.php.foo.bar.rar 같은 형태도 가능합니다.
다국어 지원이나 사용자의 Accept 헤더 MIME type 설정에 따른 지능적인 처리를 원하시면 Default 상태인 해당 상태로 두면되지만, 국내 사용자를 대상으로 일반적인 서비스를 할 때는 -MultiViews 를 명기하면 다중 확장자 업로드 문제로부터 안전합니다.
근데, 이 테크닉은 무척 오래된 것인데 왜 요새 주목받는지 이해가 잘...
참고: 제가 2004년에 발표했던 http://www.securityfocus.com/archive/1/384643 보안 권고문을 보셔도 심플하게 잘 설명되어 있습니다.
이글루스 가든 - professional secur...
해당 문제는 http://secunia.com/advisories/16433/ 와 같이, 다중확장자를 가진 파일을 업로드할 때 문제가 됩니다.
해당 문제를 해결하기 위해선 Apache에서 디렉터리에 대해 명시적으로 -MultiViews 옵션을 주어 기능을 비활성화하면 됩니다.
왜 옵션명이 MultiView 냐면, 사용자가 접속한 지역이나 언어 설정, 혹은 선호하는 기준에 따라 사용자에게 다른 페이지를 보여주고 싶을 때 사용하기 때문입니다.
참고 :
1. http://httpd.apache.org/docs/1.3/content-negotiation.html
2. http://httpd.apache.org/docs/1.3/mod/mod_negotiation.html
3. http://httpd.apache.org/docs/1.3/mod/mod_mime.html
(이 기능은 사양이지 취약점이 아닙니다).
Apache 코드를 분석해보면 이 기능 구현에 몇몇 모듈이 관여하고 있는 것을 알 수 있는데, 서버 측의 Mime 설정과 관련하여 복잡하게 돌아갑니다.
Apache 매뉴얼에도 나와 있듯이
"If the server receives a request for /some/dir/foo and /some/dir/foo does not exist, then the server reads the directory looking for all files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements, and returns that document."
위와 같은 동작이 발생하고,
파일명을 오른쪽에서 왼쪽으로 파싱해나가면서, Apache가 설정 파일을 통해 파악할 수 있는 MIME type 이나 Handler가 나올 때까지 계속 진행합니다. 그러다, 적절한 파일로 판명이 되면 그에 대한 처리를 하는 것이죠. (물론 실제 알고리즘은 훨씬 복잡합니다만, 대체로 오른쪽에서 왼쪽으로 간다고 생각하면 됩니다)
따라서 a.php.rar 나 a.php.hwp 와 같이 Default로 Apache 설정 파일에 MIME type이나 Handler 설정이 없는 확장자에 대해선 가장 오른쪽의 rar, hwp 확장자를 무시하고, 다음의 php 확장자를 본 후, AddHandler (혹은 AddType)에 php 설정이 있기 때문에, PHP 처리기로 넘기는 것입니다. 물론 a.php.foo.bar.rar 같은 형태도 가능합니다.
다국어 지원이나 사용자의 Accept 헤더 MIME type 설정에 따른 지능적인 처리를 원하시면 Default 상태인 해당 상태로 두면되지만, 국내 사용자를 대상으로 일반적인 서비스를 할 때는 -MultiViews 를 명기하면 다중 확장자 업로드 문제로부터 안전합니다.
근데, 이 테크닉은 무척 오래된 것인데 왜 요새 주목받는지 이해가 잘...
참고: 제가 2004년에 발표했던 http://www.securityfocus.com/archive/1/384643 보안 권고문을 보셔도 심플하게 잘 설명되어 있습니다.
이글루스 가든 - professional secur...

덧글
xeraph 2009/04/14 10:27 # 답글
오.. 상세한 설명 감사합니다. ㅎㅎ
silverbug 2009/04/15 14:31 # 삭제 답글
오래된 취약점이죠..... 하지만 현재까지 문제가 많은듯 싶네요...저도 오래전에 발견해서.. 국정원과 아파치 재단에 문의를 했지만 그닥 별 성과가 없었네요...
sans에서 공개 했다길래 그냥 저도 전에 써놓은 문서 공개합니다.
http://hacker.or.kr/ 에 올려두었습니다.
헐랭이 2009/04/15 15:47 #
잘 정리를 하셨네요. 저도 해당 문제에 대해 Apache 개발자, PHP 개발자와 메일로 의견을 주고 받은 적이 있습니다. 상세한 내용은 기억이 안나는데, PHP 개발자인 Rasmus Lerdorf의 reply는 기억에 남는군요. 'MultiViews' 딱 한마디였습니다.결국, '나는 니같은 애들 얘기에 일일이 대응해주기엔 너무 바쁘다. 아파치 옵션에 대해서나 제대로 공부해라'라는 뜻이었겠죠.
Apache 개발자와 PHP 개발자가 모두 '이는 사양이지 버그가 아니다.'라고 생각하고 있으므로, 서버 관리자와 개발자가 해당 side effect에 대해 잘 인지하고 적절한 설정과 개발을 하는 것이 필요할 듯 합니다.
다라나 2009/04/15 16:42 # 답글
자세한 설명 감사드립니다. 그런데 초면에 이런 질문 드려 죄송합니다만, 실제로 적용해보니 -MultiViews 를 써봐도 변화가 없습니다. 여전히 a.php.1 파일이 php로 해석이 됩니다. 제 설정이 뭔가 문제가 있는 것 같은데요, 한번 봐주실 수 있나요?제 설정은 아파치 2.2.x 의 기본값에서 주석 부분만 바꿨습니다(Options 들어가는 부분을 찾아보니 저기 뿐이더군요).
<Directory /home/*/htdocs>
# AllowOverride FileInfo AuthConfig Limit Indexes
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
AllowOverride None
Options FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
저기서 Option FollowSymLinks -MultiViews 라고 써주고 아파치 재시작해도 안되네요. 모듈이 없어서 그런 것 같다는 생각도 드는데 제 경우는 mod_mime.so 만 활성화되어 있고, mod_mime_magic.so, mod_negotiation.so 는 주석처리 되어 있습니다.
헐랭이 2009/04/15 18:53 #
먼저 테스트는 해보지 않고 말씀드립니다.해당 문제에는 mod_negotiation 모듈과 mod_mime 모듈이 함께 관련되어 있던 것으로 기억납니다. (20 대 80 정도?)
MultiViews 옵션은 http://httpd.apache.org/docs/1.3/mod/mod_negotiation.html 의 MultiViews 항목에 설명되어 있습니다.
Apache 2.2 의 경우는 http://httpd.apache.org/docs/2.2/content-negotiation.html 에 설명되어 있죠.
즉, MultiViews 옵션을 사용하고자 할 경우 반드시 mod_negotiation을 사용하셔야 합니다.
다라나님과 같이 해당 모듈을 사용안하시는 경우 http://httpd.apache.org/docs/2.2/mod/mod_mime.html#multipleext 를 읽어보시면 도움이 되는데, "Configure handler based on final extension only"에 나온 예제와 같이 하시면 됩니다.
복잡한 게 싫으시면 위의 silverbug님의 코멘트에 나온 URL에 접속하셔서 예제 설정을 copy & paste 하시면 됩니다.
헐랭이 2009/04/16 06:38 # 답글
집에서 설치된 Windows 머신에서 Apache 2.2.11 + PHP 5.2.8 버전을 대상으로 테스트를 해보았습니다.MultiViews 옵션이 다중확장자 php 파일처리에 전혀 영향을 미치지 않더군요.
아마 제가 옛날에 소스 분석하고, 테스트했던 게 Apache 1.3.x 버전대이고, 그간 5년이란 시간이 흐르면서 MultiViews 옵션의 context에 약간의 변화가 있었던게 아닌가 싶습니다.
Apache 2.2.x 버전을 사용 중이시면, 바로 위의 코멘트대로 하시면 됩니다.
하긴, MultiViews 옵션이 해당 동작에 영향을 미치는 건 비직관적이죠. 저도 Rasmus Lerdorf 한테 MultiViews 라는 응답을 받았을 때는 무척 놀랐으니까요.
다라나 2009/04/16 15:16 #
감사합니다. 저도 테스트를 해봤는데 mod_negotiation을 켜봐도 안되서 이걸 어떻게 해석해야 하는지 한참 고민 중이었습니다. 저 같은 경우는 예전에 phpschool에서 본 팁대로 파일 업로드 되는 디렉토리를 php_admin_flag engine off 로 처리했기에 문제는 발생하지 않았습니다만, 말씀하신 문제는 처음 안 거라 간만에 이것저것 찾아보느라 즐거웠습니다. 다시 한번 감사 말씀 드립니다.