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