ÄÄÇ»ÅÍ ¾ð¾î¿¡¼ ¸¹Àº Ãâ·Â ·çƾµéÀº »ý¼ºµÇ´Â Æ÷¸ËÀ» Á¦¾îÇÏ´Â ¸Å°³º¯¼ö¸¦ °®°í ÀÖ´Ù. C ¿¡¼ °¡Àå ¸í¹éÇÑ ¿¹´Â printf(), sprintf(), fprintf() µîÀ» Æ÷ÇÔÇÑ printf() ·çƾ °è¿µé·Î ´Ù¸¥ ¿¹´Â ½Ã½ºÅÛ ·Î±× Á¤º¸ ÀÛ¼º syslog() ¿Í ÇÁ·Î¼¼½º ½Äº°ÀÚ Á¤º¸¸¦ Ç¥½ÃÇϴµ¥ »ç¿ëµÇ´Â ¹®ÀÚ¿ ¼³Á¤ setproctitle() ÀÌ´Ù. ``err" ¶Ç´Â ``warn" À¸·Î ½ÃÀÛÇϰųª ``log" ¸¦ Æ÷ÇÔÇϰųª ¶Ç´Â "printf" ·Î ³¡³ª´Â À̸§À» °®´Â ¸¹Àº ÇÔ¼öµéÀº °í·ÁÇÒ¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Ù. ÆÄÀ̽㿡´Â ¹®ÀÚ¿¿¡ ´ëÇØ ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î Æ÷¸ËÆÃÀ» Á¦¾îÇÏ´Â "%" ¿¬»êÀÌ ÀÖ´Ù. ¸¹Àº ÇÁ·Î±×·¥µé°ú ¶óÀ̺귯¸®µéÀº ´ë°³ ³»Àå ·çÆ¾ È£Ãâ ¹× Ãß°¡ÀûÀÎ ÇÁ·Î¼¼½Ì (¿¹, glib ÀÇ g_snprintf() ·çƾ) À» ÇÔÀ¸·Î½á Æ÷¸ËÆÃ ÇÔ¼öµéÀ» Á¤ÀÇÇÑ´Ù.
¶æ¹Û¿¡µµ ¸¹Àº »ç¶÷µéÀº ÀÌ·¯ÇÑ Æ÷¸ËÆÃ ´É·ÂÀÇ Á߿伺À» Àذí ÀÖÀ¸¸ç ½Å·ÚµÇÁö ¾ÊÀº »ç¿ëÀÚµé·ÎºÎÅÍÀÇ µ¥ÀÌŸ¸¦ Æ÷¸ËÆÃ ¸Å°³º¯¼ö·Î »ç¿ëÇϰí ÀÖ´Â °Í °°´Ù. ½Å·ÚµÇÁö ¾ÊÀº »ç¿ëÀڷκÎÅÍÀÇ ÇÊÅ͸µµÇÁö ¾ÊÀº µ¥ÀÌŸ¸¦ Æ÷¸Ë ¸Å°³º¯¼ö·Î Àý´ë·Î »ç¿ëÇÏÁö ¸¶¶ó. ¾Æ¸¶µµ ÀÌ´Â ´ÙÀ½ ¿¹¿¡¼ °¡Àå Àß º¼ ¼ö ÀÖ´Ù:
/* À߸øµÈ ¹æ½Ä: */ printf(string_from_untrusted_user); /* ¿ÇÀº ¹æ½Ä: */ printf("%s", string_from_untrusted_user); /* ¾ÈÀüÇÏ´Ù */ fputs(string_from_untrusted_user); /* ´Ü¼ø ¹®ÀÚ¿ÀÇ °æ¿ì ´õ¿í ÁÁ´Ù */ |
±×·¸Áö ¾ÊÀ¸¸é °ø°ÝÀÚ´Â Æ÷¸ËÆÃ ¹®ÀÚ¿À» ÁÖÀDZí°Ô ¼±ÅÃÇÔÀ¸·Î½á ¸ðµç Á¾·ùÀÇ ¾Ç¿µÇâÀ» ÀÏÀ¸Å³ ¼ö Àִµ¥ C ¿¡¼ printf() ÀÇ °æ¿ì°¡ ÁÁÀº ¿¹ÀÌ´Ù. printf() ¿¡¼ »ç¿ëÀÚ Á¦¾î Æ÷¸Ë ¹®ÀÚ¿À» ¾î¶»°Ôµç ¾Ç¿ëÇÏ´Â ¸¹Àº ¹æ¹ýµéÀÌ Àִµ¥ À̵é·Î´Â ±ä Æ÷¸ËÆÃ ¹®ÀÚ¿ »ý¼º¿¡ ÀÇÇÑ ¹öÆÛ ¿À¹ö·± (ÀÌ´Â °ø°ÝÀÚ·Î ÇÏ¿©±Ý ÇÁ·Î±×·¥À» ¿ÏÀüÈ÷ Á¦¾îÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù), Àü´ÞµÇÁö ¾ÊÀº ¸Å°³º¯¼ö¸¦ »ç¿ëÇÏ´Â º¯È¯ ¼±¾ð (¿¹±âÄ¡ ¾ÊÀº µ¥ÀÌŸ¸¦ »ðÀÔ½ÃŲ´Ù) °ú ÀüÇô ¿¹»óÄ¡ ¸øÇÑ °á°ú°ªµéÀ» »êÃâÇÏ´Â Æ÷¸Ë »ý¼ºÇϱâ (°¡·É À§ÇèÇÑ µ¥ÀÌŸ¸¦ ¾Õ ¶Ç´Â µÚ¿¡ µ¡ºÙÀÓÀ¸·Î½á °¡´ÉÇѵ¥ ÃßÈÄ »ç¿ë½Ã ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù) µéÀÌ ÀÖ´Ù. ƯÈ÷ ³Ã³ÇÑ °æ¿ì´Â printf ÀÇ "%n" º¯È¯ ¼±¾ðÀ¸·Î ÀÌ´Â Áö±Ý±îÁö ÀÛ¼ºµÈ ¹®ÀÚµéÀÇ ¼ö¸¦ Æ÷ÀÎÅÍ Àμö³»·Î ¾²´Âµ¥ °ø°ÝÀÚ´Â À̸¦ ¾Ç¿ëÇÏ¿© ÀμâÇÒ °ªÀ» °ãÃľµ ¼ö ÀÖ´Ù. °ø°ÝÀÚ´Â ½ÇÁ¦·Î Àü´ÞµÇÁö ¾Ê´Â ¸Å°³º¯¼ö¸¦ ÁöÁ¤ÇÒ ¼ö Àֱ⠶§¹®¿¡ °ÅÀÇ ÀÓÀÇÀÇ À§Ä¡¿¡ ¾ðÁ¦³ª °ãÃľµ ¼ö ÀÖ´Ù. ¸¹Àº ³í¹®µéÀº ÀÌ·¯ÇÑ °ø°ÝµéÀ» ´õ¿í ÀÚ¼¼ÇÏ°Ô ³íÀÇÇϴµ¥ ¿¹¸¦ µé¾î Avoiding security holes when developing an application - Part 4: format strings¸¦ º¸¶ó.
¸¹Àº °æ¿ì °á°úµéÀº »ç¿ëÀÚ¿¡°Ô µÇµ¹·ÁÁö±â ¶§¹®¿¡ ÀÌ °ø°ÝÀº ½ºÅÿ¡ ´ëÇÑ ³»ºÎ Á¤º¸¸¦ µå·¯³»´Âµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ Á¤º¸´Â ÃßÈÄ StackGuard ¿Í °°Àº ½ºÅà º¸È£ ½Ã½ºÅÛÀ» ¶Õ´Âµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù; StackGuard ´Â °ø°ÝÀ» ŽÁöÇϱâ À§ÇØ »ó¼ö ``canary" °ªµéÀ» »ç¿ëÇϴµ¥ ½ºÅÃÀÇ ³»¿ëµéÀÌ Ç¥½ÃµÈ´Ù¸é canary ÀÇ ÇöÀç °ªÀÌ ³ëÃâµÇ¾î °ø°Ý¿¡ Ãë¾àÇÒ °ÍÀÌ´Ù.
Æ÷¸ËÆÃ ¹®ÀÚ¿Àº ±¹Á¦È¿¡ ´ëÇÑ °Ë»ö (look) À» ±¸ÇöÇϱâ À§ÇÑ ÇÔ¼ö È£Ãâ (gettext's _() ¸¦ ÅëÇØ) À» µÉ ¼ö ÀÖ´Â ÇÑ Æ÷ÇÔÇÏ¿© °ÅÀÇ ¾ðÁ¦³ª »ó¼ö ¹®ÀÚ¿ÀÌ¿©¾ß ÇÑ´Ù. ÀÌ °Ë»öÀº ÇÁ·Î±×·¥ÀÌ Á¦¾îÇÏ´Â °ªµé·Î ÇÑÁ¤µÇ¾î¾ß ÇÔÀ» ÁÖ¸ñÇØ¶ó, Áï »ç¿ëÀÚ´Â ÇÁ·Î±×·¥ÀÌ Á¦¾îÇÏ´Â ¸Þ½ÃÁö ÆÄÀϵé·ÎºÎÅ͸¸ ¼±ÅÃÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. »ç¿ëÀÚ µ¥ÀÌŸ¸¦ »ç¿ëÇϱâ Àü¿¡ À̸¦ ÇÊÅ͸µÇÏ´Â °Í ([A-Za-z0-9] ¿Í °°Àº Æ÷¸Ë ¹®ÀÚ¿¿¡ ´ëÇØ ÇÕ¹ýÀûÀÎ ¹®ÀÚµéÀ» ¿°ÅÇÏ´Â ÇÊÅ͸¦ ¼³°èÇÔÀ¸·Î½á) Àº °¡´ÉÇÏÁö¸¸ º¸Åë »ó¼ö Æ÷¸Ë ¹®ÀÚ¿ ¶Ç´Â fput() À» ´ë½Å »ç¿ëÇÔÀ¸·Î½á ¹®Á¦¸¦ ´Ü¼øÈ÷ ¿¹¹æÇÏ´Â °ÍÀÌ ÀϹÝÀûÀ¸·Î ´õ¿í ÁÁ´Ù. ÀúÀÚ´Â À̸¦ "Ãâ·Â" ¹®Á¦·Î ¿°ÅÇßÁö¸¸ Ãâ·Â ·çƾµéÀÌ ÆÄÀÏ¿¡ ÀúÀåÇϰųª ¶Ç´Â snprintf() ¸¦ ÅëÇØ ±×¿Í °°Àº ³»ºÎ »óŸ¦ »ý¼ºÇÒ ¼öµµ Àֱ⠶§¹®¿¡ ÀÌ´Â Ãâ·ÂÀü¿¡ ÇÁ·Î±×·¥¿¡ ³»ºÎÀûÀ¸·Î ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Ù.
º¸¾È ¹®Á¦¸¦ ¾ß±âÇÏ´Â ÀÔ·Â Æ÷¸ËÆÃ ¹®Á¦´Â »ç¿ëµÇ°í ÀÖÁö ¾ÊÀº °¡´É¼ºÀº ¾Æ´Ñµ¥ ÀÌ ¾àÁ¡À» ÀÌ¿ëÇØ ¾Ç¿ëÇÑ ¿¹¸¦ CERT Advisory CA 2000-13 ¿¡¼ º¸¶ó. ÀÌ·¯ÇÑ ¹®Á¦°¡ ¾î¶»°Ô ¾Ç¿ëµÉ ¼ö ÀÖ´Â Áö¿¡ ´ëÇÑ ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸´Â Bugtraq ÀÇ 2000³â 6¿ù 18ÀÏ ÆÇ¿¡ ÃâÆÇµÈ Pascal Bouchareine ÀÇ "[Paper] Format bugs" ¶ó´Â À̸ÞÀÏ ±â»ç¸¦ º¸¶ó. 2000³â 12¿ù ÇöÀç gcc ÄÄÆÄÀÏ·¯ °³¹ß ¹öÀüÀº °³¹ßÀÚ°¡ ÀÌ·¯ÇÑ ¹®Á¦µéÀ» ÇÇÇÒ ¼ö ÀÖµµ·Ï ºñº¸¾ÈÀûÀÎ Æ÷¸Ë ¹®ÀÚ¿ »ç¿ë¿¡ ´ëÇØ °æ°í ¸Þ½ÃÁö¸¦ Áö¿øÇϰí ÀÖ´Ù.
¹°·Ð ÀÌ ¸ðµÎ´Â ±¹Á¦È °Ë»öÀÌ ½ÇÁ¦ º¸¾ÈÀûÀÎÁö ¾Æ´ÑÁö¿¡ ´ëÇÑ ³íÁ¡À» ±³¹¦È÷ ÇÇÇÏ´Â °ÍÀε¥ °¢ÀÚÀÇ ±¹Á¦È °Ë»ö ·çƾµéÀ» ÀÛ¼ºÇÏ·Á¸é ¹Ýµå½Ã ½Å·ÚµÇÁö ¾ÊÀº »ç¿ëÀÚ´Â ´ÜÁö ÇÕ¹ýÀûÀÎ ·ÎÄÉÀϸ¸ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç ÀÓÀÇÀÇ °æ·Î¿Í °°Àº °ÍµéÀ» ÁöÁ¤ÇÒ ¼ö ¾øµµ·Ï ÇØ¶ó.
ºÐ¸íÈ÷ °¢ÀÚ´Â ±¹Á¦È¸¦ ÅëÇØ »ý¼ºµÈ ¹®ÀÚ¿À» ¹ÏÀ» ¼ö ÀÖ´Â ¹®ÀÚ¿·Î Á¦ÇÑÇÏ±æ ¿øÇϴµ¥ ±×·¸Áö ¾Ê´Ù¸é °ø°ÝÀÚ´Â ÀÌ ´É·ÂÀ» »ç¿ëÇØ Æ÷¸Ë ¹®ÀÚ¿¿¡¼ÀÇ ¾àÁ¡, ƯÈ÷ C/C++ ÇÁ·Î±×·¥¿¡¼ÀÇ ¾àÁ¡À» ¾Ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â Bugtraq ³»ÀÇ ÀïÁ¡À̾ú´Âµ¥ (2000³â 6¿ù 26 ÀÏ ¿Ã·ÁÁø John Levon ÀÇ Bugtraq °Ô½Ã¹°À» º¸¶ó) ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸¸¦ À§Çؼ´Â 4.7.3Àý ¿¡¼ ÇÕ¹ýÀûÀÎ ¾ð¾î °ªµé¸¸À» »ç¿ëÀÚ°¡ ¼±ÅÃÇϵµ·Ï Çã¿ëÇÏ´Â °Í¿¡ ´ëÇÑ ³íÀǸ¦ º¸¶ó.
½ÇÁ¦·Î ÇÁ·Î±×·¡¹Ö ¹ö±×ÀÏÁö¶óµµ ´Ù¸¥ ±¹°¡µéÀº ´Ù¸¥ ¹æ½ÄÀ¸·Î ¼ýÀÚµéÀ» Ç¥½ÃÇÑ´Ù°í ¾ð±ÞÇÏ´Â °ÍÀº °¡Ä¡°¡ Àִµ¥ ƯÈ÷ ¸¶Ä§Ç¥ (.) ¿Í ½°Ç¥ (,) ¸ðµÎ ¼Ò¼öºÎ·ÎºÎÅÍ Á¤¼ö¸¦ ºÐ¸®Çϱâ À§ÇØ »ç¿ëµÇ°í ÀÖ´Ù. µ¥ÀÌŸ¸¦ ÀúÀå ¶Ç´Â ÀûÀçÇÏ·Á¸é ¹Ýµå½Ã »ç¿ë ·ÎÄÉÀÏÀÌ µ¥ÀÌŸ 󸮸¦ °£¼·ÇÏÁö ¾Êµµ·Ï ÇÒ Çʿ䰡 ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ÀúÀåµÈ µ¥ÀÌŸ¿Í °Ë»öµÈ µ¥ÀÌŸ°¡ ´Ù¸¥ ºÐ¸®ÀÚ¸¦ »ç¿ëÇÒ °ÍÀ̱⠶§¹®¿¡ ÇÁ¶û½º¾î »ç¿ëÀÚ¿Í ¿µ¾î »ç¿ëÀÚ°¡ µ¥ÀÌŸ¸¦ ±³È¯ÇÒ ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù. À̰ÍÀÌ º¸¾È ¹®Á¦·Î »ç¿ëµÇ°í ÀÖ´Â Áö´Â ¸ð¸£Áö¸¸ »ó»óÇÒ ¼ö ÀÖ´Â ÀÏÀÌ´Ù.