Hash Table DoS (HashDoS) Attack
( Denial of Service using Hash tables collisions )
1. 개요
지난 2011년 12월 28일 Chaos Communication Congress 에서, 해시테이블의 취약점을 이용한 DoS 공격이 공개되었다.
해시 테이블이란 해싱 함수의 연산에 의해 구해진 위치에 각 레코드를 한 개 이상 보관할 수 있는 버킷(bucket)들로 구성된 기억 공간을 말한다.
웹서버에서는 Request POST, GET으로 전송되는 변수를 값 접근을 쉽고 빠르게 하기 위해 Hash 구조로 관리한다. 매개 변수를 GET으로 전달 할 경우 길이 제한이 있어 별다른 문제가 되지 않지만, POST로 전달할 수 있는 매개변수의 수에 제한이 없어, 수백 ~ 수천 개의 매개변수를 전달할 수 있다. 이렇게 제한 없이 많은 수의 매개변수를 전달하게 되면, 매개변수를 저장하는 해시테이블에서 해시 충돌이 일어나게 되고 이로 인해 해시테이블에 접근하는 시간이 급속도로 늘어나게 된다.
이렇게 POST로 제한 없이 많은 수의 매개변수를 전달하게 되면 속도가 저하되고 CPU 부하가 급속히 높아지는 취약점이 있어, 이를 악용한DoS 공격을 할 수 있게 된다.
.NET Framework, PHP, Apache Tomcat 등 웹 서비스 플랫폼에 해당 취약점이 존재 하며, 이중 PHP가 가장 취약한 것으로 알려 졌다.
2. 취약점이 존재하는 웹 서비스 플랫폼
① Java : All Version
② JRuby : 1.6.5 및 이하 버전
③ PHP : 5.3.8 / 5.4.0 RC3 및 이하 버전
④ Rython : All version
⑤ Rubinius : All version
⑥ Ruby : 1.8.7-p356 및 이하 버전
⑦ Apache Geronimo : All version
⑧ Apache Tomcat : 5.5.34 / 6.0.34 / 7.0.22 및 이하 버전
⑨ Oracle Glassfish : 3.1.1 및 이하 버전
⑩ Jetty : All version
⑪ Plone : All version
⑫ Rack : 1.1.2 / 1.2.4 / 1.3.5 및 이하 버전
⑬ V8 JavaScript Engine : All version
3. 세부 분석
Hash Table Collision 버그를 이용하여, DoS 공격한 패킷을 캡처하여, Follow TCP Stream 해본 결과 다음과 같다.
위에서 보듯이 무수히 많은 문자들이 전송되는 것을 볼 수 있으며, 패킷 내용을 보면 다음과 같이 무수히 많은 변수 (파라미터)들이 존재 하고 있는 것을 볼 수 있다.
이로 인해 어플리케이션은 DoS 상태가 되고, 웹 서비스가 정상적으로 이루어 지지 않게 된다.
4. 대응 방안
① PHP 경우
* 취약점 해결 방법 *
- PHP 5.4.0 RC 버전 및 취약점 패치 후 나올 PHP 5.3.9
Max_input_vars 설정으로 파라미터의 수를 제한
- PHP 보안 모듈(suhosin) 사용
PHP 보안 모듈(suhosin)사용하여, 다음과 같은 설정만으로도 문제가 해결된다.
suhosin.post.max_value_length = 1000000
suhosin.post.max_vars = 500
suhosin.request.max_vars = 500
위 설정을 다시 살펴 보면, 최대 파라미터 개수를 500개로 제한한 예이다.
참고로 default는 1000이다. 최대 파라미터 개수를 제한하면, 그 이상의 파라 미
터 개수가 들어 올 시 PHP 보안 모듈(suhosin)에서 차단을 시킨다.
* 완화 방법 *
- 패치 버전이 아닌 기존 PHP 버전을 사용할 경우
php.ini 설정 값 max_input_time 와 post_max_size를 변경하여, 공격을 완화 시킬 수
있다.
max_input_time은 요청 데이터를 파싱하는데 걸리는 최대 시간을 나타내며,
post_max_size는 POST의 크기를 나타낸다.
max_input_time으로 파싱 시간 제한, post_max_size으로 POST 사이즈를 제한 함으
로써 파라미터수를 어느 정도 제한하는 효과를 가질 수 있다.
다음은 php.ini default값이다.
max_input_time = 60
post_max_size = 8M
max_input_time 와 post_max_size를 변경하기 위해서는, 기존에 쌓여 있는 웹 로그
를 분석하여, 스크립트의 실행 시간이 얼마나 걸리는지 POST 요청의 사이즈가 얼마나
되는지 분석해야 한다. 무턱대고 변경하였다가는, 공격이 아닌 정상적인 서비스인데도
제한이 걸려 서비스가 이루어 지지 않을 수 있기 때문이다.
단, 파일이 업로드 되는 서비스는 POST사이즈가 크므로 post_max_size는 적용하기 어
렵기 때문에, max_input_time만 설정하는 것이 좋다.
② IIS for ASP.NET 경우
- shutdown time limit for processes 값을 줄인다.
③ Apache와 Nginx 경우
- POST사이즈 제한을 php설정 외에 웹 서버 자체 설정도 적용하고 싶다면 다음과 같이 설정 값을 변경 해 준다. 주의 할 점은 기존 웹 로그를 분석해서 적절 POST
사이즈를 파악해서 적용해야 한다.
l apache
LimitRequestBody 값 변경
l nginx (default : 1MB)
client_max_body_size 값 변경
④ Tomcat 경우
- maxParametercont 값을 넣어 주면 된다. (6.0.35 이상 / 7.0.23 이상부터 지원)
위와 같은 방법을 적용하여, 대응할 수 있지만 가장 좋은 방법은 취약점이 패치가 된 버전으로 업데이트 하는 방법이 가장 좋은 방법이라고 생각 된다.
이하 다른 웹 서비스 플랫폼의 경우 해당 웹 사이트를 방문하여 정보를 획득 바란다.
참고
[wireless] MAC Filtering 우회 (0) | 2013.07.11 |
---|---|
[wireless] 숨긴 SSID 확인 (0) | 2013.07.11 |
[DDoS] Slow HTTP POST Attack (0) | 2013.07.11 |
2011년 3.4 DDoS Attack 내용 (0) | 2013.07.11 |
[Web] 웹쉘 (web shell) (0) | 2013.07.11 |