Ãë¾àÁ¡ ´ëÀÀ¹æ¾È...»ç¿ëÀÚ ÀÔ·Â °ª °ËÁõ µî ¾ÛÀÇ Àü¹ÝÀûÀÎ º¸¾È »óÅ °È°¡ Áß¿ä
[º¸¾È´º½º ±è¿µ¸í ±âÀÚ] Prototype-Pollution(ÇÁ·ÎÅäŸÀÔ ¿À¿° °ø°Ý)Àº ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ ÇÁ·ÎÅäŸÀÔ ±â¹Ý »ó¼Ó ¸ðµ¨¿¡ ÀÇÇØ ¹ß»ýÇϸç, °ø°ÝÀÚ°¡ Àü¿ª °´Ã¼ ÇÁ·ÎÅäŸÀÔ¿¡ ÀÓÀÇÀÇ ¼Ó¼º°ú ¸Þ¼µå¸¦ µµÀÔÇϰųª ¼öÁ¤ÇÒ ¼ö ÀÖ´Â Ãë¾àÁ¡ÀÌ´Ù. µû¶ó¼ Prototype-PollutionÀÇ °³³ä ÀÌÇØ´Â ÀÚ¹Ù½ºÅ©¸³Æ® ¾Û º¸¾ÈÀÇ ±âº»À» ÀÌÇØÇÏ´Â °ÍÀ¸·Î º¼ ¼ö ÀÖ´Ù.
¡ãPrototype-Pollution °ø°Ý È帧µµ[Ãâó=portswigger]
À̱۷çÄÚÆÛ·¹À̼ÇÀº ÃÖ±Ù Prototype-Pollution Ãë¾àÁ¡À» ÀÌ¿ëÇÑ °ø°Ý»ç·Ê ºÐ¼® ¹× ´ëÀÀ¹æ¾ÈÀ» ¹ßÇ¥Çß´Ù. Prototype-PollutionÀº µ¶¸³Çü Ãë¾àÁ¡À¸·Î ¾Ç¿ëµÈ »ç·Ê´Â ÀûÁö¸¸ À̸¦ ÅëÇØ °ø°ÝÀÚ°¡ Á¢±ÙºÒ°¡´ÉÇÑ °³Ã¼ÀÇ ¼Ó¼ºÀ» Á¦¾îÇÒ ¼ö ÀÖ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÌ °ø°ÝÀÚ°¡ Á¦¾îÇÏ´Â ¼Ó¼ºÀ» ¾ÈÀüÇÏÁö ¾Ê°Ô ó¸®ÇÏ´Â °æ¿ì ´Ù¸¥ Ãë¾àÁ¡°ú ¿¬°áµÉ °¡´É¼ºÀÌ ÀÖ´Ù. Ŭ¶óÀ̾ðÆ® Ãø¿¡¼´Â ÁÖ·Î DOM XSS·Î ¹ßÇöµÇ¸ç, ¼¹ö Ãø¿¡¼´Â ¿ø°ÝÄÚµå ½ÇÇà(RCE)À¸·Î À̾îÁú ¼öµµ ÀÖ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ® ¾ÖÇø®ÄÉÀ̼ÇÀÌ °è¼Ó º¹ÀâÇØÁö¸é¼ Prototype-PollutionÀÇ °¡´É¼ºÀº ¿©ÀüÈ÷ Áß¿äÇÑ ¿ì·Á»çÇ×ÀÌ µÇ°í ÀÖ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®´Â °´Ã¼ ÁöÇâ ¾ð¾î·Î »ó¼Ó ±â´ÉÀÌ Á¸ÀçÇÑ´Ù. ¡®class¡¯ÀÇ °³³äÀ¸·Î »ó¼ÓÀ» ±¸ÇöÇϴ Ÿ ¾ð¾î¿Í´Â ´Ù¸£°Ô ¡®class¡¯ÀÇ °³³äÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ÀÚ¹Ù½ºÅ©¸³Æ®´Â »ó¼ÓÀÇ °³³äÀ» ÇÁ·ÎÅäŸÀÔÀ» ÀÌ¿ëÇØ ±¸ÇöÇÑ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â °´Ã¼ÀÇ ¿øÇüÀÎ ÇÁ·ÎÅäŸÀÔÀ» ÀÌ¿ëÇØ »õ·Î¿î °´Ã¼¸¦ ¸¸µé°Ô µÇ´Âµ¥ »õ·Ó°Ô »ý¼ºµÈ °´Ã¼µµ ¶Ç ´Ù¸¥ °´Ã¼ÀÇ ¿øÇüÀÌ µÉ ¼ö ÀÖ´Ù. À̸¦ ÇÁ·ÎÅäŸÀÔ Ã¼ÀÎ(prototype chain)À̶ó ºÎ¸£¸ç ÇÁ·ÎÅäŸÀÔ Ã¼ÀÎÀ» ÅëÇØ °´Ã¼°¡ ¾î¶°ÇÑ ¼Ó¼º¿¡ Á¢±ÙÇÏ°íÀÚ ÇÒ ¶§ ±× °´Ã¼ÀÇ ¼Ó¼º»Ó¸¸ ¾Æ´Ï¶ó °´Ã¼ÀÇ ÇÁ·ÎÅäŸÀÔÀ¸·Î À̵¿ÇÏ¸ç ¼Ó¼ºÀ» Ž»öÇÑ´Ù. ÇÁ·ÎÅäŸÀÔ °´Ã¼´Â »ý¼ºÀÚ ÇÔ¼öÀÇ ÇÁ·ÎÅäŸÀÔ ÇÁ·ÎÆÛƼ(prototype property)¿¡ ÇÒ´çÇØ Á¤ÀǵǸç Á¤ÀÇµÈ ÇÁ·ÎÅäŸÀÔ °´Ã¼¿¡ ¸Þ¼µå³ª ÇÁ·ÎÆÛƼ¸¦ Ãß°¡Çϸé, ÇØ´ç »ý¼ºÀÚ ÇÔ¼ö¸¦ ÅëÇØ »ý¼ºµÈ ¸ðµç °´Ã¼°¡ À̸¦ »ó¼ÓÇÏ°Ô µÈ´Ù.
¡ãÇÁ·ÎÅäŸÀÔ Ã¼ÀÎ ÀÌÇظ¦ À§ÇÑ ¿¹Á¦ ÄÚµåÀÇ ½Ã°¢ÈÇÑ ¸ð½À[ÀÚ·á=À̱۷çÄÚÆÛ·¹À̼Ç]
ÇÁ·ÎÅäŸÀÔ Ã¼ÀÎÀÇ ¿¹Á¦Äڵ忡 Æ÷ÇÔµÈ myCat °´Ã¼´Â Cat »ý¼ºÀÚ ÇÔ¼öÀÇ ÀνºÅϽºÀ̱⠶§¹®¿¡ ¸ÕÀú Cat.prototypeÀ» È®ÀÎÇϴµ¥, ¸¸¾à ÇØ´ç ¸Þ¼µå³ª ¼Ó¼ºÀ» ãÁö ¸øÇϸé Cat.prototypeÀÇ ÇÁ·ÎÅäŸÀÔÀÎ Animal.prototype¿¡¼ °Ë»öÇÏ°Ô µÈ´Ù. À̾î myCat °´Ã¼´Â Cat »ý¼ºÀÚ ÇÔ¼ö¿Í Animal »ý¼ºÀÚ ÇÔ¼öÀÇ ÇÁ·ÎÅäŸÀÔ ¸Þ¼µå¸¦ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
Object ÇÁ·ÎÅäŸÀÔ¿¡´Â ¸¹Àº ¼Ó¼ºÀÌ Á¸ÀçÇÏÁö¸¸ ±× °¡¿îµ¥ ¡®constructor¡¯¿Í ¡®prototype¡¯, ¡®proto¡¯ ¼Ó¼ºÀ» »ìÆ캻´Ù. ¡®constructor¡¯´Â °´Ã¼ÀÇ »ý¼ºÀÚ ÇÔ¼ö¸¦ ÂüÁ¶ÇÏ´Â ¼Ó¼ºÀÌ´Ù. Ŭ·¡½º¸¦ »ç¿ëÇØ °´Ã¼¸¦ »ý¼ºÇÒ ¶§ ¡®constructor¡¯ ¼Ó¼ºÀÌ ÀÚµ¿À¸·Î ¼³Á¤µÇ°í, ÇØ´ç °´Ã¼ÀÇ ÇÁ·ÎÅäŸÀÔÀ» °¡¸®Å°´Â ¡®prototype¡¯ ¼Ó¼ºÀÌ ÇÁ·ÎÅäŸÀÔ Ã¼ÀÎÀ» »ç¿ëÇØ °ü¸®µÇ´Â °ÍÀÌ´Ù.
¡®proto¡¯´Â °´Ã¼ Ŭ·¡½ºÀÇ ¡®Prototype¡¯À» ¹ÝȯÇÏ´Â ¼Ó¼ºÀÌ´Ù. ¡®proto¡¯ ¼Ó¼ºÀº ÀÚ¹Ù½ºÅ©¸³Æ® ¾ð¾îÀÇ Ç¥ÁØÀº ¾Æ´ÏÁö¸¸ NodeJS ȯ°æ¿¡¼´Â Áö¿øÇÏ°í ÀÖ´Ù. ¡®proto¡¯ ¼Ó¼º¿¡ Á¢±ÙÇϰųª °ªÀ» ¼³Á¤ÇÒ °æ¿ì ÇÁ·ÎÅäŸÀÔ¿¡ ´ëÇÑ ¸í½ÃÀûÀÎ ÀÛ¾÷ÀÌ ¼öÇàµÈ´Ù.
»ç¿ëÀÚ Á¶ÀÛÀ¸·Î ÀϾ´Â Prototype-PollutionÀÇ ¿¹´Â Å©°Ô 3°¡Áö·Î ³ª´ ¼ö ÀÖ´Ù. ¸ÕÀú ¡®¾ÈÀüÇÏÁö ¾ÊÀº °´Ã¼ÀÇ Àç±Í º´ÇÕ¡¯¿¡¼ Àç±Í º´ÇÕ ÇÔ¼ö´Â »ç¿ëÀڷκÎÅÍÀÇ ÀÔ·ÂÀ̳ª ¿ÜºÎ µ¥ÀÌÅ͸¦ ¹Þ¾ÆµéÀÏ ¶§ ¾ÈÀüÇÏÁö ¾Ê°Ô ±¸ÇöµÇ¸é prototype-pollution¿¡ Ãë¾àÇØÁú °¡´É¼ºÀÌ Å©´Ù.
¡ã°´Ã¼ÀÇ Àç±Í º´ÇÕ ¾Ç¿ë »ç·Ê[ÀÚ·á=À̱۷çÄÚÆÛ·¹À̼Ç]
µÎ ¹ø°·Î ¡®°æ·Îº° ¼Ó¼º Á¤ÀÇ¡¯´Â ÁÖ¾îÁø °æ·Î¿¡ µû¶ó °´Ã¼ÀÇ ÇÁ·ÎÆÛƼ °ªÀ» ¼³Á¤ÇÏ´Â ÇÔ¼ö¿¡¼ »ç¿ëÀÚ°¡ Á¦¾îÇÒ ¼ö ÀÖ´Â ÀԷ¿¡ ´ëÇÑ °ËÁõÀÌ ÀûÀýÈ÷ ÀÌ·ïÁöÁö ¾ÊÀ» °æ¿ì »ç¿ëÀÚ°¡ ¡®proto¡¯ °æ·Î¸¦ ÀÓÀÇ·Î ÁöÁ¤ÇØ prototype-pollutionÀ» À¯µµÇÒ ¼ö ÀÖ´Ù.
¼¼ ¹ø°·Î ¡®°´Ã¼ º¹Á¦(clone())¡¯´Â °´Ã¼¸¦ º¹Á¦ÇÏ´Â ¿ªÇÒÀ» ÇÏ´Â clone ÇÔ¼ö¿Í ¿©·¯ °´Ã¼¸¦ º´ÇÕÇÏ´Â merge ÇÔ¼ö°¡ »ç¿ëÀÚ ÀԷ ó¸® ½Ã ÃæºÐÇÑ °ËÁõ ¾øÀÌ µ¿ÀÛÇÒ ¶§ ¾ÇÀÇÀûÀÎ »ç¿ëÀÚ°¡ ÀÔ·Â °ªÀ» Á¶ÀÛÇØ prototype-pollution °ø°ÝÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
Prototype-PollutionÀ» ÀÌ¿ëÇÑ °ø°Ý ½Ã³ª¸®¿À´Â CVE-2018-16487ÀÇ Ãë¾àÇÑ È¯°æ ±¸¼º¿¡¼ ãÀ» ¼ö ÀÖ´Ù. CVE-2018-16487´Â npm(node package manager)ÀÇ Àαâ ÀÖ´Â ¶óÀ̺귯¸®ÀÎ lodash¿¡¼ ¹ß°ßµÈ Ãë¾àÁ¡ÀÌ´Ù. lodash´Â ¹®ÀÚ¿, ¼ýÀÚ, ¹è¿, ÇÔ¼ö ¹× °³Ã¼ ÇÁ·Î±×·¡¹ÖÀ» ´Ü¼øÈÇØ ÇÁ·Î±×·¡¸Ó°¡ ÀÚ¹Ù½ºÅ©¸³Æ® Äڵ带 º¸´Ù È¿À²ÀûÀ¸·Î ÀÛ¼ºÇÏ°í À¯Áö¡¤°ü¸®Çϴµ¥ À¯¿ëÇÑ µµ±¸°¡ Æ÷ÇԵŠÀÖ¾î ¸¹Àº »ç¶÷µéÀÌ »ç¿ë ÁßÀÌ´Ù.
ÇÏÁö¸¸ ÀÌ Ãë¾àÁ¡Àº ¡®_.merge()¡¯ ÇÔ¼ö°¡ °´Ã¼ º´ÇÕ ½Ã ÀûÀýÇÑ °ËÁõÀ» ¼öÇàÇÏÁö ¾Ê¾Æ ¾ÇÀÇÀûÀÎ »ç¿ëÀÚ°¡ ¿¹»óÄ¡ ¸øÇÑ ¼Ó¼ºÀ» Ãß°¡Çϰųª ±âÁ¸ ¼Ó¼ºÀ» º¯°æÇÒ ¼ö ÀÖ´Â Ãë¾àÁ¡ÀÌ Á¸ÀçÇÑ´Ù. °ø°ÝÀÚ´Â ÀÌ Ãë¾àÁ¡À» È°¿ëÇØ ÀÀ¿ë ÇÁ·Î±×·¥ ³»¿¡ °³Ã¼ µ¿ÀÛ¿¡ µû¶ó ±ÇÇÑ »ó½Â ¶Ç´Â ÀáÀçÀûÀ¸·Î RCE °ø°ÝÀ» ÃÊ·¡ÇÒ ¼ö ÀÖ´Â °³Ã¼ ÇÁ·ÎÅäŸÀÔ ¼Ó¼ºÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
¡ãCVE-2018-16487 °ø°ÝÈ帧µµ[ÀÚ·á=À̱۷çÄÚÆÛ·¹À̼Ç]
Prototype-PollutionÀº Áß¿äÇÑ º¸¾È ¹®Á¦À̱⠶§¹®¿¡ ±â¼úÀû º¹À⼺À» ÀÌÇØÇÏ°í »çÀü ¿¹¹æÀû ¿ÏÈ Àü·«À» äÅÃÇØ °³¹ßÀÚ´Â ¾Ç¿ë À§ÇèÀ» Å©°Ô ÁÙÀÌ°í ¾ÖÇø®ÄÉÀ̼ÇÀÇ Àü¹ÝÀûÀÎ º¸¾È »óŸ¦ °ÈÇØ¾ß ÇÑ´Ù. À̸¦ À§ÇØ ¸ÕÀú ¡®»ç¿ëÀÚ ÀÔ·Â °ª °ËÁõ¡¯ÀÌ ÇÊ¿äÇÏ´Ù. »ç¿ëÀÚÀÇ ÀÔ·Â °ª °ËÁõÀ» ¼öÇàÇÏ·Á¸é »ç¿ëÀÚ·Î ÀԷ¹ÞÀº ÈÄ ÀÔ·ÂÀ» °ËÁõÇÏ´Â Äڵ带 Ãß°¡Çϰųª ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
´ÙÀ½À¸·Î ¡®Object.freeze()¡¯ ¸Þ¼µå¸¦ È°¿ëÇØ¾ß ÇÑ´Ù. Object.freeze() ¸Þ¼µå´Â °´Ã¼¸¦ µ¿°áÇØ ´õ ÀÌ»ó º¯°æÀÌ ºÒ°¡´ÉÇϵµ·Ï ÇÑ´Ù. µ¿°áµÈ °´Ã¼´Â »õ·Î¿î ¼Ó¼º Ãß°¡, Á¸ÀçÇÏ´Â ¼Ó¼ºÀ» Á¦°ÅÇÏ´Â °ÍÀ» ¹æÁöÇØ ¼Ó¼ºÀÇ ºÒº¯¼º°ú ÇÁ·ÎÅäŸÀÔÀÌ º¯°æµÇ´Â °ÍÀ» ¹æÁöÇÑ´Ù.
Object.create() ¸Þ¼µå´Â ÁöÁ¤µÈ ÇÁ·ÎÅäŸÀÔ °´Ã¼ ¹× ¼Ó¼ºÀ» °®´Â »õ °´Ã¼¸¦ ¸¸µç´Ù. À̶§ ÇÁ·ÎÅäŸÀÔÀÌ nullÀÎ °´Ã¼¸¦ »ý¼ºÇÒ °æ¿ì ±âº» ÇÁ·ÎÅäŸÀÔÀ» »ó¼Ó¹ÞÁö ¾Ê¾Æ ÇÁ·ÎÅäŸÀÔ Ã¼Àο¡¼ ¹þ¾î³ª°Ô µÈ´Ù.
¸¶Áö¸·À¸·Î npm(node package manager)´Â ¸ðµâÀ» ÃÖ½ÅÈÇϸé Prototype-Pollution µî º¸¾È À§Çù ¹× ¹ö±×¸¦ ¹æÁöÇÒ ¼ö ÀÖ´Ù. npm ¸ðµâÀÇ ÃֽŠ¹öÀüÀº ±êÇãºê ·¹Æ÷ÁöÅ丮, npm °ø½Ä À¥»çÀÌÆ®, ¶Ç´Â npm ¸í·É¾î¸¦ ÅëÇØ È®ÀÎÀÌ °¡´ÉÇÏ´Ù.
[±è¿µ¸í ±âÀÚ(boan@boannews.com)]
<ÀúÀÛ±ÇÀÚ: º¸¾È´º½º(www.boannews.com) ¹«´ÜÀüÀç-Àç¹èÆ÷±ÝÁö>