우와, 최근에 CloudFlare 에서 아주 재미있는 제목으로 글을 냈습니다. 제목은 Memcrashed – Major amplification attacks from UDP port 11211 로, UDP 11211 포트를 이용한 대규모 DDOS 어택 정도로 생각하시면 될듯합니다.(영어를 못해서 의역으로…)
사실 원문을 보시는게 더 쉽게 이해하실 듯 하지만(당연히 원문 처럼 설명한 능력도 없지만…) public 에 포트가 열려있는 memcached 를 이용한 DDOS 방법입니다. 그래서 제목이 memcrashed 가 된거죠. memcached는 웹서비스 쪽에서는 누구나 알고 있는 유명한 In-Memory caching 솔루션입니다.(http://memcached.org/) 성능도 아주 끝내주죠. 간단한 연산은 초당 10~20만 까지도 가능합니다.
먼저 해당 이슈는 일단 다음과 같은 전제조건이 모두 만족해야 DDOS 공격이 가능합니다..
그리고 memcached 자체가 DDOS 공격의 대상이 아니라, 공격을 할 수 있는 수단으로 사용됩니다.
저도 몰랐던 사실인데(나름 memcached는 그래도 아는편이라고 생각했는데…) memcached는 UDP도 지원합니다.(당연히 UDP다 보니, 명령이나 응답이 유실될 수 도 있습니다.) 원래는 명시적으로 -U 0 을 주지 않는 이상은 UDP 11211 포트로 생성됩니다. memcached 1.5.5 버전을 받아서 설치하고 실행해보면 자동으로 IPv4(TCP, UDP), IPv6(TCP, UDP) 11211 포트가 열리는 것을 볼 수 있습니다.
즉 udp로 명령을 보내고 사용할 수 있다는 거죠. UDP 프로토콜은, 기존 TCP 프로토콜과 거의동일하지만 아주 미세한 차이가 있습니다.
그런데 UDP의 경우에는 source ip를 위조하는 것에 굉장히 취약합니다.(IP Spoofing), TCP도 불가능한건 아니지만 훨씬 더 어렵습니다. 여기서 자세한 설명 없이 ip header 와 udp header를 첨부합니다.
IP Spoofing 을 통해서 데이터를 보내게 되면 memcached 입장에서는 송신자를 체크할 방법이 없습니다. 그래서 그 응답결과를 송신자(로 속여진 victim) 에게 보내게 되는겁니다. 엄청나게 UDP 패킷이 전송될 수 있겠죠. 실제로 memcached는 디폴트로 1MB chunk를 사용하므로 데이터는 한번에 1MB 까지 가능합니다. 이렇게 열려있다는 것은 거기에 자신이 원하는 데이터도 심을 수 있으니…(다만 UDP로 1MB 데이터를 넣기는 힘들겠지만… 이 얘기는 TCP 도 열려있고 방화벽이 없을 가능성이 높으니… 원하는 데이터를 쉽게 넣을 수 있을듯 합니다.) 초당 엄청난 트래픽을 보낼 수 있게 됩니다.
실제로 간단하게 셋팅을 해보았습니다. 간단하게 외부의 victim 에서 응답이 수신되는 걸 확인 할 수 있었습니다.
원문을 보면 nmap등을 이용해 간단하게 public 에 열려있는 memcached 서버들을 찾을 수 있습니다. 무시무시하지요.
그럼 결론, 우리는 어떻게 대비해야 하는가?
1] memcached를 public 에 공개하지 않는다. 이미 열려있는 곳이라면 iptable 등으로 방화벽을 따로 설정해서 UDP및 TCP 자체를 막으셔야 합니다. 이런 캐시서버는 public에 열리면 그냥 지옥입니다. redis의 경우도 바로 해당 계정이 탈취 당할 수 있습니다.(udp는 지원안합니다만…)
2] UDP를 안 쓰면 사용하지 않는다.
memcached 1.5.5 까지는 -U 0 라는 옵션을 주지 않으면 자동으로 UDP 11211 포트를 사용하였지만… 해당 이슈 이후에 긴급하게 나온 memcached 1.5.6은 UDP가 디폴트로 꺼져있습니다. 그러나 아마 대부분은 이전 버전을 쓰실거니… 시작 옵션도 미리 바꿔두시는게 좋습니다. 다음 memcached patch 를 보시면 UDP가 이제 디폴트로 disable 된걸 볼 수 있습니다.
보안 관련 내용이라, 사용된 소스나 자세한 정보는 적지 않습니다.(다만 엄청 쉬워요 T.T)
ps. 보안 이슈라는 것이, 방비를 잘 하더라도 안당한다고 말할 수 없지만, 대부분의 보안 이슈는, 사용하지 않는 서비스를 public 에 노출한다거나, 잘못된 설정으로 인해서 발생하는 경우가 많습니다. memcached 이슈도 마찬가지이고, S3에 대한 리포트 를 보셔도 실제로 전체 s3 버킷의 20%가 쓰기도 열려있다라는 충격적인 사실을 아실 수 있습니다. 큰 조직에서는 이런 문제를 전담해줄 만한 인력이 있지만, 중소 규모 사이즈에서는 더 신경을 많이 쓰셔야 합니다.