Apache HTTP Server mod_luaÄ£¿é»º³åÇøÒç³ö©¶´·ÖÎö£¨CVE-2021-44790£©
Ðû²¼Ê±¼ä 2022-01-20©¶´¸ÅÊö
2021Äê12ÔÂ20ÈÕ£¬Apache ÍŶÓÐû²¼ÁËApache HTTP Server 2.4.52°æ±¾£¬ÐÞ¸´ÁËApache HTTP ServerÖеÄÒ»¸ö»º³åÇøÒç³ö©¶´£¨CVE-2021-44790£©£¬¸Ã©¶´´æÔÚÓÚmod_lua½âÎöÆ÷ÖУ¬µ±·þÎñÆ÷½âÎö¶ñÒâÇëÇóʱ´¥·¢»º³åÇøÒç³ö£¬¿Éµ¼Ö¾ܾø·þÎñ»òÖ´ÐÐÈÎÒâ´úÂë¡£
Ó°Ï췶Χ
Ó°Ïì°æ±¾£ºApache HTTP Server <= 2.4.51
Ïà¹Ø½éÉÜ
Mod_luaÄ£¿é
Mod_luaÄ£¿éÊÇApacheÉϵÄÒ»¸öÀ©Õ¹Ä£¿é£¬ÊÊÓÃÓÚ2.3ÒÔÉÏ°æ±¾¡£¸ÃÄ£¿éÔÊÐíʹÓÃlua½Å±¾À©Õ¹·þÎñÆ÷£¬»¹°üÂÞÐí¶àÆäËûÄ£¿é¿ÉÓõĹ³×Óº¯Êý¡£ÀýÈ罫ÇëÇó Map µ½Îļþ£¬Éú³É¶¯Ì¬ÏìÓ¦£¬·ÃÎÊ¿ØÖÆ£¬Éí·ÝÑéÖ¤ºÍÊÚȨµÈ¡£Èç¹û¿ªÆô¸ÃÄ£¿é£¬¿ÉÄÜ»áÔì³ÉһЩÄþ¾²Òþ»¼¡£
ÔÚ/etc/httpd/httpd.cnfÅäÖÃÎļþÖÐÈ¡ÏûÏÂÃæÕâÐÐ×¢ÊÍ£¬¼´¿É¿ªÆô¸ÃÄ£¿éµÄ¹¦Ð§¡£
µ±ÊÕµ½.luaÎļþÇëÇóʱ£¬mod_luaÄ£¿éµ÷ÓÃlua-scriptµÄhandleº¯Êý½øÐд¦Öá£ÏÂͼΪhandleº¯ÊýʵÀý¡£
aprÄÚ´æ³Ø
ΪÁ˼õÉÙϵͳÄÚ´æ·ÖÅäµÄʱ¼ä£¬Ìá¸ß·¨Ê½ÔËÐÐЧÂÊ£¬ApacheµÄ¿ª·¢Õß´´½¨ÁËÒ»Ì×»ùÓڳؿ´·¨µÄÄÚ´æ¹ÜÀí·½°¸¡£ÕâÌ×ÒªÁìÒƵ½aprÖгÉΪͨÓõÄÄÚ´æ¹ÜÀí·½°¸£¬Ò²¾ÍÊÇaprÄÚ´æ³Ø¡£
aprµÄÄÚ´æ³Ø½á¹¹ÆäʵÊÇÒ»ÖÖÊ÷×´µÄÌõÀí½á¹¹£¬parentÖ¸Ïòµ±Ç°ÄÚ´æ³ØµÄ¸¸ÄÚ´æ³Ø£¬childÖ¸Ïòµ±Ç°ÄÚ´æ³ØµÄ×ÓÄÚ´æ³Ø£¬siblingÔòÖ¸Ïòµ±Ç°ÄÚ´æ³ØµÄÐÖµÜÄÚ´æ³Ø¡£Óû§Ê¹ÓõÄÄÚ´æ¿Õ¼ä£¬ÔòÊÇactive¹ÜÀíµÄÒ»¸ö½ÚµãÁ´±í¡£Óû§ÒªÉêÇëÄÚ´æ¿Õ¼äµÄʱºò¾Í»áÔÚactive¹ÜÀíµÄÄÚ´æ½ÚµãÖÐÑ°ÕÒ¡£
½á¹¹ÌåÈçÏÂËùʾ£º
Óû§ÉêÇëÄÚ´æ¹ý³Ì£º
£¨1£©Ê×ÏÈÈ¡×î½Ó½ü²»Ð¡ÓÚ8×Ö½Ú±¶Êý¾ÞϸµÄ¿Õ¼ä£¨8×Ö½Ú¶ÔÆ룩£¬È»ºóƾ¾ÝÉêÇë¾ÞϸÅжÏactive½Úµã¿ÉÓÿռäÊÇ·ñ×ã¹»¡£ÈôÄÚ´æ×ã¹»£¬Òƶ¯first_availÖ¸Õ룬·µ»ØÆäµØÖ·£»Èô¿Õ¼ä²»×㣬Ôò¼ÌÐø½øÐÐ2Ö®ºóµÄ²½Öè¡£
£¨2£©ÅжÏÏÂÒ»¸öÄÚ´æ½ÚµãµÄÊ£Óà¿Õ¼äÊÇ·ñ×ã¹»£¬Èô×ã¹»ÔòʹÓÃÖ®£¬²¢½«Ö®ÍÑÀ뵱ǰÁ´±í£»Èô²»×㣬Ôòͨ¹ý·ÖÅä×Ó·ÖÅäеÄÄÚ´æ½Úµã¡£
£¨3£©½«µÚ2²½Öеõ½µÄ½Úµã²åÈëactive½Úµã֮ǰ£¬²¢³ÉΪеÄactive½Úµã¡£
£¨4£©¼ÆËã¾ÉµÄactive½ÚµãµÄÊ£Óà¿Õ¼ä¾Þϸ£¬¶øÇÒÓëÆäÁ´±íºóµÄËùÓнڵãµÄÊ£Óà¿Õ¼ä¾Þϸ±ÈÁ¦£¬²¢²åÈëÁ´±íÖÐÕýÈ·µÄλÖá£
²¹¶¡·ÖÎö
¸Ã©¶´ÔÚApache HTTP Server 2.4.52ÖнøÐÐÁËÐÞ¸´£¬ÔÚÄÚ´æÉêÇë֮ǰ£¬Ôö¼ÓÁ˶Գ¤¶ÈµÄºÏ·¨ÐÔУÑé¡£µ±end-crlfСÓÚ¼´ÊÇ8£¬·¨Ê½»áÖ±½ÓÍ˳ö£¬ÖÆÖ¹ÕûÊýÒç³ö¡£
©¶´·ÖÎö
ƾ¾Ý©¶´Í¨¸æ£¬¿É֪©¶´´æÔÚÓÚmod_luaÄ£¿éÖУ¬lua½Å±¾µ÷ÓÃÁËr:parsebody()º¯Êý·¢ÉúÁË»º³åÇøÒç³ö¡£½áºÏpatchÐÅÏ¢£¬Ö±½Ó¶¨Î»µ½req_parsebodyº¯Êý¡£
±¾ÎÄʹÓÃApache HTTP Server 2.4.49°æ±¾½øÐзÖÎö£¬´úÂëÖкìÉ«·½¿ò±êʶ³öÀ´µÄ²¿Ãż´Â©¶´´úÂëλÖã¬Í¼Æ¬ÖжÔÒªº¦²¿ÃŽøÐÐÁËÏàÓ¦µÄ×¢ÊÍ¡£
ÏÂÃæ½áºÏpostÊý¾Ý°üÀ´·ÖÎö·¨Ê½´¦ÖÃÂß¼¡£½á¹¹ÈçÏÂpostÊý¾Ý°ü£º
Ê×ÏÈ£¬start±äÁ¿Ö¸ÏòpostÊý¾Ý°ü¿ªÊ¼µÄλÖã¬Ò²¾ÍÊǶÔÓ¦ÉÏÃæµÚÒ»¸ö±êʶ·û--VILC2R2IHFHLZZµÄλÖã¬crlfÖ¸ÏòÁ½¸ö¿ÕÐУ¨\r\n\r\n£©¿ªÊ¼µÄλÖã¬endÖ¸ÏòÏÂÒ»¸ö±êʶ·ûVILC2R2IHFHLZZ¿ªÊ¼µÄλÖã¬ÄÇôÔÚcrlfºÍendÖ®¼äµÄÊý¾Ý¾ÍÓÐÏÂÃæÕâЩÄÚÈÝ£¬×ܳ¤¶ÈΪ8£¨ÌØÊâ×Ö·û³¤¶È£©+len£¨Êý¾Ý²ÎÊý³¤¶È£©¸ö×Ö½Ú¡£
¡®\r\n\r\ntest\r\n--¡¯
ƾ¾ÝÉÏÃæ²ÎÊýÄÚÈÝ£¬ÎÒÃǾͿÉÒÔÀí½âÏÂÃæÕâÐдúÂëµÄÒâÒåÁË¡£vlen¼´ÊÇ×ܳ¤¶È¼õÈ¥¶àÓàµÄ8¸öÌØÊâ×Ö·û£¬¾Í¿ÉÒÔ¼ÆËã³ö²ÎÊýµÄ³¤¶È¡£
vlen=end-crlf-8;
È»ºó£¬·¨Ê½µ÷ÓÃapr_pcalloc·ÖÅäÄÚ´æ¡£
·¨Ê½Ã»ÓжÔvlenÖµµÄºÏ·¨ÐÔ½øÐмì²é£¬Èç¹ûÉÏÃæ²ÎÊýÖеÄÌØÊâ×Ö·ûȱʧ£¬¼ÆËãµÄvlenÖµ¾Í¿ÉÄܱäΪ¸ºÊý£¬Ôì³ÉÕûÊýÒç³ö¡£µ±ÉêÇë¿Õ¼äµÄʱºò£¬»á·ºÆðÄþ¾²ÎÊÌâ¡£
¶¯Ì¬µ÷ÊÔ
ƾ¾Ý²îÒì»ûÐΰüµÄ½á¹¹£¬¿¼ÂÇÒÔÏÂÁ½ÖÖÇé¿ö£¬½áºÏ¶¯Ì¬µ÷ÊÔ½øÐзÖÎö¡£
ÉêÇ볬´óµÄ¿Õ¼ä
¼ÙÉèȱʧ'/r/n--'Õâ4¸öÌØÊâ×Ö·û£¬ÇÒÊý¾Ý²¿ÃÅΪ2×Ö½Ú£¬vlen=(2+4-8)=-2¡£µ÷ÓÃapr_pcalloc(r->pool, vlen+1)ÉêÇëÄÚ´æʱ£¬vlen+1=0xffffffffffffffff¡£
ʹÓÃgdb¸½¼Ó½ø³Ì£¬½øÐж¯Ì¬µ÷ÊÔ¡£ÔÚ©¶´º¯Êý´¦ÉèÖöϵ㣬Ȼºó·¢ËÍÌØÊâµÄpostÇëÇó¡£
aprÄÚ´æ³ØÎÞ·¨ÌṩÕâô´óµÄÄڴ棬ÕâʱaprµÄ·ÖÅä×ӾͻáÏòϵͳÉêÇëÄÚ´æ¿Õ¼ä£¬µ«ÊÇÉêÇëµÄ¾Þ´óÄÚ´æ¿Õ¼äÊÇϵͳÎÞ·¨ÌṩµÄ£¬ËùÒÔϵͳ»áÖ±½Ó½«½ø³Ìkillµô£¨0x75Êǽø³ÌºÅ£©£¬Ôì³É¾Ü¾ø·þÎñ¡£
Òç³ö³¬³¤µÄ×Ö½Ú
¼ÙÉèȱʧ'/r/n--'Õâ4¸öÌØÊâ×Ö·û£¬ÇÒÊý¾Ý²¿ÃÅΪ3×Ö½Ú£¬vlen=(3+4-8)=-1£¬µ÷ÓÃapr_pcalloc(r->pool, vlen+1)ÉêÇëÄÚ´æʱ£¬³¤¶Èvlen+1=0£¬Æ¾¾ÝaprÄÚ´æ³ØÄÚ´æ·ÖÅä»úÖÆ£¬aprÄÚ´æ³Ø»á·ÖÅä×îСµÄÄÚ´æ¿é8×Ö½Ú£¬×îºóʹÓú¯ÊýmemcpyµÄʱºò£º
memcpy(buffer, crlf + 4, vlen)
vlenÓÖΪFFFFFFFF.......(-1)£¬¾Í»á·¢Éú»º³åÇøÒç³ö¡£
¶¯Ì¬µ÷ÊÔʱ¿ÉÒÔ¿´µ½µ÷ÓÃapr_pallocʱ£¬³¤¶È²ÎÊýÊÇ0£¬Êµ¼ÊÉÏ»á·ÖÅä8×ֽڵĿռ䡣
²Î¿¼Á´½Ó£º
[1]https://mp.weixin.qq.com/s/XLzXHZYvpPIqNrDz3OHaMA
[2]https://nakedsecurity.sophos.com/2021/12/21/apaches-other-product-critical-bugs-in-httpd-web-server-patch-now/
[3]https://httpd.apache.org/security/vulnerabilities_24.html
[4]https://ubuntu.com/security/CVE-2021-44790
[5]https://github.com/apache/httpd/commit/07b9768cef6a224d256358c404c6ed5622d8acce