LinuxÄÚºËeBPF RINGBUFÔ½½ç·ÃÎÊ©¶´£¨CVE-2021-3489£©ÀûÓ÷ÖÎö

Ðû²¼Ê±¼ä 2022-03-01

½üÄêÀ´ £¬ÔÚPWN2OWN½ÇÖðUbuntu×ÀÃæϵͳÆƽâÏîÄ¿ÖÐ £¬LinuxÄÚºËeBPF»úÖÆÒ»Ö±ÊÇÈÈÃŵĹ¥»÷Ãæ¡£±¾ÎÄ·ÖÎöµÄCVE-2021-3489ÊÇÔÚPWN2OWN 2021½ÇÖðÖÐʹÓõÄ©¶´ £¬¸ÃeBPF©¶´ºÍÒÔÍùµÄÂß¼­Ñé֤©¶´²îÒì £¬Â©¶´·ºÆðÔÚÐÂÒýÈëµÄeBPF RINGBUF¹¦Ð§ÖÐ £¬µ¼ÖÂÄÚ´æ·ÃÎÊÔ½½ç £¬¿ÉʵÏÖÔ½½ç¶Áдµ½´ïȨÏÞÌáÉý¡£


BPF»·Ðλº³åÇø¼°Ó³Éä


eBPFÌṩ¶àÖÖÀàÐ͵ÄÓ³Éä £¬»·Ðλº³åÇøÓ³Éä¾ÍÊÇÆäÖÐÖ®Ò»¡£¸ÃʵÏֵĶ¯»úÖ®Ò»ÊÇͨ¹ýÔÚCPUÖ®¼ä¹²Ïí»·Ðλº³åÇøÀ´¸üÓÐЧµØÀûÓÃÄÚ´æ¡£µ¥¸öRINGBUF»·Ðλº³åÇø×÷Ϊ BPF_MAP_TYPE_RINGBUFÀàÐ͵ÄBPFÓ³ÉäʵÀý·ºÆð¸øBPF·¨Ê½¡£»¹Ìṩ¶à¸öBPF_CALL½Ó¿Úº¯Êý £¬ÆäÖÐbpf_ringbuf_output()¹¦Ð§ÎªÔÊÐí½«Êý¾Ý´ÓÒ»¸öµØ·½¸´ÖƵ½»·Ðλº³åÇø £¬bpf_ringbuf_reserve()/bpf_ringbuf_commit()/bpf_ringbuf_discard()Õâ×麯Êý½«Õû¸ö¹ý³Ì·ÖΪÁ½¸ö²½Öè¡£Ê×ÏÈ £¬Ô¤ÁôÀιÌÊýÁ¿µÄ¿Õ¼ä¡£Èç¹ûÀÖ³É £¬Ôò·µ»ØÖ¸Ïò»·Ðλº³åÇøÊý¾ÝÇøÓòÄÚÊý¾ÝµÄÖ¸Õë £¬BPF·¨Ê½¿ÉÒÔÏñʹÓÃÊý×é/¹þÏ£Ó³ÉäÄÚµÄÊý¾ÝÒ»ÑùʹÓøÃÖ¸Õë¡£Ò»µ©×¼±¸ºÃ £¬Õâ¿éÄÚ´æҪô±»Ìá½» £¬ÒªÃ´±»Å×Æú¡£discardÓëcommitÀàËÆ¡£


ÔÚ´´½¨BPF_MAP_TYPE_RINGBUFÓ³Éäʱ £¬Äں˽«·ÖÅäÁ½¸öÄÚ´æÇøÓò¡£Ò»¸öÊÇ bpf_ringbuf_map ½á¹¹ £¬ÀàËÆÓÚÆäËûµÄÓ³ÉäÀàÐÍ £¬ÁíÒ»¸öÊÇbpf_ringbuf½á¹¹¡£¸Ã½á¹¹½ç˵ÈçÏÂͼËùʾ£º


´úÂëÎļþ.png


ÆäÖÐ £¬pagesÊÇÄÚ´æ·ÖÅäµÄËùÓÐÒ³Ã漯ºÏ £¬consumer_posΪÏû·ÑÕß¼ÆÊýÆ÷ £¬producer_posΪÉú²úÕß¼ÆÊýÆ÷ £¬·Ö±ð·ÅÔÚÏàÁڵĵ¥¶ÀµÄÒ³ÃæÖÐ £¬Ôڸ鶴ÐÞ¸´Ç° £¬ÕâÁ½¸öÒ³Ãæ¾ù¿ÉÒÔͨ¹ýMMAPÓ³Éäµ½Óû§¿Õ¼ä½øÐжÁд²Ù×÷µÄ¡£bpf_ringbuf_alloc()º¯ÊýÊÇʵÏÖbpf_ringbuf²¢³õʼ»¯µÄ £¬ÊµÏÖ´úÂëÈçÏÂËùʾ£º


´úÂëÎļþ.png


µ÷ÓÃbpf_ringbuf_area_alloc()º¯Êý·ÖÅäbpf_ringbuf £¬È»ºó³õʼ»¯rb->spinlock £¬rb->waitqºÍrb->work £¬×îºóÉèÖÃrb->mask £¬rb->consumer_posºÍrb->producer_pos¡£bpf_ringbuf_area_alloc()º¯ÊýÊÇÓÃÀ´¾ßÌå·ÖÅäringbufÄÚ´æÇøÓòµÄ £¬¸ÃʵÏÖÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png


µÚÒ»¸ö²ÎÊýdata_szΪÉêÇë·ÖÅäÄÚ´æµÄ¾Þϸ £¬nr_meta_pagesΪԪÊý¾ÝÒ³ÃæÊý £¬°üÂÞÒ»¸ö²»ÐÐÓ³ÉäÒ³ÃæºÍÁ½¸ö¿ÉÓ³ÉäÒ³Ãæ £¬·Ö±ðΪconsumer_posºÍproducer_pos £¬nr_data_pagesΪʵ¼ÊÉêÇë·ÖÅäÄÚ´æËùÐèµÄÄÚ´æÒ³ÃæÊý £¬nr_pagesΪnr_meta_pagesºÍnr_data_pagesÖ®ºÍ £¬pagesÓÃÓÚ´æ·ÅËùÓÐÒ³Ã漯ºÏ £¬ÄÚ´æ·ÖÅäÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png

µ÷ÓÃbpf_map_area_alloc()º¯Êý·ÖÅäpagesÖ¸ÕëÊý×é £¬ÓÃÓÚ´æ·Å¼´½«·ÖÅäµÄÄÚ´æÒ³Ã档ȻºóÑ­»·µ÷ÓÃalloc_pages_node()º¯Êý·ÖÅäÒ³Ãæ²¢´æ·ÅÔÚpagesÖÐ £¬×¢Òâµ½nr_data_pagesÊÇË«·ÝµÄ¡£Êµ¼ÊÄÚ´æ½á¹¹ÈçÏÂËùʾ£º


ʾÀýͼ.png

×îºó £¬µ÷ÓÃvmmap()º¯Êý½«pagesÖеÄÒ³ÃæÓ³Éäµ½Á¬ÐøÐéÄâÄÚ´æ¿Õ¼äÖÐ £¬ÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png

©¶´Ô­ÀíÓëÐÞ¸´²¹¶¡


¸Ã©¶´·¢ÉúÔÚ__bpf_ringbuf_reserve()º¯ÊýÖÐ £¬¸Ãº¯Êý¿ÉÒÔ·µ»ØÖ¸Ïò»·Ðλº³åÇøÊý¾ÝÇøÓòÄÚÊý¾ÝµÄÖ¸Õë £¬µ«ÊDz¢Ã»ÓÐÅжϷÃÎʳ¤¶È¾Þϸ £¬µ¼Ö¿ÉÒÔÔ½½ç·ÃÎÊÊý¾Ý¡£¸Ãº¯ÊýÒªº¦ÊµÏÖÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png


²ÎÊýsizeΪ·ÃÎʳ¤¶È £¬Ê×ÏÈÅжÏsizeÊÇ·ñ´óÓÚ0x3fffffff £¬µ«ÊDz¢Ã»ÓÐÅжÏlenÊÇ·ñ´óÓÚringbufµÄdata_sz £¬¼´·ÃÎʵķ¶Î§ÊÇ·ñ´óÓÚʵ¼Ê·ÖÅäµÄringbufÄڴ淶Χ¡£È»ºó¶Ôsize+8ÉÏÏÞÈ¡ÕûΪlen £¬½ÓÏÂÀ´È¡³örb->producer_pos £¬Í¨¹ýprod_pos+len¼ÆËã³önew_prod_pos¡£


´úÂëÎļþ.png


ÐÐ333 £¬Ê×ÏÈÅжÏеÄÉú²úÕßλÖò»Áè¼ÝringbufµÄdata_sz-1 £¬È·±£ringbufÄÚ´æ¿Õ¼äÊǸ»×ãµÄ¡£È»ºóͨ¹ýrb->data+prod_pos¼ÆËã³öhdrµÄλÖà £¬×îºó½«rb->producer_pos¸üÐÂΪnew_prod_pos £¬·µ»Øhdr+8λÖõÄÖ¸Õë £¬ÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png


ƾ¾ÝÇ°ÎÄ·ÖÎö £¬rb->consumer_posºÍrb->producer_posËùÔÚÒ³ÃæÊÇ¿ÉÓ³ÉäµÄ £¬ÊǿɿصÄÇÒûÓмì²é £¬size·ÃÎʳ¤¶ÈÒ²ÊǿɿصÄ £¬Òò´Ë¿ÉÒԽṹÈçÏÂÌõ¼þµ½´ï´ó·¶Î§Ô½½ç·ÃÎÊ £¬Áîproducer_pos = 0 £¬consumer_pos= 0x3fffffffºÍsize=0x3fffffff¡£ÕâÈý¸ö±äÁ¿¿ÉÒÔÈƹýËùÓмì²é £¬×îºó¼ÆËã³öµÄnew_prod_posΪ0x3fffffff+8 £¬ÕâÊǸöºÜ´óµÄ·¶Î§¡£


¸Ã©¶´ÐÞ¸´²¹¶¡ÓÐÁ½²¿ÃÅ £¬µÚÒ»²¿ÃÅÊǼÓÉÏÁ˺Ídata_sz¾ÞϸµÄÅжÏ £¬·ÀÖ¹·ÃÎʳ¤¶È³¬³öʵ¼Ê·ÖÅäµÄ¿Õ¼ä·¶Î§ £¬ÈçÏ´úÂëËùʾ£º


´úÂëÎļþ.png


²»ÔÊÐí¶Ôrb->producer_posËùÔÚÄÚ´æÒ³Ãæ½øÐÐдӳÉä¡£


©¶´ÀûÓùý³Ì


£¨1£©Í¨¹ý¶ÑÅç½á¹¹Á¬ÐøÄÚ´æ½á¹¹ £¬¸øÔ½½ç¶ÁдÌṩ³¡¾°

Á¬Ðø´´½¨¶à¸ösize=0x1000000µÄringbuf £¬ÕâÀïmapfdµÄringbufºÍvictimfdµÄringbufÊÇÁ¬ÐøµÄ £¬Öмä¼ä¸ôÒ»¸öÒ³ÃæµÄguard page


´úÂëÎļþ.png

£¨2£©Í¨¹ýeBPFÖ¸Áî½á¹¹³öÔ½½ç¶ÁдԭÓï

ͨ¹ýeBPFÖ¸Áî·ÃÎÊmapfdµÄringbuf £¬²¢µ÷ÓÃbpf_ringbuf_reserve()º¯Êý»ñÈ¡mapfdµÄringbuf->dataÖ¸Õë¡£ÕâÀïSIZEΪ0x30000000´óÓÚʵ¼Ê·ÖÅäµÄÄÚ´æ¿Õ¼ä¡£


´úÂëÎļþ.png


Æ«ÒÆsize*2+0x1000Ìø¹ýmapfdµÄringbuf £¬ÔÙÆ«ÒÆ8´¦ÊÇvictimfdµÄringbuf->wait_queue_head->list_head £¬Æ«ÒÆ40´¦ÊÇringbuf-> irq_work->func £¬³õʼ»¯bpf_ringbufʱ £¬funcΪbpf_ringbuf_notify £¬Òò´Ë¿ÉÒÔ¼ÆËã³öÄں˻ùµØÖ·¡£


£¨4£©½Ù³Ö·µ»ØµØÖ·Ö´ÐдúÂë

ͨ¹ý´óÁ¿fork×Ó½ø³Ì £¬ÔÚvictimfdÄÚ´æºóÃæµÃµ½Á¬ÐøµÄtask_structÄÚ´æ½á¹¹¡£


´úÂëÎļþ.png


ͬʱ £¬×Ó½ø³ÌºÍ¸¸½ø³Ìͨ¹ýpipe½øÐÐͨÐÅ £¬Õâ¸ö¹ý³ÌÖлáµ÷ÓÃ__x64_sys_readºÍksys_readº¯Êý²¢´¦ÓÚ×èÈû״̬ £¬È»ºó²»Í£ËÑË÷threadÄÚºËÕ» £¬ËÑË÷µ½ÕâÁ½¸öº¯Êý·µ»ØµØÖ·½«ÆäÐ޸ijÉcommit_credsºÍprepare_kernel_cred £¬ÔÚ¸¸½ø³ÌÖнâ³ý×èÈû״̬±ã¿É½Ù³ÖÁ÷³Ì½øÐÐÖ´ÐÐÈÎÒâ´úÂë¡£      


×ÛÉÏÀûÓùý³Ì £¬Í¨¹ý¾«ÐĽṹ¿ÉʵÏֶԸ鶴µÄÌáȨЧ¹û¡£


        

²Î¿¼Á´½Ó£º 

https://flatt.tech/reports/210401_pwn2own/