LinuxÄÚºËeBPF verifier½çÏÞ¼ÆËã´íÎ󩶴·ÖÎöÓëÀûÓã¨CVE-2021-31440£©

Ðû²¼Ê±¼ä 2021-05-31

©¶´Åä¾°


½üÈÕ £¬ZDI¹ÙÍøÅû¶һ¸öLinuxÄÚºËeBPF verifier½çÏÞ¼ÆËã´íÎ󩶴 £¬¸Ã©¶´Ô´ÓÚeBPFÑéÖ¤Æ÷ÔÚLinuxÄÚºËÖÐûÓÐÕýÈ·¼ÆËã64λת32λ²Ù×÷µÄ¼Ä´æÆ÷½çÏÞ £¬µ¼Öµ±µØ¹¥»÷Õß¿ÉÒÔÀûÓôËȱÏݽøÐÐÄÚºËÐÅϢ鶻òÌØȨÌáÉý £¬¸Ã©¶´±àºÅΪCVE-2021-31440 ¡£


Ó°Ï췶ΧÓë·À»¤´ëÊ©


£¨1£©Ó°Ï췶ΧLinux-5.7 ~ Linux- 5.11.15Ubuntu 20.10

£¨2£©·À»¤´ëÊ©

¼°Ê±¸üÐÂÉý¼¶Äں˽«kernel.unprivileged_bpf_disabled.sysctlÉèÖÃΪ1 £¬ÁÙʱÏÞÖÆÆÕͨÓû§È¨ÏÞ 


©¶´Ô­ÀíÓëµ÷ÊÔ·ÖÎö


£¨1£©Â©¶´Ô­Àí

¸Ã©¶´ºÍCVE-2020-8835 £¬CVE-2020-27194ÕâÁ½¸ö©¶´µÄÔ­ÀíÀàËÆ £¬¾ùÊÇÔÚ32λºÍ64λ֮¼ä½øÐÐת»»²Ù×÷ʱ £¬´íÎó¼ÆËãÁ˼ĴæÆ÷µÄÔ¼Êø½çÏÞ £¬µ¼Ö¿ÉÒÔÈƹýÑéÖ¤Æ÷¼ì²éʵÏÖÔ½½ç¶Áд ¡£È±ÏÝ´úÂë·ºÆðÔÚkernel/bpf/verifier.cµÄ__reg_combine_64_into_32()º¯ÊýÖÐ £¬¸Ãº¯ÊýÊÇÔÚcommit_id£º3f50f132d840ÖÐÒýÈëµÄ £¬¸Ã¹¦Ð§ÊµÏÖÁËÓÃ64λ¼Ä´æÆ÷ÉϵÄÒÑÖª·¶Î§À´ÍƶϸüĴæÆ÷µÍ32λµÄ·¶Î§ £¬µ«ÊÇͬÑù·ºÆðÁËÀàËƵļÆËã´íÎó £¬¸Ãº¯ÊýʵÏÖÈçÏ£º


1.jpg


ÐÐ1316 £¬Èç¹ûsmin_valueºÍsmax_value¶¼ÔÚ´ø·ûºÅµÄ32λÕûÊý·¶Î§ÄÚ £¬Ôò½«ÏàÓ¦µØ¸üÐÂ32λµÄ´ø·ûºÅ·¶Î§¾Þϸ £¬¶ÔÓÚÓзûºÅ·¶Î§À´Ëµ £¬ÕâÖÖ²Ù×÷ÊÇÕýÈ·µÄ ¡£½Ó×Å¿´ £¬ÔÚÎÞ·ûºÅ·¶Î§µÄÏàÓ¦Âß¼­ÖÐ £¬¶Ôumin_valueºÍumax_value·Ö±ðÔÚÐÐ1320ºÍÐÐ1322½øÐÐÁ˼ì²é ¡£ÕâÀïÂß¼­²»ÕýÈ· £¬ÀýÈçÉèÖÃdreg->umin_value=1 £¬dreg->umax_value=1<<32 £¬¼´0x100000000 £¬µ±½øÐÐÈçÉϲÙ×÷ºó £¬reg->u32_min_valueÉèÖÃΪ1 £¬Õâ¸öÊÇÕýÈ·µÄ £¬µ«ÊÇreg->u32_max_valueÈ´Äð³ÉÁË0 £¬¸ßλ±»½Ø¶Ï ¡£Õâʱreg¼Ä´æÆ÷µÄµÍ32λ·¶Î§ÒѾ­»ìÂÒ ¡£¶ÔÓÚÑéÖ¤Æ÷À´ËµÊÇ»ìÂÒµÄ £¬µ«ÊÇÔËÐÐ̬ʱ £¬regµÄ·¶Î§ÊÇÕý³£µÄ ¡£Æäʵ¶ÔÓÚÓзûºÅ½çÏÞµÄÇé¿ö £¬ÒѾ­½øÐÐÁËÐÞ¸Ä ¡£²¹¶¡commitΪ£ºb02709587ea3 £¬Òªº¦²¹¶¡´úÂëÈçÏÂËùʾ£º


2.jpg


¶øδ¶ÔÎÞ·ûºÅ½çÏÞµÄÇé¿ö½øÐнâ¾ö ¡£¸Ã©¶´²¹¶¡ÖÐ £¬ÐÞ¸ÄΪͬʱ¶Ôumin_valueºÍumax_value½øÐÐÁËÅжÏ £¬ÈçÏÂËùʾ£º


3.jpg


£¨2£©µ÷ÊÔ·ÖÎö


Ê×ÏȽ«BPF_REG_7¼Ä´æÆ÷ÉèÖÃΪ1<<32 £¬¼´0x10000000 £¬²¢Í¨¹ýÁ½¸öÁ¬ÐøµÄNEGÖ¸ÁîʹÑéÖ¤Æ÷ÎÞ·¨¸ú×ټĴæÆ÷µÄ·¶Î§ £¬Í¬Ê±¿ÉÒÔ±£Ö¤¼Ä´æÆ÷µÄÖµÔÚÔËÐÐʱÎȶ¨ ¡£¿ÉÒÔͨ¹ýÈçÏÂBPFÖ¸ÁîʵÏÖ£º


4.jpg


Ö´Ðе½LSHÖ¸Áîʱ £¬ÈçÏÂËùʾ£º


5.jpg


´ËʱBPF_REG_7¼Ä´æÆ÷µÄ״̬ÈçÏÂËùʾ£º


6.jpg


Ö´ÐÐÍêLSHºó £¬´ËʱBPF_REG_7¼Ä´æÆ÷µÄ״̬ÈçÏÂͼËùʾ£º


7.jpg


µ«ÊÇ´Ëʱumin_valueÒ²ÊÇ0x100000000 £¬»¹Ð轫umin_valueÉèÖóÉ0x1 £¬¿ÉÒÔͨ¹ýÈçÏÂeBPFÖ¸ÁîʵÏÖ£º


8.jpg


¶ÏµãÃüÖкó £¬µ÷ÓÃÕ»ÈçÏÂËùʾ£º


9.jpg


¶ÔBPF_JGEºÍBPF_JGTÖ¸Áî½øÐд¦Öà £¬ÕâÀï²»ÊÇ32λָÁî²Ù×÷ £¬Ö´ÐÐÈçÏ´úÂ룺


10.jpg


Èç¹ûR7 >= 0x1 £¬ÔòÑéÖ¤Æ÷ÕýÈ··ÖÖ§ÉÏ £¬true_reg->umin_valueÉèÖÃΪtrue_reg->umin_valueºÍtrue_uminÖ®¼äµÄ×î´óÖµ £¬ÕâÀïÉèÖóÉtrue_umin £¬Îª0x1 ¡£È»ºóµ÷ÓÃ__reg_combine_64_into_32()º¯Êý¸üÐÂÒ»ÏÂtrue_regµÄ·¶Î§ ¡£ÈçÏ´úÂëËùʾ£º


11


½øÈë¸Ãº¯Êýºó £¬Ê×ÏÈÅжÏÓзûºÅ·¶Î§µÄÇé¿ö £¬ÈçÏ´úÂëËùʾ£º


13.jpg


ÕâÀïͬʱÅжÏÓзûºÅ¾Þϸֵ £¬½á¹û²»ÎªÕæ £¬²»½øÈëifÓï¾ä £¬Òò´Ë²»»áÐÞ¸Ä32λµÄÓзûºÅ¾Þϸֵ £¬´òÓ¡true_regµÄ״̬ÈçÏÂËùʾ£º


14.jpg


È»ºó¿ªÊ¼ÅжÏÎÞ·ûºÅ×îСֵµÄÇé¿ö £¬½á¹ûΪÕæ £¬È»ºóÐÞ¸Ä32λÎÞ·ûºÅ×îСֵ £¬ÈçÏ´úÂ룺


15.jpg


 ÓÉÓÚÕâÀïÀ뿪½øÐÐÅжÏ £¬¿ÉÒÔÀÖ³ÉÉèÖÃreg->u32_min_valueΪ0x1 ¡£½ÓÏÂÀ´ÅжÏÎÞ·ûºÅ×î´óÖµ £¬reg->umax_valueΪ0xffffffffffffffff £¬´óÓÚ0xffffffff ¡£Òò´ËÌõ¼þ²»ÎªÕæ £¬²»ÐÞ¸Äreg->u32_max_value ¡£×îºótrue_regµÄ״̬ÈçÏÂËùʾ£º


16.jpg


½«¼Ä´æÆ÷µÄumin_valueºÍu32_min_value¶¼ÉèÖÃΪ0x1 ¡£½ÓÏÂÀ´Í¨¹ýÈçÏÂeBPFÖ¸Áî×éºÏ½«u32_max_valueÒ²ÉèÖÃΪ0x1 ¡£ÈçÏÂËùʾ£º


17.jpg


¸ÃÖ¸ÁîΪW7<=0x1 £¬W7Ϊ32λ¼Ä´æÆ÷ ¡£ÃüÖжϵãºó £¬µ÷ÓÃÕ»ÈçÏÂËùʾ£º


18.jpg


Èç¹ûW7<=0x1 £¬½ÓÏÂÀ´ÉèÖÃÕýÈ··Ö֧ϵÄtrue_reg->u32_max_value £¬ÈçÏÂͼËùʾ£º


19.jpg


ÐÐ7200 £¬½«true_reg->u32_max_valueÉèÖÃΪtrue_umax £¬Îª0x1 ¡£´Ëʱtrue_regµÄ״̬ÈçÏÂËùʾ£º


20.jpg


È»ºóµ÷ÓÃ__reg_combine_32_into_64()º¯Êý¸üÐÂtrue_regµÄ·¶Î§ £¬ÈçÏÂËùʾ£º


21.jpg


¸üз¶Î§ºó £¬×îºótrue_regµÄ״̬ÈçÏÂËùʾ£º


22.jpg


´ËʱÔÚÑéÖ¤Æ÷µÄÊÓ½ÇÖÐ £¬R7¼Ä´æÆ÷µÄ32λ·¶Î§ÊÇÀιÌÖµ £¬Îª³£Êý0x1 ¡£½ÓÏÂÀ´Í¨¹ýÈçÏÂeBPF×éºÏ½«R7±ä»»³É0 £¬ÈçÏÂËùʾ£º


23.jpg


Ê×ÏÈͨ¹ýMOV32½«R7µÄ64λ·¶Î§Ò²ÉèÖó£Êý0x1 ¡£Ö´ÐÐÍêMOV32Ö¸Áîºó £¬ÔÚÑéÖ¤Æ÷µÄÊÓ½ÇÏÂR7¼Ä´æÆ÷µÄ״̬ÈçÏÂËùʾ£º


24.jpg


¶øÔÚÔËÐÐʱ £¬R7µÄֵΪ1<<32 £¬¼´0x100000000 £¬µÍ32Ϊ0 £¬¼´R7µÄ32λ·¶Î§Îª³£Êý0 £¬È»ºóͨ¹ýMULºÍADDÁ½´Î²Ù×÷ £¬½«R7¼Ä´æÆ÷µÄ״̬ת»»³ÉÔÚÑéÖ¤Æ÷µÄÊÓ½ÇÏÂΪ0x0 £¬ÔÚÔËÐÐʱΪ0x1 £¬×îÖÕ±ã¿ÉÒÔʵÏÖÔ½½ç¶Áд ¡£


©¶´¸´ÏÖ


ÔÚLinux-5.11.0Äں˰汾µÄÌض¨²âÊÔ»·¾³ÖнøÐЩ¶´ÀûÓòâÊÔ £¬ÀÖ³ÉÌáȨ ¡£


25.jpg


²Î¿¼Á´½Ó


1.https://www.zerodayinitiative.com/blog/2021/5/26/cve-2021-31440-an-incorrect-bounds-calculation-in-the-linux-kernel-ebpf-verifier
2.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=10bf4e83167cc68595b85fd73bb91e8f2c086e36
3.https://github.com/torvalds/linux/commit/b02709587ea3d699a608568ee8157d8db4fd8cae
4.https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-31440


¶«É­Æ½Ì¨»ý¼«·ÀÓùʵÑéÊÒ£¨ADLab£©


ADLab½¨Á¢ÓÚ1999Äê £¬ÊÇÖйúÄþ¾²ÐÐÒµ×îÔ罨Á¢µÄ¹¥·À¼¼ÊõÑо¿ÊµÑéÊÒÖ®Ò» £¬Î¢ÈíMAPP¼Æ»®ºËÐijÉÔ± £¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß ¡£½ØֹĿǰ £¬ADLabÒÑͨ¹ýCVEÀÛ¼ÆÐû²¼Äþ¾²Â©¶´½ü1100¸ö £¬Í¨¹ý CNVD/CNNVDÀÛ¼ÆÐû²¼Äþ¾²Â©¶´1000Óà¸ö £¬Á¬Ðø±£³Ö¹ú¼ÊÍøÂçÄþ¾²ÁìÓòÒ»Á÷Ë®×¼ ¡£ÊµÑéÊÒÑо¿Æ«Ïòº­¸Ç²Ù×÷ϵͳÓëÓ¦ÓÃϵͳÄþ¾²Ñо¿¡¢ÖÇÄÜÖÕ¶ËÄþ¾²Ñо¿¡¢ÎïÁªÍøÖÇÄÜÉ豸Äþ¾²Ñо¿¡¢WebÄþ¾²Ñо¿¡¢¹¤¿ØϵͳÄþ¾²Ñо¿¡¢ÔÆÄþ¾²Ñо¿ ¡£Ñо¿½á¹ûÓ¦ÓÃÓÚ²úÎïºËÐļ¼ÊõÑо¿¡¢¹ú¼ÒÖصã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÄþ¾²·þÎñµÈ ¡£


adlab.jpg