Windows PrintDemonÌáȨ·ì϶·ÖÎö

°ä²¼¹¦·ò 2020-05-21

1.·ì϶¸ÅÊö


΢ÈíÔÚ5ÔÂ12Èյݲȫ¸üÐÂÖй«¿ªÁËÒ»¸öWindows±¾µØÌáÈ¡·ì϶£¨CVE-2020-1048£© £¬¸Ã·ì϶µÄÃèÊöΪ£º

¡°Windows Print Spooler·þÎñ²»Ç¡±¾µØÔÊÐíËÁÒâµÄÎļþϵͳдÈë £¬´æÔÚÌØÈ¨ÌáÉý·ì϶¡£¹¥»÷ÕßÀûÓô˷ì϶¿ÉÄÜÓÃÏµÍ³ÌØÈ¨ÔËÐÐËÁÒâ´úÂë £¬´Ó¶øÊµÏÖ£º·¨Ê½µÄ×°Öᢲ鿴¡¢¸ü¸Ä»òÊý¾Ýɾ³ý £¬ÒÔ¼°´´½¨ÓµÓÐÆëȫȨÏÞµÄÕÊ»§¡£ÒªÀûÓô˷ì϶ £¬¹¥»÷Õß±ØÐëµÇ¼µ½ÊÜÓ°ÏìµÄϵͳ²¢ÔËÐÐÌØ¶¨¾ç±¾»òÀûÓ÷¨Ê½¡±¡£


¸Ã·ì϶Óɰ²È«×êÑÐÈËÔ±Alex IonescuºÍYarden Shafir·¢ÏÖ £¬²¢±»¶¨ÃûΪPrintDemon¡£Print SpoolerÊÇϵͳ×Ô´øµÄ´òÓ¡ºó¶Ü´¦Ö÷þÎñ £¬ÖÎÀíËùÓб¾µØºÍÍøÂç´òÓ¡¶ÓÁÐ £¬½ÚÔì×ÅËùÓдòÓ¡¹¤×÷¡£Print SpoolerÔÚWindowsϵͳÖÐÒÑ´æÔÚ¶àÄê £¬´Ó΢Èí°ä²¼µÄ²¹¶¡Ò³Ãæ¿ÉÖª¸Ã·ì϶ӰÏìWindows7ÖÁWindows10 1909µÄÏÕЩËùÓа汾¡£


2.·ì϶ÑéÖ¤


28ȦADLab°²È«×êÑÐÔ±¶Ô¸Ã·ì϶½øÐÐÁË·ÖÎöºÍÑéÖ¤ £¬ÊµÏÖÁËÔÚµÍȨÏ޵ij߶ÈÓû§ÏÂдÈëϵͳĿ¼ £¬²âÊÔ²Ù×÷ϵͳΪWindows 10 x64ÆóÒµ°æ2016£¨³Ö¾Ã·þÎñ°æ£© £¬²âÊÔ²½ÖèÈçÏ£º


£¨1£©ÔÚ²âÊÔϵͳÖд´½¨Ò»¸ö³ß¶ÈÓû§test £¬²¢Ê¹Óøó߶ÈÓû§µÇ¼ϵͳ¡£²é¿´ÆäËùÊôÓû§×é £¬È·ÈÏÆä²»ÊÇÖÎÀíÔ±Óû§×é¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


£¨2£©ÔÚtestÕË»§Ï £¬³¢ÊÔÔÚϵͳĿ¼Ï´´½¨Îļþ¼Ð»òÕßдÈëÎļþ £¬¾ùʧ°Ü¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


£¨3£©¶øºóÖ´ÐÐÈçÏÂPowerShellºÅÁî £¬ÒÔÆÚÔÚϵͳĿ¼Ï´´½¨Îļþmyport.txt¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


£¨4£©³ÁÆô²âÊÔϵͳ²¢µÇ¼testÓû§ £¬Äܹ»¿´µ½ÔÚϵͳĿ¼ÏÂÒÑÌìÉúÁËmyport.txtÎļþ £¬²é¿´ÄÚÈݵÄÈ·Ô̺¬Á˲âÊÔ×Ö·û´®¡£¸ÃÁ˾ÖÅú×¢£ºµÍȨÏÞµÄ testÓû§Í»ÆÆÁËÎÞ·¨Åú¸Äϵͳ×ÊÔ´µÄ°²È«ÏÞ¶È¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿

28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


3.·ì϶µÀÀí


¸Ã·ìÏ¶Éæ¼°µ½Windows´òÓ¡»úµÄ¹¤×÷»úÔì £¬Îª¸üºÃµÄÀí½â·ì϶³ÉÒò £¬Ê×Ïȵ¥Ò»½éÉÜ´òÓ¡»ú»ù´¡ÖªÊ¶ £¬¶øºóÔÙ·ÖÎö·ì϶³ÉÒò¡£


´òÓ¡»ú¹¤×÷»úÔì


WindowsϵͳµÄ´òÓ¡»úÓÐÁ½¸öÖ÷Ìâ×é¼þ£º´òÓ¡»úÇý¶¯ºÍ´òÓ¡»ú¶Ë¿Ú¡£


¡ö ´òÓ¡»úÇý¶¯

ÔÚÔö³¤Ò»¸ö´òÓ¡»úʱ £¬±ØÒª×°ÖôòÓ¡»úÇý¶¯¡£ÔÚMSDNÎĵµÃèÊöÖÐ £¬ÔçÆÚϵͳҪÇóÖ»Óо߱¸SeLoadDriverPrivilegeȨÏÞµÄÓû§ÄÜÁ¦×°ÖôòÓ¡Çý¶¯ £¬µ«ÎªÁ˱ãÓڳ߶ÈÓû§×°ÖÃÇý¶¯ £¬´ÓWindows VistaÆðÍ· £¬Ö»ÓдòÓ¡»úÇý¶¯ÊÇÒѾ­´æÔڵĿɵ±¼´±ãÓõÄÇý¶¯ £¬¾Í²»±ØÒªÈκÎÌØÈ¨¼´¿É×°Öá£ÀýÈç £¬Í¨¹ýÒ»ÌõPowerShellºÅÁî¼´¿É×°Öá°Generic / Text-Only¡±Çý¶¯¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


¡ö ´òÓ¡»ú¶Ë¿Ú


ÔÚÔö³¤Ò»¸ö´òÓ¡»úʱ £¬±ØÒªÉèÖôòÓ¡»úµÄ¶Ë¿Ú¡£WindowsÖ§³Ö¶àÖÖÀàÐ͵ĴòÓ¡»ú¶Ë¿Ú£ºLPT1¶Ë¿Ú¡¢USB¶Ë¿Ú¡¢ÍøÂç¶Ë¿ÚºÍÎļþµÈ¡£ÈôÊÇÉèÖö˿ÚΪÎļþ £¬ÔòÒâζ×Å´òÓ¡»ú½«Êý¾Ý´òÓ¡µ½Ö¸¶¨Îļþ¡£ÀýÈç £¬Í¨¹ýÒ»ÌõPowerShellºÅÁî¼´¿ÉÔö³¤Ò»¸öÊä³öµ½Ö¸¶¨ÎļþµÄ´òÓ¡¶Ë¿Ú£º

Add-PrinterPort -Name "C:\windows\Temp\myport.txt"


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


ÏÖʵÉÏ £¬¸Ã²Ù×÷ÊÇÔÚ×¢²á±íÖÐÔö³¤Ò»¸öREG_SZÀàÐ͵ÄÖµ¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


³ï±¸ºÃÇý¶¯ºÍ¶Ë¿Úºó £¬Í¨¹ýÒ»ÌõPowerShellºÅÁî¼´¿É´´½¨Ò»¸ö´òÓ¡»ú¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


´òÓ¡»ú´´½¨½áÊøºó £¬Í¨¹ýÒ»ÌõPowerShellºÅÁî¼´¿É´òÓ¡Êý¾Ýµ½Ö¸¶¨¶Ë¿Ú£º

"PrintTest!" | Out-Printer -Name "PrintTest"


ÓÉÓÚPrintTest´òÓ¡»úµÄ¶Ë¿ÚÊÇÎļþc:\windows\Temp\myport.txt £¬Òò¶ø´òÓ¡ºÅÁîÖ´Ðкó £¬Êý¾Ý¡°Print Test!¡±½«»á±»Ð´È루¼´´òÓ¡£©µ½¸ÃÎļþ¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


Õë¶Ô¶Ë¿ÚÊÇÎļþµÄ´òÓ¡¹ý³Ì £¬spooler´òÓ¡·þÎñ·¨Ê½ÒÔimpersonating·½Ê½À´·ÂÕÕµ±Ç°Óû§µÄÌØÈ¨½øÐÐÎļþдÈë¡£Òò¶ø £¬ÈôÊǶ˿ÚÎļþÔÚÊܱ£»¤µÄϵͳĿ¼£¨ÀýÈçC:\Windows\system32£© £¬ Ôò·ÇÖÎÀíԱϵÄPowerShell´òÓ¡×÷Òµ¾Í»áʧ°Ü¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿

28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


ÍÑ»ú´òÓ¡µÄ»úÔì


ÔÚWindowsϵͳÉÏ £¬ÈôÊÇϵͳÅäÖÃÆôÓÃÁ˼ÙÍÑ»ú·þÎñ £¬ÔòËùÓеĴòÓ¡¹¤×÷¶¼²»Êǵ±¼´Ö´ÐС£Ïà·´ £¬ÏµÍ³Ê¹ÓÃPrint SpoolerÀ´ÖÎÀíÍÑ»ú´òÓ¡¹¤×÷¡£¾ßÌåÀ´Ëµ £¬µ±Óû§Å²ÓôòÓ¡²Ù×÷ºó £¬ÏµÍ³½«´òÓ¡×÷Òµ´æ´¢ÔÚÌØ¶¨µÄ¼ÙÍÑ»úÎļþ¼ÐÖС£


ĬÈÏÇé¿öÏ £¬WindowsÌìÉúµÄÍÑ»ú´òÓ¡¹¤×÷ÎļþΪ.SPLÎļþ £¬´Ë±íWindows»¹»á´´½¨ºó׺ÃûΪ.SHDµÄshadowÎļþ²¢Í¬SPLÎļþ×ö¹ØÁª¡£´´½¨shadowÎļþµÄÓô¦ÊÇ£ºÔÚ´òÓ¡·¨Ê½³öÏÖÎÊÌâ»òÕß´òÓ¡¹¤×÷±»¹ÒÆðºó £¬PrintSpoolerÒÀÈ»Äܹ»Í¨¹ýSHDÎļþ¸´Ô­´òÓ¡¹¤×÷¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


ÔÚWindowsϵͳ³ÁÆô»òPrint Spooler·þÎñ³ÁÆôÖ®ºó £¬.SHDºÍ.SPLÎļþ»á±»³ÁжÁÈ¡ÒÔ¸´Ô­´òÓ¡¹¤×÷¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


´òÓ¡ÌáȨµÄµÀÀí


ÍÑ»ú´òÓ¡»úÔìʹµÃWindowsϵͳÔÚ³ÁÆôºó»á¸´Ô­¿ÉÄÜ´æÔÚµÄδִÐдòÓ¡¹¤×÷¡£µ«ÊÇ £¬³ÁÆôºóµÄPrinter Spooler·þÎñ·¨Ê½Ö±½ÓʹÓÃÁËSystemȨÏÞÀ´¸´Ô­Î´Ö´ÐеĴòÓ¡×÷Òµ¡£¶ÔÓÚ´òÓ¡»ú¶Ë¿ÚΪÎļþµÄ´òÓ¡¹¤×÷ £¬´òÓ¡ÎļþµÄдÈëÒ²¾ÍÔÚSystemȨÏÞϱ»Ö´ÐС£Òò¶ø £¬ÏµÍ³³ÁÆôʹµÃÍÑ»ú´òÓ¡¹¤×÷¾ß±¸ÁËSystemȨÏÞµÄËÁÒâÎļþдÈëÄÜÁ¦¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


´òÓ¡»úµÄÉèÖóýPowerShell¾ç±¾±í £¬Í¨¹ýϵͳ½ÚÔìÃæ°åÒ²ÄÜÉèÖ᣾ßÌåÀ´Ëµ £¬Í¨¹ý¡°É豸ºÍ´òÓ¡»ú¡±ÄÜÔö³¤´òÓ¡»ú²¢ÉèÖö˿Ú¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿

28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿

28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


µ«ÈôÊÇÉèÖôòÓ¡¶Ë¿ÚÃûΪ¡°C:\Windows\system32\myport.txt¡± £¬Ôò»áʧ°Ü¡£


ΪºÎÉèÖÃͬÑùÎļþÃûµÄ´òÓ¡»ú¶Ë¿Ú £¬Í¨¹ý½ÚÔìÃæ°å»áʧ°Ü £¬¶øÍ¨¹ýPowerShell ºÅÁîÔòÄܹ»³É¹¦ÄØ£¿Í¨¹ý¶ÈÎöÕâÁ½ÖÖ·½Ê½¶Ôspooler·¨Ê½Ö´ÐÐÁ÷³ÌµÄÓ°Ïì £¬·¢ÏÖspooler·¨Ê½¶Ôͨ¹ýPowerShellºÅÁîÐÐÔö³¤´òÓ¡»ú¶Ë¿Ú·½Ê½²»×㰲ȫУÑé¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


¾ßÌåÀ´½² £¬Õë¶ÔPowerShellºÅÁîÔö³¤´òÓ¡»ú¶Ë¿Ú £¬spooler·¨Ê½Ö±½ÓÉèÖÃÁËÏàÓ¦µÄ´òÓ¡»ú¶Ë¿Ú×¢²á±íÏÕë¶Ô½ÚÔìÃæ°åÔö³¤´òÓ¡»ú¶Ë¿Ú £¬spooler·¨Ê½»áÊ×Ïȳ¢ÊÔ´´½¨¸Ã¶Ë¿ÚÎļþ £¬´´½¨Ê§°Üºó¾Í²»»áÔÙÉèÖÃÏàÓ¦µÄ×¢²á±íÏî¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


½øÒ»²½·ÖÎöÓйØAPI·¢ÏÖ £¬WindowsϵͳÌṩÁËÁ½ÖÖÔö³¤´òÓ¡»ú¶Ë¿ÚµÄAPI £¬±ðÀëÊÇAddPortº¯ÊýºÍXcvDataº¯Êý¡£ÆäÖÐMSDN¶ÔAddPortµÄÃèÊö£º


¡°AddPortº¯Êýä¯ÀÀÍøÂçÒÔ²éÕÒÏÖÓÐ¶Ë¿Ú £¬²¢µ¯³ö¶Ô»°¿ò¹©Óû§Ñ¡Ôñ¡£AddPortº¯ÊýÓ¦¸Ãͨ¹ýŲÓÃEnumPortsÀ´ÑéÖ¤Óû§ÊäÈëµÄ¶Ë¿ÚÃû³Æ £¬ÒÔÈ·±£²»´æÔÚ³Á¸´µÄÃû³Æ¡£AddPortº¯ÊýµÄŲÓ÷½±ØÐëÓµÓнӼû¶Ë¿ÚËùÏνӵķþÎñÆ÷µÄSERVER_ACCESS_ADMINISTERȨÏÞ¡£ÒªÔö³¤¶Ë¿Ú¶ø²»ÏÔʾ¶Ô»°¿ò £¬¿ÉŲÓÃXcvDataº¯Êý¶ø²»ÊÇAddPort ¡±¡£


ͨ¹ý½ÚÔìÃæ°åÔö³¤´òÓ¡»úÔڵײãÊÇŲÓÃÁËAddPortº¯Êý £¬¸Ãº¯Êý»á´¥·¢spooler·¨Ê½¶Ô¶Ë¿ÚµÄºÏ·¨ÐÔУÑ顣ͨ¹ýPowerShellºÅÁîÔö³¤´òÓ¡»úÔڵײãÔòÊÇÖ±½ÓŲÓÃXcvDataº¯Êý £¬¸Ãº¯Êý²»»á´¥·¢spooler·¨Ê½¶ÔÓû§Ôö³¤µÄ¶Ë¿Ú½øÐа²È«Ð£Ñé¡£Òò¶ø £¬²âÊÔ·¨Ê½AddPort.exeͨ¹ý¸Ãº¯ÊýÔڳ߶ÈÓû§È¨ÏÞÏÂÒ²ÄÜÉèÖôòÓ¡»ú¶Ë¿ÚΪÊܱ£»¤Ä¿Â¼ÖеÄÎļþ¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿


·ì϶²¹¶¡µÄ·ÖÎö


·ÖÎö·ì϶½¨¸´ºóµÄ°æ±¾·¢ÏÖ £¬Î¢ÈíÔڹؼüº¯ÊýLcmCreatePortEntry£¨×îÖÕ´´½¨´òÓ¡»ú¶Ë¿ÚµÄº¯Êý£©ÖÐÔö³¤ÁËÏàÓ¦µÄ¶Ë¿ÚºÏ·¨ÐԲ鳭´úÂë¡£ÏÂͼÊǹؼüº¯ÊýLcmCreatePortEntryÔÚ½¨¸´Ç°ºÍ½¨¸´ºóµÄCall Graph¶Ô±È £¬Äܹ»¿´³ö£º²¹¶¡µÄÖ÷ÌâÊÇͨ¹ýº¯ÊýPortIsValid¶Ô¶Ë¿Ú½øÐкϷ¨ÐԲ鳭¡£


28Ȧ-28Ȧ¹Ù·½ÍøÕ¾-ÏàÐÅÆ·ÅƵÄÁ¦Á¿



ƾ¾ÝÉÏÎĵķÖÎö¿ÉÖª £¬³ß¶ÈÓû§ÊÇÎÞ·¨ÔÚϵͳĿ¼Öд´½¨ÎļþµÄ £¬°Ñ¶Ë¿ÚÉèÖÃΪϵͳĿ¼ÏµÄÎļþ»áµ¼ÖÂPortIsValid¼ì²â²»µ½Ö¸±êÎļþ £¬´Ó¶øÅж¨ÒªÉèÖõĶ˿ڳ¤¶Ì·¨µÄ¡£Òò¶ø £¬ÔÚ²¹¶¡½¨¸´ºó £¬³ß¶ÈÓû§Ôö³¤´òÓ¡¶Ë¿ÚΪϵͳĿ¼ÏÂÎļþµÄ´òÓ¡»ú¾Í»áʼÖÕʧ°Ü £¬´Ó¶øÔ¤·ÀÁËϵͳ³ÁÆôʱ¸´Ô­¶ñÒâµÄ´òÓ¡·þÎñ¡£


4.½¨¸´½¨Òé


ÓÉÓڸ÷ì϶ÄÜÓ°Ïì¶à¶àµÄWindowsϵͳ°æ±¾ £¬²¢ÇÒÄܹ»Ôڳ߶ÈÓû§ÏÂÌáÒé·ì϶¹¥»÷ £¬½¨ÒéÊÜÓ°ÏìµÄÓû§ÊµÊ±½øÐÐϵͳ¸üлò×°Ö÷ì϶²¹¶¡¡£


´Ë±í £¬Î¢ÈíµÄ°²È«¸üÐÂÖ»ÊǶԴòÓ¡¶Ë¿ÚAPI½øÐÐÁ˸üÑϸñµÄУÑé¡£µ«ÊÇ £¬ÈôÊǶñÒâÎļþ¶Ë¿ÚÔÚ·ì϶½¨¸´Ç°ÒѾ­´´½¨ £¬Ôò·ì϶¹¥»÷ÏÖʵÒѾ­ÉúЧ £¬´Ëʱ½øÐÐϵͳ¸üÐÂÒÀÈ»ÊDz»°²È«µÄ¡£½¨ÒéÓû§ÏÈʹÓÃPowerShellºÅÁîGet-PrinterPortÀ´²é³­ÏµÍ³ÖÐÊÇ·ñ´æÔÚ¿ÉÒɵĴòÓ¡»ú¶Ë¿Ú £¬ÔÚɾ³ý¿ÉÒɶ˿ںóÔÙÖ´ÐÐϵͳ¸üС£


²Î¿¼Á´½Ó£º

[1]https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1048

[2]https://docs.microsoft.com/en-us/windows/win32/printdocs/addport

[3]https://docs.microsoft.com/en-us/previous-versions/ff564255(v%3dvs.85)

[4]https://windows-internals.com/printdemon-cve-2020-1048/