아래 글은 apache(rev.proxy+modsecurity) 환경하에서 test 및 참조문서 1번 글을 이해한
부분을 정리하였습니다.
1. 소개
실제 연결을 지속적으로 맺고 유지하여, 서비스 가능 리소스를 고갈시키는 공격입니다.
크게 header방식과 body방식으로 구분되어집니다.
HTTP RFC를 보면 아래와 같은 구조를 확인하실 수 있습니다.
Request = Request-Line ; Section 5.1
*(( general-header ; Section 4.5
| request-header ; Section 5.3
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 4.3
예를 들면,
대표적인 header방식의 공격 tool로 sloworis라는 tool이 있습니다. (
http://ha.ckers.org/slowloris/)
아래와 같은 방식으로 요청을 하며, 마지막에 CRLF를 한번 보내지 않습니다.
GET / HTTP/1.1 CRLF
Host: www.example.com CRLF
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3. 0.4506.2152; .NET CLR 3.5.30729; MSOffice 12) CRLF
Content-Length: 42 CRLF
이를 통해 연결을 맺은 상태에서 Timeout 까지 서비스 데몬이 기다리며 연결이 유지되게 합니다.
해당 tool에서 Timeout 설정이 가능하므로 해당 서버의 Timeout보다 작게 잡으면 계속 연결을
유지하실 수 있게되며, MaxClient까지 차게 되면 DoS 상태가 되게 됩니다.
위의 방식이 header방식이며, body방식의 경우 위 방식과 개념은 유사하나 ,
다만 POST field부분을 이용하여 작은양의 값으로 조금씩 보내 연결이 유지되게 하는 방식입니다.
두가지 공격 모두 실제 연결을 맺는 부분으로 금새 표시가 날 수 있으나, 대규모의 사이트에
다량의 위치에서 공격하게 되면 실제트래픽과 구분하기가 쉽지 않습니다.
2. 방어방법
- test시 Timeout이 될 시 아래와 같이 각각 응답하게 됩니다.
header 방식의 경우 400(Bad Request)을 반환하며,
body 방식의 경우 408(Request Timeout)을 반환하게 됩니다.
- Apache의 경우 mod_reqtimeout을 이용해 시간(header,body)별, 양(MinRate)로 제한을 둘 수가 있습니다.
(
http://httpd.apache.org/docs/2.2/mod/mod_reqtimeout.html#requestreadtimeout)
- modsecurity를 이용하는 경우 SecReadStateLimit를 이용하여 제한을 둘 수가 있습니다.
(다만, SERVER_BUSY_READ 상태에서 IP주소별 접속수를 제한할 수 있는 방식으로, body방식의 공격의 경우 한번이라도 request headers가 읽혀진 경우 SERVER_BUSY_WRITE로 상태가 바뀌므로 적용이 곤란합니다.)
[ 참조문서 ]
1.
http://blog.spiderlabs.com/2010/11/advanced-topic-of-the-week-mitigating-slow-http-dos-attacks.html
2.
http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual
[ 공격 Test Tool ]
1.
http://ha.ckers.org/slowloris/ // header방식 (Perl script파일)
2.
http://code.google.com/p/owasp-dos-http-post/downloads/list
// header + body (Win용)