¾ÈÀüÇÑ ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®

¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß½Ã º¸¾È¹®Á¦ ÇÇÇϱâ

¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß½Ã º¸¾È¹®Á¦ ÇÇÇϱâ

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 7¿ù 26ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º

차례
1절. ¼Ò°³
2절. ±ÇÇÑ(SUID) °ü·Ã
2.1절. SUID ¿¹Á¦ ÇÁ·Î±×·¥
2.2절. SUIDÀÇ ¹®Á¦Á¡
3절. ¿ÜºÎ ¸í·É¾îÀÇ ½ÇÇà
3.1절. À§ÇèÇÑ system()ÇÔ¼öÀÇ »ç¿ë
3.2절. system()ÇÔ¼öÀÇ ¹®Á¦ ÇØ°á

1절. ¼Ò°³

ÀÌ ¹®¼­´Â Avoiding security holes when developing an application¸¦ linuxfocusÀÇ ¹®¼­¸¦ Âü°í Çß´Ù.

ÄÄÇ»ÅͽýºÅÛÀ» ¿î¿µÇϴµ¥ À־ ÇöÀç °¡Àå Áß¿äÇÑ À̽´´Â º¸¾È¹®Á¦ÀÏ °ÍÀÌ´Ù. º¸¾È ¹®Á¦°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â Çã¶ôÇÏÁö ¾ÊÀº »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» Á¢±ÙÇÏ·Á´Âµ¥¿¡¼­ ¹ß»ýÇÏ°Ô µÈ´Ù. ÀÌ»óÀûÀ¸·Î º¸ÀÚ¸é ¿î¿µÃ¼Á¦°¡ ¿Ïº®ÇÏ°í ±× ¿î¿µÃ¼Á¦ÇÏ¿¡¼­ µ¹¾Æ°¡´Â ¼ÒÇÁÆ®¿þ¾î¿¡ ¾î¶°ÇÑ °áÇÔµµ Á¸Àç ÇÏÁö ¾Ê´Â´Ù¸é º¸¾È¹®Á¦°¡ ¹ß»ýÇÒ ¾î¶°ÇÑ ÀÌÀ¯µµ ¾ø°ÚÁö¸¸, ¾ÈŸ±õ°Ôµµ ¿ÏÀüÇÑ ¿î¿µÃ¼Á¦¿Í ¿ÏÀüÇÑ ÇÁ·Î±×·¥Àº Á¸ÀçÇÏÁö ¾Ê´Â´Ù. (¿î¿µÃ¼Á¦ ¿ª½Ã ÇÁ·Î±×·¥ÀÇ ÀÏÁ¾ÀÌ´Ù) ÀÌ·± ÀÌÀ¯·Î ƯÁ¤ ÇÁ·Î±×·¥ÀÇ °áÇÔÀ» ã¾Æ¼­ ¹ß»ý°¡´ÉÇÑ º¸¾È¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â ±â¼úÀº ¸Å¿ì Áß¿äÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸ÓÀÇ °æ¿ì °¡´ÉÇÑÇÑ ÀÌ·¯ÇÑ °áÇÔÀÌ ¹ß»ýÇÏÁö ¾Êµµ·Ï ¾î¶² "±ÔÄ¢"À» °¡Áö°í ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ßÇÑ´Ù.

º¸¾È¹®Á¦¿¡ ¾à°£ÀÇ °ü½ÉÀ» °¡Áö°í ÀÖ´Ù¸é, °ÅÀÇ ¸ÅÀÏ º¸¾È°áÇÔÀÌ ¹ß»ýÇÑ ÇÁ·Î±×·¥°ú ÀÌ·¯ÇÑ °áÇÔÀÌ ½Ã½ºÅÛ¿¡ ¹ÌÄ¡´Â ¿µÇâ ÀÌ·¯ÇÑ °áÇÕÀ» Á¦°ÅÇϱâ À§ÇÑ ÆÐÄ¡°¡ ¹ßÇ¥µÇ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ º¸¾È °áÇÔÀ» º¸¸é ÇÁ·Î±×·¡¸ÓÀÇ »ç¼ÒÇÑ ºÎÁÖÀÇ¿Í À߸øµÈ ÄÚµù ½À°üµî¿¡ ±âÀÎÇÑ Á¡ÀÌ ¸¹À¸¸ç ¾à°£ÀÇ ÇнÀÀ» ÅëÇØ¼­ ¸¹Àº ¼öÀÇ °áÇÔÀ» ÁÙÀÏ ¼ö ÀÖ´Ù.

À̹ø ¹®¼­¿¡¼­´Â ÀÏ¹Ý ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀÛ¼º¿¡¼­ ¹ß»ýÇϱ⠽¬¿î ¹®Á¦Áß ±ÇÇÑ(privileges)°ú °ü·ÃµÈ ³»¿ë°ú ¿ÜºÎ ¸í·É¾î ½ÇÇà¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸µµ·Ï ÇϰڴÙ.


2절. ±ÇÇÑ(SUID) °ü·Ã

Unix½Ã½ºÅÛÀÇ °æ¿ì ¸ðµç À¯Àú°¡ µ¿ÀÏÇÏ°Ô Ãë±ÞµÇÁö ¾ÊÀ¸¸ç, °íÀ¯ÀÇ ±ÇÇÑÀ» °¡Áö¸ç ÇØ´ç ±ÇÇѳ»¿¡¼­ Çൿ¿¡ Á¦¾àÀ» ¹Þ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ÇൿÀº ÆÄÀÏÀ» »èÁ¦Çϰí, ¿Å±â°í, ÆíÁýÇϰųª ½Ã½ºÅÛ¼³Á¤À» ¹Ù²Ù´Â µîÀÇ ÀÛ¾÷ÀÌ µÈ´Ù. ¸¶Ä¡ ¿µÈ­ ¸ÞÆ®¸¯½º¿¡¼­ ¿ä¿ø ½º¹Ì½ºÀÇ ÇൿÀÌ ¸ÞÆ®¸¯½º³»¿¡¼­ Á¦ÇÑÀ» ¹Þ´Â °Í°ú °°´Ù.

Unix½Ã½ºÅÛ¿¡ µî·ÏµÈ ¸ðµç À¯Àú´Â yundream, yungum°ú °°Àº ÀÚ½ÅÀÇ À̸§À» °¡Áø´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ¹®ÀÚ¿­·Î µÈ À¯ÀúÀ̸§Àº Àΰ£ÁöÇâÀûÀ̱ä ÇÏÁö¸¸ ÄÄÇ»ÅÍ ÀÔÀå¿¡¼­ ºÃÀ»¶§´Â »ç¿ëÇϱⰡ ±×¸® ÁÁÁö ¾Ê´Ù. ±×·¡¼­ À̸§°ú ¸ÊÇεǴ intÇüÀÇ (À¯ÀÏÇÑ)°íÀ¯¹øÈ£¸¦ ÇÒ´çÇÑ´Ù. ÀÌ·¯ÇÑ °íÀ¯ ¹øÈ£¸¦ UID(User Identifier)¶ó°í ÇÑ´Ù. À̵é À¯ÀúÁ¤º¸´Â /etc/passwd ÆÄÀÏ¿¡ ÀúÀåµÈ´Ù.

ÀÌÁß UID 0À» °¡Áö´Â À¯Àú°¡ Àִµ¥ À̸¦ rootÀ¯Àú¶ó°í ÇÏ¸ç ½Ã½ºÅÛ¿¡ ´ëÇÏ¿© Ưº°ÇÑ ±ÇÇÑÀ» °¡Áö¸ç ¾î¶°ÇÑ Á¦Çѵµ °¡ÁöÁö ¾Ê´Â´Ù. rootÀ¯Àú´Â ¸ðµç ÆÄÀÏ¿¡ ´ëÇØ¼­ "Àбâ", "¾²±â", "½ÇÇà"ÀÇ ¿ÏÀüÇÑ ±ÇÇÑÀ» °¡Áö¸ç ÀåÄ¡¿¡ ´ëÇØ¼­µµ ÀÏüÀÇ ±ÇÇÑ - ¸¶¿îÆ®, ¾ð¸¶¿îÆ®, ÀÌ´õ³Ý Ä«µåÀÇ ÁÖ¼ÒÇÒ´çµî°ú °°Àº - ºÎ¿© ¹Þ´Â´Ù. À̿ܿ¡µµ ¿î¿µÃ¼Á¦ÀÇ ¿î¿µ°ú °ü·ÃµÈ (¹°¸®Àû, ½º¿Ò)¸Þ¸ð¸®¿¡ ´ëÇÑ Á¶Á¤, °¢ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ¿ì¼±±ÇºÎ¿©, ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ½Ã±×³Î ¹ß»ýµîÀÇ ÀÓ¹«¸¦ ¼öÇàÇÒ ¼öµµ ÀÖ´Ù. ÇѸ¶µð·Î ¸ðµçÀÏÀ» ÇÒ ¼ö Àִ Ư¼öÇÑ À¯Àú¶ó°í º¸¸é µÈ´Ù.

ÀÏ´Ü À¯Àú°¡ ½Ã½ºÅÛ¿¡ ·Î±×ÀÎ Çϸé À¯Àú´Â °¢Á¾ ¸í·É¾îµéÀ» ÅëÇØ¼­ ¿©·¯°¡Áö ÀÛ¾÷À» ¼öÇàÇÏ°Ô µÈ´Ù. À̶§ ÀÌµé ¸í·É¾îÀÇ ¼öÇà¹üÀ§´Â ½ÇÇàµÈ À¯ÀúÀÇ ±ÇÇÑ¿¡ µû¶ó¼­ º¯ÇÏ°Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¹Ç·Î½á ÀÚ½ÅÀÇ ±ÇÇÑ ¹Û¿¡ ÀÖ´Â ÀÛ¾÷(´Ù¸¥ À¯ÀúÀÇ ÆÄÀÏ »èÁ¦¿Í °°Àº)À» ¼öÇàÇϰíÀÚ ÇÏ´õ¶óµµ ±ÇÇѹ®Á¦·Î ¿øÇÏ´Â ÀÛ¾÷À» ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ÀÌ·¸°Ô À¯Àúº°·Î ±ÇÇÑÀ» µÒÀ¸·Î½á ¿©·¯¸íÀÌ µ¿½Ã¿¡ ÀÛ¾÷ÇÏ´Â À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ÀÚ½ÅÀÇ ¿µ¿ªÀ» ħ¹ü¹ÞÁö ¾Ê°í ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ´Ù.

작은 정보: ÀüÅëÀûÀ¸·Î À¯´Ð½º ½Ã½ºÅÛÀº ½´ÆÛÀ¯Àú¿Í ÀϹÝÀ¯ÀúÀÇ µÎ°³¿µ¿ªÀ¸·Î ±ÇÇÑÀÌ ±¸ºÐµÇ¾î Áø´Ù. ½´ÆÛÀ¯Àú ¿Ü¿¡´Â ¸ðµÎ ÀϹÝÀ¯Àú´Ù.

ÀÌ·¸°Ô ÀÚ½ÅÀÇ À¯Àú±ÇÇÑÀ» ÅëÇØ¼­ ÀÛ¾÷À» ÇÏ°Ô µÇ¾ú´Âµ¥, ¶§¶§·Î ´Ù¸¥ À¯ÀúÀÇ ±ÇÇÑÀ¸·Î ÀÛ¾÷À» ÇØ¾ß Çϰųª ȤÀº ½´ÆÛÀ¯Àú±ÇÇÑÀÇ ÀÛ¾÷À» ÇØ¾ßµÉ °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ÀÌ·²°æ¿ì ¿ì¸®´Â su¿Í °°Àº ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ¼­ ½ºÀ§Äª À¯Àú(switching user)ÇÏ°Ô µÈ´Ù.

¾ð¶æ su¸¦ ÀÌ¿ëÇØ¼­ ½ºÀ§Äª À¯ÀúÇÏ´Â °ÍÀº ´ÜÁö ¿Ã¹Ù¸¥ ÆÐ½º¿öµå¸¦ ÀÔ·ÂÇÏ´Â Á¤µµ·Î ³¡³¯ °ÍÀ¸·Î »ý°¢ µÉ ¼ö ÀÖÁö¸¸ ½ÇÀº ±×¸® °£´ÜÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. ±âº»ÀûÀ¸·Î ¾ÖÇø®ÄÉÀ̼ÇÀÇ ½ÇÇà±ÇÇÑÀº ½ÇÇà½ÃŲ À¯Àú¿¡ µû¶ó Á¦ÇÑ µÇ¹Ç·Î ÀϹÝÀ¯Àú°¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇà ½ÃÄ×À» °æ¿ì °áÄÚ ´Ù¸¥ À¯ÀúÀÇ ±ÇÇÑÀ» ȹµæÇÒ ¼ö ¾ø°ÔµÈ´Ù. ´ç¿¬È÷ su¸¦ ½ÇÇà ½ÃŰ°í ÆÐ½º¿öµå¸¦ ¿Ã¹Ù¸£°Ô ÀÔ·ÂÇß´Ù°í ÇØ¼­ ´Ù¸¥ À¯Àú ±ÇÇÑÀ» ¾òÀ» ¼ö ÀÖ°Ô µÇ´Â °Ç ¾Æ´Ï´Ù.

ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ À¯´Ð½º´Â Àá½Ã µ¿¾È "Àӽ÷Î"´Ù¸¥ À¯Àú ±ÇÇÑÀ¸·Î ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¼ö ÀÖµµ·Ï ½ÇÇàÆÄÀÏÀÇ ±ÇÇÑÀ» Á¶Á¤ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù. ³»°¡ ºñ·Ï su¸¦ ÀϹÝÀ¯Àú ±ÇÇÑÀ¸·Î ½ÇÇà½ÃÄ×´Ù°í ÇÏ´õ¶óµµ ½´ÆÛÀ¯Àú°¡ su¸¦ ½ÇÇà½ÃŲ°Í°ú °°Àº È¿°ú(effect)¸¦ ÁÖµµ·Ï ¾ÖÇø®ÄÉÀ̼ÇÀÇ ½ÇÇà±ÇÇÑÀ» Á¶Á¤ÇØ ÁÙ ¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. ÀÌ·¯ÇÑ ±ÇÇÑÀ» Effectiv UID¶ó°í ÇÑ´Ù. ls¸¦ ÅëÇØ¼­ suÀÇ ±ÇÇÑÀ» È®ÀÎÇØ º¸ÀÚ

[root@localhost /root]# ls -al /bin/su
-rwsr-xr-x    1 root     root        14112  1¿ù 16  2001 /bin/su
		
¼ÒÀ¯ÀÚ ±ÇÇÑ¿¡ 's'°¡ º¸ÀÏ °ÍÀÌ´Ù. ÀÌ´Â ÀϹÝÀ¯Àú°¡ su ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´õ¶óµµ ÇÁ·Î±×·¥ÀÇ ¼ÒÀ¯ÀÚÀÎ rootÀÇ ±ÇÇÑÀ¸·Î ÀÛ¾÷À» ÇÒ ¼ö ÀÖÀ»À» ÀǹÌÇÑ´Ù. ÀÌ 's'°¡ ¼³Á¤µÇ´Â ºñÆ®¸¦ Set-UIDȤÀº ÁÙ¿©¼­ SUID¶ó°í ÇÑ´Ù.

±×·³ SUIDÀÇ Å×½ºÆ®¸¦ À§Çؼ­ °£´ÜÇÑ ÇÁ·Î±×·¥À» Çϳª ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.


2.1절. SUID ¿¹Á¦ ÇÁ·Î±×·¥

¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº °£ÀÌ suÇÁ·Î±×·¥ÀÌ´Ù À̸§Àº jsu·Î ÇϰڴÙ. ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº setuid(2)¸¦ ÀÌ¿ëÇØ¼­ ½´ÆÛÀ¯Àú ±ÇÇÑÀÇ È¹µæÀ» ½ÃµµÇϰí execl(3)À» ÀÌ¿ëÇØ¼­ ½©À» ½ÇÇà ½ÃŲ´Ù. ÄÚµå´Â °£´ÜÇϹǷΠ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½Å ÇÏ´Ù·Ï ÇÑ´Ù.

¿¹Á¦ : jsu.c

#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        printf("Usage : jsu [username]\n");
        return 1;
    }


    if (setuid(0) != 0)
    {
        perror("setuid error : ");
        exit(0);
    }
    execl("/bin/sh", "sh", NULL);

    return 0;
}
			
À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑ µÚ ¹Ù·Î ½ÇÇàÇÏ¸é ºÐ¸í setuid(2)È£ÃâÀÌ ½ÇÆÐÇß´Ù´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϸç ÇÁ·Î±×·¥ÀÌ Á¾·á µÉ°ÍÀÌ´Ù(ÀϹݰèÁ¤À¸·Î Å×½ºÆ® Çϱ⠹ٶõ´Ù). ÀÏ¹Ý °èÁ¤À¸·Î ´Ù¸¥ °èÁ¤±ÇÇÑÀ» ¾òÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°á Çϱâ À§Çؼ­ jsuÇÁ·Î±×·¥¿¡ ´ÙÀ½°ú °°ÀÌ USIDºñÆ®¸¦ ¼³Á¤ÇÏ¸é µÈ´Ù.
[root@localhost test]# chmod +s jsu
			
ÀÌÁ¦ ¼º°øÀûÀ¸·Î ´Ù¸¥ À¯Àú·Î º¯°æµÊÀ» È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. id¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÅÀÇ ±ÇÇÑ Á¤º¸¸¦ È®ÀÎÇØº¸µµ·Ï ÇÏÀÚ.
[yundream@test test]$ ./jsu 
sh-2.04# id
uid=0(root) gid=500 groups=500
			
uid°¡ 0(½´ÆÛÀ¯Àú)·Î ¼º°øÀûÀ¸·Î ¼¼ÆÃµÇ¾î ÀÖÀ½À» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. À̶§ gid¿Í groups°ü·Ã Á¤º¸°¡ Á¦´ë·Î ³ª¿ÀÁö ¾Ê´Âµ¥ ÀÌÀ¯´Â jsuÇÁ·Î±×·¥ÀÌ ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. Á»´õ su¿Í ºñ½ÁÇÏ°Ô ÀÛµ¿Çϵµ·Ï Çϱâ À§Çؼ­´Â gid¿Í ±× ¹Û¿¡ ¸î °¡Áö ´õ ½Å°æ½á¾ß ÇÒ ºÎºÐµéÀÌ Àִµ¥, ¿©±â¿¡¼­´Â »ý·«Çϵµ·Ï ÇϰڴÙ.


2.2절. SUIDÀÇ ¹®Á¦Á¡

À§ ÇÁ·Î±×·¥Àº Ä¡¸íÀûÀÎ ´ÜÁ¡À» °¡Áö°í ÀÖ´Ù. ±×°ÍÀº SUID°¡ Àû¿ëµÈ ½´ÆÛÀ¯Àú ¼ÒÀ¯ÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇà½Ãų °æ¿ì ¾Æ¹«·± Á¦Àç »çÇ× ¾øÀÌ ½´ÆÛÀ¯ÀúÀÇ ±ÇÇÑÀ» ¾òÀ» ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¹°·Ð ÀÌ·¯ÇÑ ¹®Á¦ÀÇ °æ¿ì ÇØ´ç ±ÇÇÑÀ» ¾ò±â À§Çؼ­ su¿Í °°ÀÌ ÆÐ½º¿öµå ÀÔ·Â °úÁ¤À» °ÅÄ¡°Ô ÇѴٰųª ½´ÆÛÀ¯Àú·Î ÀÛµ¿ÇÏ´Â Äڵ带 ÃÖ¼ÒÈ­ÇÏ´Â ¹æ¹ýµîÀ» »ç¿ëÇϱâ´Â ÇÏÁö¸¸ SUIDÀÚü°¡ ¸Å¿ì ½Ã½ºÅÛ °ü¸®Àû Ãø¸é¿¡¼­ ¸Å¿ì À§ÇèÇÒ ¼ö ÀÖ´Ù.

±×·¡¼­ ½Ã½ºÅÛ °ü¸®ÀÚ´Â SUID°¡ ÀÖ´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­ ¸Å¿ì ¹Î°¨ÇÏ°Ô ¹ÝÀÀÇÏ¸ç ¸¹Àº °æ¿ì cronµîÀ» ÅëÇØ¼­ SUIDÀÇ ÇÁ·Î±×·¥ÀÌ ÀÖ´ÂÁö Áö¼ÓÀûÀ¸·Î È®ÀÎÇÑ´Ù. ½Ã½ºÅÛÀÌ ´©±º°¡ÀÇ Ä§ÀÔÀ» ¹ÞÀº ÈçÀûÀÌ ÀÖÀ» °æ¿ì SUID°Ë»ç´Â Çʼö ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù.

[root@localhost /bin]# find ./ -type f -perm +4000
./ping
./mount
./umount
./su
			
À§´Â ÇÊÀÚÀÇ ½Ã½ºÅÛ(Linux Kernel 2.4.x)¿¡¼­ /bin µð·ºÅ丮 ¹Ø¿¡ SUID¼³Á¤µÈ ÇÁ·Î±×·¥À» ãÀº °á°úÀÌ´Ù.

±×·¯³ª ÀÌ·¯ÇÑ ¹®Á¦Á¡¿¡µµ ºÒ±¸Çϰí su, ping°ú °°ÀÌ ¹Ýµå½Ã ÇÊ¿äÇÑ °æ¿ìµµ ÀÖÀ¸¹Ç·Î °¡´ÉÇϸé SUID¸¦ »ç¿ëÇÏÁö ¾Êµµ·Ï Çϸé ÇÊ¿äÇÒ °æ¿ì ÃÖ´ëÇÑ ¾ÈÀüÇÏ°Ô ÄÚµùÇϵµ·Ï ÇØ¾ßÇÑ´Ù.

작은 정보: ping°°Àº °æ¿ì RAW¼ÒÄÏ¿¡ Á¢±ÙÇØ¾ß Çϴµ¥, ÀÌ·² °æ¿ì ½´ÆÛÀ¯Àú ±ÇÇÑÀ» ÇÊ¿ä·Î ÇÑ´Ù. ±×·¯³ª ÀÌ·¸°Ô µÉ°æ¿ì ping¸¦ »ç¿ëÇÒ ¶§ ¸¶´Ù root·Î ½ºÀ§Äª À¯Àú ÇØ¾ß Çϴµ¥ ÀÌ·± ´Ü¼øÇÑ ÀÛ¾÷À» À§Çؼ­´Â ³Ê¹« ¹ø°Å·Î¿î °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù. SUID¸¦ ÇØ°áÇÏ¸é °£´ÜÇÏ°Ô ¹ø°Å·Î¿òÀ» ÇØ°áÇÒ ¼ö ÀÖ´Ù.

¾ÈÀüÇÑ ÄÚµùÀ» À§ÇÑ ÀϹÝÀûÀÎ ¹æ¹ýÀº setuid()¸¦ ÅëÇØ¼­ ½´ÆÛ À¯Àú ±ÇÇÑÀ» ¾ò¾ú´Ù¸é ½´ÆÛÀ¯Àú ±ÇÇÑÀÌ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ ÀÛ¾÷À» ³¡³»°í °ð¹Ù·Î setuid()¸¦ ÀÌ¿ëÇØ¼­ ¿ø·¡ÀÇ À¯Àú±ÇÇÑÀ¸·Î ȸ±ÍÇϵµ·Ï ÄÚµùÇÏ´Â °ÍÀÌ´Ù.
int main()
{
   ... 
   int myuid;
   myuid = getuid(); // ÇöÀç À¯ÀúÀÇ uid¸¦ ÀúÀå
   setuid(0);        // ½´ÆÛÀ¯Àú ±ÇÇÑÀ» ¾ò´Â´Ù.
   ...               // ÃÖ¼ÒÇÑÀÇ ÇÊ¿äÇÑ ÀÛ¾÷¸¸À» ÇÑ´Ù.
   ...
   setuid(myuid);    // ¿ø·¡ À¯Àú±ÇÇÑÀ¸·Î µÇµ¹¾Æ ¿Â´Ù. 
}
			
´õ¿í ¾ÈÀüÇÑ ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀ» ¿øÇÑ´Ù¸é setuid()¸¦ È£ÃâÇϱâ Àü¿¡ ÇØ´ç À¯Àú¿¡ ´ëÇÑ ÆÐ½º¿öµå¸¦ üũÇÏ´Â Äڵ带 Ãß°¡ÇÏ¸é µÉ °ÍÀÌ´Ù.

½Ã°£ÀÌ µÈ´Ù¸é À§ÀÇ ¿¹Á¦¸¦ ÆÐ½º¿öµå üũ°¡ °¡´ÉÇϵµ·Ï º¯°æÇØ º¸±â ¹Ù¶õ´Ù.


3절. ¿ÜºÎ ¸í·É¾îÀÇ ½ÇÇà

ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù º¸¸é Á¾Á¾ ¿ÜºÎÀÇ ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ¾ß ÇÒ °æ¿ì°¡ ¹ß»ýÇÑ´Ù. °¡Àå ÈçÇÑ ¿¹´Â ÇÁ·Î±×·¥³»¿¡¼­ ¸ÞÀÏÀ» Àü¼ÛÇϱâ À§Çؼ­ ¿ÜºÎ ÇÁ·Î±×·¥ÀÎ mailÀ» ½ÇÇàÇÏ´Â °æ¿ì°¡ µÉ °ÍÀÌ´Ù. ÀÌ·² °æ¿ì °¡Àå À¯¿ëÇÏ°Ô »ç¿ëÇÏ´Â ÇÔ¼ö´Â system(3)ÇÔ¼ö ÀÌ´Ù.

#include <stdlib.h>

int system (const char *string);
		


3.1절. À§ÇèÇÑ system()ÇÔ¼öÀÇ »ç¿ë

system()ÇÔ¼öÀÇ ±Ùº»ÀûÀÎ ¹®Á¦Á¡Àº ¿ÜºÎ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۱â À§Çؼ­ ½©À» »ç¿ëÇϴµ¥ ½©ÀÌ È¯°æº¯¼öÀÇ ¿µÇâÀ» Å©°Ô ¹Þ´Â ´Ù´Â Á¡ÀÌ´Ù. ¿¹¸¦µé¾î ¿ì¸®°¡ system()ÇÔ¼ö¸¦ È£ÃâÇÏ¿© mailÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é system()ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î »ç¿ëÀÚ ½©À» È£ÃâÇÏ¿©¼­ ÀÎÀÚ·Î mailÀ» ½ÇÇà½ÃŲ´Ù. ÇöÀç »ç¿ëÀÚ ½©ÀÌ bash¶ó°í ÇÑ´Ù¸é system("mail yundrema < test.c");´Â sh -c mail yundream < test.c ¿Í °°Àº ¹æ½ÄÀ¸·Î È£ÃâµÈ´Ù.

¾ð¶æ º¸±â¿£ º°·Î ¹®Á¦°¡ µÉ°Í °°Áö ¾ÊÁö¸¸ ¾à°£ÀÇ Æí¹ýÀ» ÀÌ¿ëÇÏ¸é ¾î·ÆÁö ¾Ê°Ô mailÇÁ·Î±×·¥ ´ë½Å ÀÚ½ÅÀÌ ÀÛ¼ºÇÑ ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۵µ·Ï ÇÒ ¼ö ÀÖ´Ù. ½©¿¡¼­ ½ÇÇà½Ãų ÇÁ·Î±×·¥ÀÇ Ã£±â °æ·Î´Â ȯ°æº¯¼ö PATHÀÇ °æ·Î¸¦ µû¸£°Ô µÈ´Ù. ¸¸¾à ȯ°æº¯¼ö PATHÀÇ °ªÀ» ¾à°£¸¸ ¹Ù²Ù°Ô µÈ´Ù¸é, ¿ø·¡ ½ÇÇàµÇ¾î¾ßÇÏ´Â mailÇÁ·Î±×·¥ ´ë½Å ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇµµ·Ï º¯°æÇÒ ¼ö ÀÖ´Ù. ¿øÇÏ´Â ÇÁ·Î±×·¥ ´ë½Å ¾û¶×ÇÑ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¼ö ÀÖ´Ù´Â ÀÚü°¡ Å«¹®Á¦ÀÏ »Ó´õ·¯ ¸¸¾à ÇÁ·Î±×·¥ÀÌ SUID»óÅ¿¡¼­ ½ÇÇàµÈ´Ù¸é ½É°¢ÇÑ º¸¾È ¹®Á¦¸¦ ¹ß»ý ½Ãų ¼öµµ ÀÖ´Ù.

system()ÇÔ¼öÀÇ »ç¿ëÀÌ Á¤¸» À§ÇèÇÑÁö È®ÀÎÇØ º¸±â À§Çؼ­ °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î Å×½ºÆ® ÇØº¸µµ·Ï ÇϰڴÙ. ÀϹÝÀûÀ¸·Î cdromÀ» ¸¶¿îÆ® ½Ã۱â À§Çؼ­´Â ½´ÆÛÀ¯Àú ±ÇÇÑÀÌ ÇÊ¿ä·Î Çϴµ¥ ÁÖ·Î ÀϹÝÀ¯Àú¸¦ ÅëÇØ¼­ ¸®´ª½º¿¡ Á¢±ÙÇØ¼­ ÀÛ¾÷À» ÇÑ´Ù¸é ¸¶¿îÆ® ½Ã۱â À§Çؼ­ ½ºÀ§Äª À¯ÀúÇÏ´Â°Ô ¹ø°Å·Î¿î ÀÛ¾÷ÀÌ µÉ ¼öµµ ÀÖ´Ù. ±×·¡¼­ SUID¼³Á¤À» ÇØ¼­ ÀÏ¹Ý À¯Àúµµ °£´ÜÇÑ mountÀÛ¾÷Àº º°µµÀÇ ½ºÀ§Äª À¯Àú°úÁ¤À» °ÅÄ¡Áö ¾Êµµ·Ï ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µéµµ·Ï ÇϰڴÙ.

¿¹Á¦ : cdmount.c

#include <stdio.h>
#include <stdlib.h>

int
main (void)
{
    int myuid;
    myuid = getuid();

	// ½´ÆÛÀ¯Àú ±ÇÇÑÀ» ¾òµµ·Ï ÇÑ´Ù. 
    setuid(0);
    if (system ("mount /dev/cdrom") != 0)
        perror ("system");
	else
		printf("cdrom mount success\n");
	// ¿ø·¡ ±ÇÇÑÀ¸·Î µÇµ¹¸°´Ù.
    setuid(myuid);
    return (0);
}
			
ÀÌ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ½ÃŲ ´ÙÀ½ SUID±ÇÇÑÀ» ÁÖµµ·Ï ÇÑ´Ù.
[root@localhost test]# chmod +s cdmount
[root@localhost test]# ls -al cdmount
-rwsr-sr-x    1 root     root        11706  7¿ù 31 11:09 cdmount
			
ÀÏ¹Ý À¯Àú·Î Å×½ºÆ® ÇØº¸¸é À§ ÇÁ·Î±×·¥Àº ¼º°øÀûÀ¸·Î ½ÇÇà µÉ °ÍÀÌ´Ù.

±×·¯³ª ¸»ÇßµíÀÌ À§ ÇÁ·Î±×·¥Àº Ä¡¸íÀûÀÎ ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. system¿¡¼­ ½ÇÇà½Ãų ÇÁ·Î±×·¥À» ãÀ»¶§ ½©ÀÇ È¯°æº¯¼ö PATHÀÇ °æ·ÎµéÀ» ÀÌ¿ëÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ Á¡À» ÀÌ¿ëÇϸé ÀϹÝÀ¯Àú ±ÇÇÑÀ¸·Î À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄ×À»¶§ root ½©ÀÌ ¶ßµµ·Ï ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº °£´ÜÇÑ ½©ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ½© ÇÁ·Î±×·¥ÀÇ À̸§Àº mountÀÌ´Ù. ÀϹÝÀ¯ÀúÀÎ yundreamÀ¸·Î Á¢±ÙÇØ¼­ ´ÙÀ½ÀÇ ½©À» ÀÛ¼ºÇϵµ·Ï ÇÏÀÚ.

#!/bin/sh
/bin/sh < /dev/tty
			
ÀÌÁ¦ ÇöÀç µð·ºÅ丮¿¡¼­ ½ÇÇà ÇÁ·Î±×·¥À» ãµµ·Ï ȯ°æº¯¼ö PATH¸¦ º¯°æÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é cdmountÇÁ·Î±×·¥À» ½ÇÇà ½ÃÄ×À»¶§ ¿ì¸®°¡ ¸¸µç ½© ÇÁ·Î±×·¥ÀÌ ´ë½Å ½ÇÇàµÈ´Ù. ÀÌ ½© ÇÁ·Î±×·¥Àº ½´ÆÛÀ¯Àú ±ÇÇÑÀ¸·Î ½ÇÇàÀÌ µÊÀ¸·Î ¿ì¸®´Â °£´ÜÇÏ°Ô root ½©À» ¾ò°Ô µÈ´Ù.
[yundream@test test]$ export PATH=.  
[yundream@test test]$ chmod +x mount
[yundream@test test]$ ./cdmount 
sh-2.04# 
sh-2.04# /usr/bin/whoami 
root
sh-2.04# 

			


3.2절. system()ÇÔ¼öÀÇ ¹®Á¦ ÇØ°á

»ç¿ëÇÒ ¼ö ÀÖ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº system()ÇÔ¼ö¿¡ ½ÇÇà½Ãų ¸í·É¾î¸¦ ÀÔ·ÂÇÒ¶§ PATHȯ°æº¯¼öÀÇ ¿µÇâÀ» ¹ÞÁö ¾Êµµ·Ï ¿ÏÀüÇÑ µð·ºÅ丮 °æ·Î¸¦ ÀÔ·ÂÇÏ´Â °ÍÀÌ´Ù.

if (system ("/bin/mount /dev/cdrom") != 0)
    perror ("system");
			

¾à°£ Äڵ尡 ±æ¾îÁöÁö¸¸ system()ÇÔ¼ö ´ë½Å execl()°è¿­ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.

pid_t pid;
int   status;

if ((pid = fork()) < 0) 
{
    perror("fork");
    return (-1);
}
if (pid == 0) 
{
    /* ÀÚ½Ä ÇÁ·Î¼¼½º */
    execl ("/bin/mount", "mount", "/dev/cdrom", NULL);
    perror ("execl");
    exit (-1);
}
/* ºÎ¸ð ÇÁ·Î¼¼½º */
waitpid (pid, & status, 0);
if ((! WIFEXITED (status)) || (WEXITSTATUS (status) != 0)) 
{
    perror ("Printing");
    return (-1);
}
			

À§ÀÇ ¹æ¹ýÀ» µ¿¿øÇßÀ» °æ¿ì system()ÇÔ¼öÀÇ ¹®Á¦¸¦ ÇÇÇØ°¥ ¼ö ÀÖ±ä ÇÏÁö¸¸ ÇѰ¡Áö ¹®Á¦Á¡ÀÌ ¹ß»ýÇÑ´Ù. ±×°ÍÀº system()¿¡¼­ ½ÇÇà½ÃŰ´Â ÇÁ·Î±×·¥ÀÌ ¹Ýµå½Ã ÁöÁ¤µÈ °æ·Î¿¡ ÀÖÀ» °Å¶ó°í Àå´ãÇÒ ¼ö°¡ ¾ø´Ù´Â Á¡ÀÌ´Ù. mountÀÇ °æ¿ì /bin¿¡ ÀÖÀ» ¼öµµ ÀÖÁö¸¸ /sbin, /usr/bin, /usr/sbin µîÀÇ µð·ºÅ丮¿¡ ÀÖÀ» ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.

ÀÌ ¹®Á¦´Â setenvÀ» ÅëÇØ¼­ ÇÁ·Î±×·¥ ³»ºÎÀûÀ¸·Î PATH°æ·Î¸¦ °­Á¦·Î ÁöÁ¤ÇÏ´Â ¹æ½ÄÀ¸·Î ÇØ°á °¡´ÉÇÏ´Ù.

setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin", 1)
			

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.