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λµÄÁìÓò£¬µ«ÊÇͬÑù³öÏÖÁËÀàËÆµÄÍÆËãÃýÎ󣬸ú¯ÊýʵÏÖÈçÏ£º

ÐÐ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£¬¹Ø¼ü²¹¶¡´úÂëÈçÏÂËùʾ£º

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

£¨2£©µ÷ÊÔ·ÖÎö
Ê×ÏȽ«BPF_REG_7¼Ä·ÅÆ÷ÉèÖÃΪ1<<32£¬¼´0x10000000£¬²¢Í¨¹ýÁ½¸öÂ½ÐøµÄNEGÖ¸ÁîʹÑéÖ¤Æ÷ÎÞ·¨¸ú×Ù¼Ä·ÅÆ÷µÄÁìÓò£¬Í¬Ê±Äܹ»±£ÕÏ¼Ä·ÅÆ÷µÄÖµÔÚÔËÐÐʱ²»±ä¡£Äܹ»Í¨¹ýÈçÏÂBPFÖ¸ÁîʵÏÖ£º

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

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

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

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

¶ÏµãÉäÖкó£¬Å²ÓÃÕ»ÈçÏÂËùʾ£º

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

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

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

ÕâÀïͬʱÅжÏÓзûºÅ´óÓ×Öµ£¬Á˾ֲ»ÎªÕ棬²»½øÈëifÓï¾ä£¬Òò¶ø²»»áÅú¸Ä32λµÄÓзûºÅ´óÓ×Öµ£¬´òÓ¡true_regµÄ״̬ÈçÏÂËùʾ£º

¶øºóÆðÍ·ÅжÏÎÞ·ûºÅ×îÓ×ÖµµÄÇé¿ö£¬Á˾ÖÎªÕæ£¬¶øºóÅú¸Ä32λÎÞ·ûºÅ×îÓ×Öµ£¬ÈçÏ´úÂ룺

ÓÉÓÚÕâÀï·Ö¸ô½øÐÐÅжϣ¬Äܹ»³É¹¦ÉèÖÃreg->u32_min_valueΪ0x1¡£½ÓÏÂÀ´ÅжÏÎÞ·ûºÅ×î´óÖµ£¬reg->umax_valueΪ0xffffffffffffffff£¬´óÓÚ0xffffffff¡£Òò¶øÇ°Ìá²»ÎªÕæ£¬²»Åú¸Äreg->u32_max_value¡£×îºótrue_regµÄ״̬ÈçÏÂËùʾ£º

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

¸ÃÖ¸ÁîΪW7<=0x1£¬W7Ϊ32λ¼Ä·ÅÆ÷¡£ÉäÖжϵãºó£¬Å²ÓÃÕ»ÈçÏÂËùʾ£º

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

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

¶øºóŲÓÃ__reg_combine_32_into_64()º¯Êý¸üÐÂtrue_regµÄÁìÓò£¬ÈçÏÂËùʾ£º

¸üÐÂÁìÓòºó£¬×îºótrue_regµÄ״̬ÈçÏÂËùʾ£º

´ËʱÔÚÑéÖ¤Æ÷µÄÊÓ½ÇÖУ¬R7¼Ä·ÅÆ÷µÄ32λÁìÓòÊǹ̶¨Öµ£¬Îª³£Êý0x1¡£½ÓÏÂÀ´Í¨¹ýÈçÏÂeBPF×éºÏ½«R7±ä»»³É0£¬ÈçÏÂËùʾ£º

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

¶øÔÚÔËÐÐʱ£¬R7µÄֵΪ1<<32£¬¼´0x100000000£¬µÍ32Ϊ0£¬¼´R7µÄ32λÁìÓòΪ³£Êý0£¬¶øºóͨ¹ýMULºÍADDÁ½´Î²Ù×÷£¬½«R7¼Ä·ÅÆ÷µÄ״̬ת»»³ÉÔÚÑéÖ¤Æ÷µÄÊÓ½ÇÏÂΪ0x0£¬ÔÚÔËÐÐʱΪ0x1£¬×îÖÕ±ãÄܹ»ÊµÏÖÔ½½ç¶Áд¡£
·ì϶¸´ÏÖ
ÔÚLinux-5.11.0Äں˰汾µÄÌØ¶¨²âÊÔ»·¾³ÖнøÐзì϶ÀûÓòâÊÔ£¬³É¹¦ÌáȨ¡£

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



¾©¹«Íø°²±¸11010802024551ºÅ