Linux eBPF JITȨÏÞÌáÉý©¶´£¨CVE-2020-27194£©·ÖÎöÓëÑéÖ¤
Ðû²¼Ê±¼ä 2020-11-03©¶´Åä¾°
½üÈÕ£¬¹úÍâÄþ¾²Ñо¿ÈËÔ±Åû¶һ¸öLinux eBPF verifier×é¼þ´íÎóÑé֤©¶´£¬´Ë©¶´Ô´ÓÚbpfÑé֤ϵͳÔÚLinuxÄÚºËÖÐûÓÐÕýÈ·¼ÆËãijЩ²Ù×÷µÄ¼Ä´æÆ÷½çÏÞ¸ú×Ù£¬µ¼Öµ±µØ¹¥»÷Õß¿ÉÒÔÀûÓôËȱÏݽøÐÐÄÚºËÐÅϢ鶻òÌØȨÌáÉý£¬¸Ã©¶´±àºÅΪCVE-2020-27194¡£
Ó°Ï췶ΧÓë·À»¤´ëÊ©
Linux-5.7 ~ Linux-5.8.14
Ubuntu 20.10
2¡¢·À»¤´ëÊ©
¼°Ê±¸üÐÂÉý¼¶Äںˣ»
½«kernel.unprivileged_bpf_disabled.sysctlÉèÖÃΪ1£¬ÁÙʱÏÞÖÆÆÕͨÓû§È¨ÏÞ¡£
©¶´ÔÀíÓëµ÷ÊÔ·ÖÎö
1¡¢Â©¶´ÔÀí
¸Ã©¶´ºÍPwn2own2020½ÇÖðÖÐʹÓõÄCVE-2020-8835©¶´ÔÀíÒ»Ö£¬¾ùÊÇ´íÎó¼ÆËãÁ˼ĴæÆ÷½çÏÞ¸ú×Ù£¬µ¼Ö¿ÉÒÔÈƹýÑéÖ¤Æ÷¼ì²éµ½´ïÔ½½ç¶Áд¡£È±ÏÝ´úÂë·ºÆðÔÚkernel/bpf/verifier.cµÄscalar32_min_max_or()º¯ÊýÖУ¬¸Ãº¯ÊýÊÇÔÚcommit_id£º3f50f132d840ÖÐÒýÈëµÄ£¬¸Ã¹¦Ð§ÊµÏÖÁËÏÔʽµÄALU32(32λ¼ÆËãÀà²Ù×÷)¼Ä´æÆ÷½çÏÞ¸ú×Ù£¬´¦ÖÃORÔËËãʱ£¬µ÷ÓÃscalar32_min_max_or()º¯Êý½øÐÐ32λ¼Ä´æÆ÷½çÏÞ¸ú×Ù£¬¸Ãº¯ÊýʵÏÖÈçÏ£º
ÐÐ5365ºÍÐÐ5366£¬Ö±½Ó½«dst_reg¼Ä´æÆ÷ÖеÄ64λÎÞ·ûºÅÖµ¸³Öµ¸ø32λÓзûºÅÖµ£¬ÕâÃ÷ÏÔÊÇ´íÎóµÄ¡£ÀýÈçÉèÖÃdst_reg->umin_value=1£¬dst_reg->umax_value=0x600000001£¬µ±½øÐÐÈçÉϲÙ×÷ºó£¬dst_reg->s32_min_valueΪ1£¬µ«ÊÇdst_reg->s32_max_valueÒ²½«ÊÇ1£¬ÒòΪ0x600000001µÄ¸ß뽫±»½Ø¶Ï£¬Õâʱdst_reg¼Ä´æÆ÷µÄ·¶Î§´Ó[1,0x600000001]Äð³ÉÁË[1,1]£¬Õâ»á±»ÑéÖ¤Æ÷ʶ±ðΪ³£Êý1£¬½ø¶øÈƹýÑéÖ¤Æ÷¼ì²é¡£Â©¶´²¹¶¡ÖУ¬½øÐÐÁËÕýÈ·µÄ32λÓзûºÅÖµ¸³Öµ²Ù×÷£¬ÈçÏÂËùʾ£º
2¡¢µ÷ÊÔ·ÖÎö
Ê×ÏȽ«¼Ä´æÆ÷µÄumin_valueÉèÖÃΪ0x1£¬¿ÉÒÔͨ¹ýÈçÏÂBPFÖ¸ÁîʵÏÖ£º
´Ëʱ£¬¼Ä´æÆ÷µÄ״̬ÈçÏÂËùʾ£º
ÉèÖÃÍêumin_valueºó£¬ÉèÖÃumax_valueΪ0x600000001£¬¿ÉÒÔͨ¹ýÈçÏÂBPFÖ¸ÁîʵÏÖ£º
¶ÏµãÃüÖк󣬵÷ÓÃÕ»ÈçÏÂËùʾ£º
Ö´ÐÐÍêBPF_JMP_REG(BPF_JLT,BPF_REG_6,BPF_REG_5,1)Ö¸Áîºó£¬½«R6¼Ä´æÆ÷·¶Î§ÉèÖÃΪ0x1µ½0x600000001Ö®¼ä¡£R6¼Ä´æÆ÷״̬ÈçÏÂËùʾ£º
½Ó×Å£¬ÉèÖÃR6¼Ä´æÆ÷ÖÐ32λµÄÎÞ·ûºÅ×îСֵºÍ×î´óÖµ£¬
ÉèÖÃÍêÖ®ºó£¬R6¼Ä´æÆ÷״̬ÈçÏÂËùʾ£º
ºì¿òÖÐÉèÖõÄÖµÊDZØÐëÒª±£Ö¤µÄ£¬ÐèÒªÌáÇ°½øÐÐÉèÖ㬷½±ãºóÃæÈƹýifÅжϽøÈëȱÏÝ´úÂë¿éÖС£½Ó×ÅÉèÖÃR6¼Ä´æÆ÷32λÓзûºÅ×îСֵºÍ×î´óÖµ£¬´úÂëÈçÏÂËùʾ£º
ÐÐ5355£¬ifÓï¾äÅжϲ»½¨Á¢£¬»á×ßµ½ÐÐ5362·ÖÖ§ÖУ¬µ÷ÊÔÇé¿öÈçÏÂËùʾ£º
´¥·¢Â©¶´ºó£¬R6¼Ä´æÆ÷״̬ÈçÏ£º
´Ëʱs32_min_valueºÍs32_max_value¶¼Îª0x1£¬ÔÚÑéÖ¤Æ÷ÖУ¬R6¼Ä´æÆ÷µÄ32λÓзûºÅȡֵΪ³£Êý1¡£µ«R6¼Ä´æÆ÷µÄȡֵʵ¼ÊÊÇÓз¶Î§µÄ¡£½Ó׎«R6¼Ä´æÆ÷½øÐÐ32λMOVµ½R7¼Ä´æÆ÷ÖУ¬Ö´Ðе½ÈçÏ´úÂëËùʾ£º

´Ëʱ£¬src_reg¼Ä´æÆ÷ÈçÏÂËùʾ£º
Ö´ÐÐMOV²Ù×÷֮ǰ£¬R7¼Ä´æÆ÷״̬ÈçÏÂËùʾ£º
Ö´ÐÐMOV²Ù×÷ºó£¬R7¼Ä´æÆ÷״̬ÈçÏÂËùʾ£º
R7¼Ä´æÆ÷Ϊ³£Á¿1£¬Êµ¼ÊÔËÐÐÇé¿öÏÂÊÇÓз¶Î§µÄ£¬¿ÉÒÔÉèÖÃΪ2¡£Ö´ÐÐBPF_ALU64_IMM(BPF_RSH,BPF_REG_7,1)ºó£¬¼´R7 >>= 1£¬R7¼Ä´æÆ÷ÈçÏÂËùʾ£º
´Ëʱumin_valueºÍumax_valueΪ0£¬¼´ÎªR7¼Ä´æÆ÷½øÐÐÓÒÒƲÙ×÷ºó£¬ÔÚÑéÖ¤Æ÷Öб»Ê¶±ðΪ³£Êý0£¬´ËʱR7¼Ä´æÆ÷½øÐмӼõÔËË㶼²»»á·¢ÉúÔ½½ç£¬ÈƹýÁËÑéÖ¤Æ÷µÄ½çÏÞ¼ì²é¡£µ«ÊÇÈç¹ûR7¼Ä´æÆ÷ʵ¼ÊÉèÖÃΪ2£¬2>>1Ϊ1£¬R7¼Ä´æÆ÷Ϊ1£¬´ËʱºÍR7¼Ä´æÆ÷½øÐмӼõÔËË㣬µ½´ïÔ½½ç¶Áд¡£
©¶´¸´ÏÖ
ÔÚLinux-5.7.7°æ±¾ÖнøÐЩ¶´ÀûÓã¬ÀÖ³ÉÌáȨ¡£
²Î¿¼Á´½Ó£º
[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-27194
[2] https://github.com/torvalds/linux/commit/5b9fbeb75b6a98955f628e205ac26689bcb1383e
[3] https://github.com/torvalds/linux/commit/3f50f132d8400e129fc9eb68b5020167ef80a244
[4] https://scannell.me/fuzzing-for-ebpf-jit-bugs-in-the-linux-kernel/
¶«Éƽ̨»ý¼«·ÀÓùʵÑéÊÒ£¨ADLab£©
ADLab½¨Á¢ÓÚ1999Ä꣬ÊÇÖйúÄþ¾²ÐÐÒµ×îÔ罨Á¢µÄ¹¥·À¼¼ÊõÑо¿ÊµÑéÊÒÖ®Ò»£¬Î¢ÈíMAPP¼Æ»®ºËÐijÉÔ±£¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß¡£½ØֹĿǰ£¬ADLabÒÑͨ¹ýCVEÀÛ¼ÆÐû²¼Äþ¾²Â©¶´½ü1100¸ö£¬Í¨¹ý CNVD/CNNVDÀÛ¼ÆÐû²¼Äþ¾²Â©¶´900Óà¸ö£¬Á¬Ðø±£³Ö¹ú¼ÊÍøÂçÄþ¾²ÁìÓòÒ»Á÷Ë®×¼¡£ÊµÑéÊÒÑо¿Æ«Ïòº¸Ç²Ù×÷ϵͳÓëÓ¦ÓÃϵͳÄþ¾²Ñо¿¡¢Òƶ¯ÖÇÄÜÖÕ¶ËÄþ¾²Ñо¿¡¢ÎïÁªÍøÖÇÄÜÉ豸Äþ¾²Ñо¿¡¢WebÄþ¾²Ñо¿¡¢¹¤¿ØϵͳÄþ¾²Ñо¿¡¢ÔÆÄþ¾²Ñо¿¡£Ñо¿½á¹ûÓ¦ÓÃÓÚ²úÎïºËÐļ¼ÊõÑо¿¡¢¹ú¼ÒÖصã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÄþ¾²·þÎñµÈ¡£