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´òËãÖ÷Ìâ³ÉÔ± £¬¡°ºÚȸ¹¥»÷¡±¸ÅÏëÊ×ÍÆÕß¡£½ØÖ¹Ä¿Ç° £¬ADLabÒÑͨ¹ýCVEÀۼư䲼°²È«·ì϶½ü1100¸ö £¬Í¨¹ý CNVD/CNNVDÀۼư䲼°²È«·ì϶1000Óà¸ö £¬³ÖÐøÎ¬³Ö¹ú¼ÊÍøÂ簲ȫÁìÓòÒ»Á÷Ë®×¼¡£³¢ÊÔÊÒ×êÑз½Ïòº­¸Ç²Ù×÷ϵͳÓëÀûÓÃϵͳ°²È«×êÑÓ×¢ÖÇÄÜÖն˰²È«×êÑÓ×¢ÎïÁªÍøÖÇÄÜÉ豸°²È«×êÑÓ×¢Web°²È«×êÑÓ×¢¹¤¿ØÏµÍ³°²È«×êÑÓ×¢ÔÆ°²È«×êÑС£×êÑгɾÍÀûÓÃÓÚ²úÆ·Ö÷Ìâ¼¼Êõ×êÑÓ×¢¹ú¶È³Áµã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨Òµ°²È«·þÎñµÈ¡£


adlab.jpg