¾ÅÓÎÀÏ¸ç¿Æ¼¼Ðû²¼LinuxÄÚºËÍâµØÌáȨÎó²îÍþвԤ¾¯Í¨¸æ Õâ¸öÎó²î9Äê²Å±»ÐÞ¸´   ¡£¾Í CVE-2016-5195  Õâ¸öÎó²î £¬¾ÅÓÎÀÏ¸ç¿Æ¼¼Ðû²¼ÊÖÒÕÆÊÎö¼°·À»¤¼Æ»® ¡£

LinuxÄں˵ÄÄÚ´æ×ÓϵͳÔÚ´¦Öóͷ£Ð´Ê±¿½±´(Copy-on-Write £¬ËõдΪCOW)ʱ±£´æÌõ¼þ¾ºÕùÎó²î £¬µ¼Ö¿ÉÒÔÆÆËð˽ÓÐÖ»¶ÁÄÚ´æÓ³Éä ¡£Ò»¸öµÍȨÏÞµÄÍâµØÓû§Äܹ»Ê¹ÓôËÎó²î»ñÈ¡ÆäËûÖ»¶ÁÄÚ´æÓ³ÉäµÄдȨÏÞ £¬½ø¶ø¿ÉÒÔ»ñÈ¡Õû¸öϵͳµÄ×î¸ßȨÏÞ ¡£Îó²îÏêÇéÈçÏ£º

https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails

Îó²îÑéÖ¤³ÌÐò

POCÁ´½ÓµØµãÈçÏ£º

https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c

ÊÜÓ°ÏìµÄ¹æÄ£

¸ÃÎó²î´ÓLinuxÄں˰汾>=2.6.22ÒÔºó¾Í×îÏȱ£´æ £¬Ó°ÏìÈ«°æ±¾Linux £¬Ö±µ½2016Äê10ÔÂ18ÈÕ²ÅÐÞ¸´ ¡£ÆäÖÐRed Hat¡¢DebianºÍUbuntuÈý¸ö¿¯ÐаæµÄÊÜÓ°Ïì¼°ÐÞ¸´ÇéÐμûÈçÏÂÁ´½Ó£º

  • Red Hat: https://access.redhat.com/security/cve/cve-2016-5195
  • Debian: https://security-tracker.debian.org/tracker/CVE-2016-5195
  • Ubuntu £º http://people.canonical.com/~ubuntu-security/cve/2016/CVE-2016-5195.html

Îó²îÆÊÎö

COW=Copy On Writeдʱ¸´ÖÆ £¬µ±³ÌÐò×¼±¸Ð´Ò»¿éÓ³ÉäµÄÇøÓò £¬Ôò»áÌìÉúÒ»¿éÓ³ÉäµÄ¸´ÖÆ £¬¶Ô´ËÇøÓòµÄÈκÎÐ޸ͼ²»»áд»ØÔ­À´µÄÎļþ ¡£ÔÚͨ³£µÄÇéÐÎÏ £¬ÈôÊÇÔÚCOWʱ¼ä±¬·¢ÁËȱҳÒì³£ £¬Ôò´¦Öóͷ£È±Ò³Òì³£µÄº¯Êýhandle_mm_fault()º¯ÊýÔò»á×èÖ¹Ò³±íдÈë²¢ÖØÊÔCOW ¡£

ͨ³£ÇéÐÎÏ £¬µ±Ò»¸ö³ÌÐòдһ¸öÄÚ´æÒ³ £¬ÇÒÕâ¸öÎïÀíÒ³²»¿ÉдµÄʱ¼ä £¬»á´¥·¢Òì³£ £¬ÓÉÓÚÄ¿½ñÎïÀíÒ³ÔÚÓû§¿Õ¼ä £¬²»ÔÚÄں˿ռäÖÐ ¡£ÒÔÊÇŲÓÃhandle_pte_fault £¬Õâ¸öº¯Êý¾­ÓÉһϵÁеÄÅжÏ £¬·¢Ã÷ÊÇÓÉÓÚÄÚ´æÒ³²»¿Éдµ¼ÖµÄÒì³£ £¬Ôò»áŲÓÃdo_wp_pageÀ´Íê³Éдʱ¸´ÖÆ£¨COW£© ¡£²»¹ý £¬¸¸×ÓÀú³ÌÊÇÒÔÄäÃûÓ³ÉäÀ´¹²ÏíÄÚ´æµÄ £¬ÒÔÊÇÖ»ÐèÒªÍê³Éreuse_swap_page¼´¿É ¡£¿ÉÊÇ £¬»áɥʧFOLL_WRITE±ê¼Çλ ¡£

ÈôÊÇÁíÒ»¸öÏß³ÌÒ»Ö±µÄ¸æËßÄÚºËÕâ¸öÎïÀíÒ³²»ÔÙÐèÒª¡¢¿ÉÒÔÊÍ·Å £¬µ±ÄÚºËÊͷŵôË­ÈËÎïÀíÒ³ºó £¬handle_mm_faultÔÚ´¦Öóͷ£Ò»¸ö¶Á¹ýʧ£¨!pte_present£©´Ó¶ø»ñµÃÒ»¸öpagecacheÒ²¾ÍÊÇÎļþµÄ»º´æ ¡£´Ó¶øÆÆËð˽ÓÐÓ³ÉäÍê³ÉÖ»¶ÁÎļþµÄдÈë ¡£

×÷ÕßÔÚÐÞ¸´´úÂëÖÐÊÇÕâÑù´¦Öóͷ£µÄ £¬ÔÚɨ³ýÓ³ÉäµÄʱ¼ä¼ì²éÁËCOW״̬ºÍÒ³±íµÄÔàλ(dirty bit) £¬ÈçÏÂͼËùʾ£º

¾ÅÓÎÀϸ硤(Öйú)¾ãÀÖ²¿¹Ù·½ÍøÕ¾

×÷ÕßÔÚ´úÂëÖÐÔöÌíÁËÒ»¸öCOWµÄ±êʶÀ´ÌåÏÖCOWÊÇ·ñÍê³É £¬ÉèÖÃCOWλΪδÍê³É ¡£²¢ÇÒ £¬µ±³ÌÐòҪдһ¿éÄÚ´æÊ± £¬±ØÐèÖª×ãÒÔÏÂÌõ¼þ£º

Õâ¿éÄÚ´æ¿Éд»òÕßÍê³ÉCOW²¢ÇÒÔàλ±»ÉèÖà ¡£ÕâÑù¾Í°ü¹ÜÁ˳ÌÐò²»»áÔÚûÓÐCOWµÄÇéÐÎÏÂÍê³Éд²Ù×÷ ¡£

LINUXÄÚºËÍâµØÌáȨÎó²îÐÞ¸´½¨Òé

  • ʹÓÃǰһ½ÚËùÌ`ÐаæLinuxµÄÓû§ £¬¿ÉÒԲο¼ÉÏÊöÁ´½Ó £¬Æ¾Ö¤¹Ù·½½¨Òé¾ÙÐÐÉý¼¶»ò°´ÒªÇó½ÓÄɹæ±Ü²½·¥
  • Óû§¿ÉÒÔÆ¾Ö¤ÈçÏÂÁ´½Ó £¬ÐÞ¸ÄÄÚºËÔ´Âë £¬ÖØÐ±àÒë²¢×°ÖÃLinuxÄÚºË £¬¼´¿ÉÐÞ¸´£º https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619
  • ʹÓþÅÓÎÀÏ¸ç¿Æ¼¼µÄÔ¶³ÌÆÀ¹ÀϵͳRSAS¾ÙÐÐÇå¾²ÆÀ¹À ¡£
  • ¶ÌÆÚ·þÎñ£º¾ÅÓÎÀÏ¸ç¿Æ¼¼¹¤³ÌʦÏÖ³¡´¦Öóͷ£ ¡£È·±£µÚһʱ¼äÏû³ýÍøÂçÄÚÏà¹ØÎ£º¦µã £¬¿ØÖÆÊÂÎñÓ°Ïì¹æÄ£ £¬ÌṩÊÂÎñÆÊÎö±¨¸æ ¡£
  • ÖÐÆÚ·þÎñ£ºÌṩ 3-6¸öÔµÄΣº¦¼à¿ØÓëѲ¼ì·þÎñ ¡£¸ù³ýΣº¦ £¬È·±£ÊÂÎñ²»¸´·¢ ¡£
  • ºã¾Ã·þÎñ£º»ùÓÚÐÐҵӪҵΣº¦½â¾ö¼Æ»®£¨ÍþвÇ鱨+¹¥»÷ËÝÔ´+רҵÇå¾²·þÎñ£© ¡£

Éù Ã÷

±¾Ç徲ͨ¸æ½öÓÃÀ´ÐÎò¿ÉÄܱ£´æµÄÇå¾²ÎÊÌâ £¬¾ÅÓÎÀÏ¸ç¿Æ¼¼²»Îª´ËÇ徲ͨ¸æÌṩÈκΰü¹Ü»òÔÊÐí ¡£ÓÉÓÚÈö²¥¡¢Ê¹ÓôËÇ徲ͨ¸æËùÌṩµÄÐÅÏ¢¶øÔì³ÉµÄÈκÎÖ±½Ó»òÕß¼ä½ÓµÄЧ¹û¼°Ëðʧ £¬¾ùÓÉʹÓÃÕß×Ô¼ºÈÏÕæ £¬¾ÅÓÎÀÏ¸ç¿Æ¼¼ÒÔ¼°Ç徲ͨ¸æ×÷Õß²»Îª´Ë¼ç¸ºÈκÎÔðÈÎ ¡£¾ÅÓÎÀÏ¸ç¿Æ¼¼ÓµÓжԴËÇ徲ͨ¸æµÄÐÞ¸ÄÏ¢ÕùÊÍȨ ¡£ÈçÓû×ªÔØ»òÈö²¥´ËÇ徲ͨ¸æ £¬±ØÐè°ü¹Ü´ËÇ徲ͨ¸æµÄÍêÕûÐÔ £¬°üÀ¨°æÈ¨ÉùÃ÷µÈËùÓÐÄÚÈÝ ¡£Î´¾­¾ÅÓÎÀÏ¸ç¿Æ¼¼ÔÊÐí £¬²»µÃí§ÒâÐ޸ĻòÕßÔö¼õ´ËÇ徲ͨ¸æÄÚÈÝ £¬²»µÃÒÔÈκη½·¨½«ÆäÓÃÓÚÉÌҵĿµÄ ¡£