1day/¿øµ¥ÀÌ/ÇÏ·ç/ÀÏ¿ëÁ÷/È£½ºÆÃ/¼­¹öÈ£½ºÆÃ/ÀÚ·á½Ç/°­ÁÂ/Ä¿¹Â´ÏƼ
Be happy 1day
HOME
ȸ¿ø·Î±×ÀÎ
ID:
PW:

     0 ºÐ
     1 ºÐ
 
À¥È£½ºÆÃ
À¥È£½ºÆà ½Åû¹æ¹ý
¼­ºñ½ºÀÌ¿ë¾à°ü
½Åû¸®½ºÆ® *
ÀԱݸ®½ºÆ® *
°í°´Áö¿ø FAQ
¹®ÀÇÇϱâ
°í°´Áö¿ø
ÆÄÀÏÁú¶ó¼³Á¤(ftp)
pop3¶õ?
SMTP¶õ?
¾Æ¿ô·è¼¼Æùý
³×ÀÓ¼­¹ö
   1Â÷ : ns1.1day.co.kr
..........222.234.222.191
   2Â÷ : ns2.1day.co.kr
..........222.234.223.192
°èÁ¹øÈ£ ¾È³»
....¿ì¸®ÀºÇà(¿øµ¥ÀÌ)
....1005-902-808446
À̸ÞÀÏ ¹®ÀÇ
1day@1day.co.kr
ÀÚ·á½Ç/°­ÁÂ
HTML ű×
ÀÚ¹Ù½ºÅ©¸³Æ®°­ÁÂ
¸®´ª½º±âÃÊ°­ÁÂ
¸®´ª½ºÁß±Þ°­ÁÂ
 


¾ÈÀüÇÑ À¯´Ð½º ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Áöħ¼­ V.0.7
 1day  | 2004¡¤01¡¤30 09:42 | HIT : 40,218 | VOTE : 14,904 |

 

¾ÈÀüÇÑ À¯´Ð½º ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Áöħ¼­ V.0.7

 

2001. 1.
¹ÚÇö¹Ì/CERTCC-KR
hmpark@{certcc,kisa}.or.kr

½ÃÀÛÇϸ鼭

ÀÌ Áöħ¼­´Â ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» À§ÇÑ ÇÁ·Î±×·¡¸Ó°¡ ÁöÄѾßÇÒ ¼³°è¿Í ±¸Çö ¹æ¹ý¿¡´ëÇÑ Áöħ¼­·Î ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥°ú À¥ ¾îÇø®ÄÉÀ̼Ç(CGI), ³×Æ®¿öÅ© ¼­¹ö, setuid/setgid ÇÁ·Î±×·¥ µîÀÇ º¸¾È ¿µ¿ª(Security Boundary)¿¡ ´ëÇÏ¿© ¼³¸íÇÑ´Ù.

¶ÇÇÑ ÀÌ Áöħ¼­´Â ÇÁ·Î±×·¡¸Ó°¡ ½ÇÁ¦ ÇÁ·Î±×·¥À» °³¹ßÇϸ鼭 ÂüÁ¶ÇÒ ¼ö ÀÖ´Â ½Ç¿ëÀûÀÎ Áöħ¼­·Î ¸®´ª½º³ª À¯´Ð½º ½Ã½ºÅÛÀ» ±âº» ÅÛÇø´À¸·Î ÇÑ´Ù. ÀÌ Áöħ¼­¸¦ Àд µ¶ÀÚ´Â ±âº»ÀûÀÎ À¯´Ð½º ½Ã½ºÅÛÀÇ º¸¾È°ú C ¾ð¾î¿¡ ´ëÇÑ ÀÌÇØ°¡ ¿ä±¸µÇ¸ç ÀÌ Áöħ¼­ÀÇ ¸ñÇ¥°¡ ¾ÈÀüÇÑ ÇÁ·Î±×·¡¹Ö(Secure Programming)ÀÓÀ» ±â¾ïÇØ¾ß ÇÑ´Ù.

Áöħ¼­´Â °è¼Ó ¾÷µ¥ÀÌÆ®µÇ¸ç ¼öÁ¤Çϰųª Ãß°¡ÇÒ »çÇ×ÀÌ ÀÖÀ¸¸é ¾ðÁ¦µçÁö cert@certcc.or.krÀ̳ª hmpark@certcc.or.kr·Î ¿¬¶ôÁֱ⠹ٶõ´Ù.

¥°. ÇÁ·Î¼¼½º º¸¾È

À¯´Ð½º ½Ã½ºÅÛÀº À©µµ¿ì ½Ã½ºÅÛ°ú´Â ´Þ¸® ÆÄÀÏÀ̳ª ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» ¼³Á¤Çϴ Ưº°ÇÑ ¼Ó¼ºµéÀ» °¡Áö°í ÀÖ´Ù. ÀÌ·¯ÇÑ ¼Ó¼ºµéÀº ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϴµ¥ Á÷Á¢ÀûÀ¸·Î ¿µÇâÀ» ¹ÌÄ¡¹Ç·Î À¯´Ð½ºÀÇ ¼Ó¼º¿¡ ´ëÇÏ¿© ÀÌÇØÇÏ°í ÀÌ°ÍÀ» ¾ÈÀüÇÏ°Ô ÇÁ·Î±×·¥¿¡ ÀÛ¼ºÇÏ´Â °ÍÀÌ ÇÊ¿äÇÑ´Ù.

1. SUID/EUID º¸¾È

1.1 SUID¿Í EUID, SUID

(1) Real UID, effective UID¿Í saved UID

À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ÆÄÀÏ°ú ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» ³ªÅ¸³½ °ÍÀ¸·Î ´ÙÀ½°ú °°Àº ¼Ó¼ºÀÌ ÀÖ´Ù.

⼔ Real UID¿Í GID(RUID¿Í RGID)

ÇÁ·Î¼¼½º°¡ ½ÇÇàµÉ ¶§ »ç¿ëÀÚÀÇ ½ÇÁ¦ UID¿Í GID¸¦ ³ªÅ¸³»´Â ¿ë¾î·Î ƯÈ÷ RUID°¡ 0ÀÎ °ÍÀº ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ ¸ðµç ±ÇÇÑÀ» °¡Áø »ç¿ëÀÚ·Î root¶ó°í ÇÑ´Ù. root´Â ´ëºÎºÐÀÇ Áß¿äÇÑ º¸¾È »çÇ×À» üũÇÏ°í ¼öÁ¤ÇÏ°í ½Ã½ºÅÛÀ» °ü¸®ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ´Ù¸¥ RUIDº¸´Ù ´õ Å« ±ÇÇÑÀ» °¡Áö°í Àֱ⠶§¹®¿¡ º¸¾È»óÀ¸·Î Áß¿äÇÏ´Ù.

⼔ Effective UID¿Í GID(EUID¿Í EGID)

´©±¸ÀÇ ±ÇÇÑÀ¸·Î ÇÁ·Î¼¼½º°¡ ½ÇÇàÇϴ°¡¸¦ ³ªÅ¸³»´Â ¿ë¾î·Î ÀÌ°ÍÀº ÇÁ·Î¼¼½º°¡ ½ÇÇàµÉ ¶§ ´©±¸ÀÇ ±ÇÇÑÀ¸·Î ½ÇÇàµÇ´ÂÁö¸¦ ³ªÅ¸³»¹Ç·Î º¸¾È¿¡¼­ ƯÈ÷ ¹®Á¦°¡ µÇ´Â ºÎºÐÀÌ´Ù. /sbin/passwd ÇÁ·Î±×·¥Ã³·³ EUID°¡ root·Î ½ÇÇàµÉ °æ¿ì¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù.

⼔ Saved UID¿Í GID(SUID¿Í SGID)

ÇÁ·Î±×·¥¿¡ ÀÇÇØ º¯Çϱâ ÀüÀÇ UID¸¦ ³ªÅ¸³»´Â °ÍÀ¸·Î ±ÇÇÑ ±³È¯À» Çã¿ëÇÏ°í Çã¿ëÇÏÁö ¾ÊÀ½À» Áö¿øÇϱâ À§ÇÏ¿© »ç¿ëÇÑ´Ù.

(2) SUID¿Í SGID ÇÁ·Î±×·¥

ÇÁ·Î±×·¥µéÀÌ ÆÄÀÏ°ú ÇÁ·Î¼¼½ºµé¿¡ Á¢±ÙÇÏ´Â °ÍÀ» Çã¶ôÇÏ´Â °ÍÀ¸·Î setuid´Â »ç¿ëÀÚÀÇ ±ÇÇÑÀ» ÀÓ½ÃÀûÀ¸·Î ¹Ù²ãÁØ´Ù. Áï, ±ÇÇÑÀÌ ¾ø´Â »ç¿ëÀÚ°¡ Ưº°ÇÑ ±ÇÇÑÀ» ¿ä±¸ÇÏ´Â ÀÛ¾÷À» ÇؾßÇÒ °æ¿ì¿¡ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ Æ¯º°ÇÑ ±ÇÇÑÀº ÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàÇÏ´Â µ¿¾È¿¡¸¸ ¿µÇâÀ» ¹Þ°í ÇÁ·Î±×·¥ÀÌ ³¡³ª¸é ¿ø·¡ÀÇ »ç¿ëÀÚ ±ÇÇÑÀ¸·Î µ¹¾Æ¿À°Ô µÈ´Ù. SUID/SGID ÇÁ·Î±×·¥Àº setuid/setgid ºñÆ® s·Î Ç¥½ÃÇÑ´Ù.

(¿¹Á¦ 1) SUID/SGID ÇÁ·Î±×·¥ - Æнº¿öµå ÇÁ·Î±×·¥

Æнº¿öµå ÇÁ·Î±×·¥¿¡¼­ Æнº¿öµå ÆÄÀÏÀº root¸¸ÀÌ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·±µ¥ ÀÏ¹Ý »ç¿ëÀÚ°¡ ÀÚ½ÅÀÇ Æнº¿öµå¸¦ ¼öÁ¤Çϱâ À§Çؼ­´Â rootÀÇ ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ¶§ Æнº¿öµå ÇÁ·Î±×·¥À» SUID ÇÁ·Î±×·¥À¸·Î ÇÏ¿© ÀϹݻç¿ëÀÚµµ Àá½Ãµ¿¾È rootÀÇ ±ÇÇÑÀ» °¡Á® Æнº¿öµå ÆÄÀÏÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

[cert:root]:/user/staff> ls -la /etc/passwd

-rw-r--r-- 1 root sys 2657 10¿ù 5ÀÏ 14:08 /etc/passwd


[cert:root]:/user/staff> ls -la /bin/passwd

-r-sr-sr-x 3 root sys 96796 1997³â 7¿ù 16ÀÏ /bin/passwd*

1.2 SUID/SGID ÇÁ·Î±×·¥ÀÇ À§Ç輺

SUID ÇÁ·Î±×·¥Àº ½ÇÇàµÉ ¶§ ÇÁ·Î±×·¥ ¼ÒÀ¯ÀÚÀÇ ±ÇÇÑÀ¸·Î ¼öÇàµÇ¹Ç·Î Àß ¸ø »ç¿ëµÉ °æ¿ì¿¡ À§ÇèÇÒ ¼öµµ ÀÖ´Ù. /bin/shÀº ½©À» ½ÇÇàÇÏ´Â ÇÁ·Î±×·¥À¸·Î ÀϹÝÀûÀ¸·Î »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÏ¿´À» ¶§ ½ÇÇàµÇ¾î »ç¿ëÀÚ´Â ½© »ó¿¡¼­ À¯´Ð½º ¸í·É¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº setuid µÈ /bin/sh ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ» º¸¿©ÁÖ´Â ¿¹ÀÌ´Ù. óÀ½ »ç¿ëÀÚÀÇ ±ÇÇÑÀº ÀϹݻç¿ëÀÚ hmparkÀ» °¡ÁöÁö¸¸ setuid µÈ /bin/shÀ» ½ÇÇàÇÏ°í ³­ ÈÄ¿¡´Â /bin/shÀÇ ¼ÒÀ¯ÀÚÀÇ ±ÇÇÑÀÎ root·Î ½ÇÇàµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

[hmpark@linux80 ~]$ whoami

hmpark

[hmpark@linux80 ~]$ ls -la /bin/sh

-rwsr-xr-x 1 root root 378024 10¿ù 8 1999 /bin/sh*

[hmpark@linux80 ~]$ /bin/sh

[hmpark@linux80 hmpark]# id

uid=504(hmpark) gid=504(hmpark) euid=0(root) groups=504(hmpark)

[hmpark@linux80 hmpark]# whoami

root


À§¿¡¼­ º¸´Â ¹Ù¿Í °°ÀÌ setuid ºñÆ®°¡ ¼³Á¤µÇ¾î ÀÖ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàÇÏ´Â °æ¿ì ±× ÇÁ·Î¼¼½ºÀÇ UID´Â ½ÇÁ¦ ÆÄÀÏÀ» ½ÇÇàÇÏ´Â »ç¿ëÀÚÀÇ ±ÇÇÑÀ» °¡ÁöÁö¸¸ ÇÁ·Î¼¼½ºÀÇ EUID´Â setuid µÈ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ »ç¿ëÀÚÀÇ ±ÇÇÑÀ» °¡Áö´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.(uid=504(hmpark), euid=0(root)) Áï, À§ÀÇ /bin/shÀ̶ó´Â ÇÁ·Î¼¼½º´Â hmpark¶ó´Â UID¸¦ °¡ÁöÁö¸¸ EUID´Â /bin/shÀÇ ½ÇÁ¦ ¼ÒÀ¯ÀÚÀÇ ±ÇÇÑÀ» °¡Áö¹Ç·Î root°¡ µÇ´Â °ÍÀÌ´Ù. ±×·¡¼­ ÀÌ ½© ÇÁ·Î¼¼½º´Â rootÀÇ ±ÇÇÑÀ¸·Î ½ÇÇàµÈ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

À§¿Í °°Àº »óȲ¿¡¼­ SUID ÇÁ·Î±×·¥¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â À§Çù¿¡ ´ëÇÏ¿© »ý°¢ÇØ º¸¾Æ¾ß ÇÑ´Ù. root ±ÇÇÑÀ» °¡Áø ½©ÀÌ ½ÇÇàµÉ ¶§ ½©ÀÌ ³¡³»±â Àü±îÁö´Â root·Î setuidµÈ »óÅ°¡ °è¼ÓµÈ´Ù. À̶§ °ø°ÝÀÚ´Â root ±ÇÇÑÀ¸·Î ÇÒ ¼ö ÀÖ´Â ¸ðµç ÀÛ¾÷À» ÇÒ ¼ö Àֱ⠶§¹®¿¡ ½Ã½ºÅÛ¿¡ Ä¡¸íÀûÀÎ ÇÇÇظ¦ ÀÔÈú ¼öµµ ÀÖ´Ù.

1.3 ¾ÈÀüÇÑ SUID/SGID ÇÁ·Î±×·¥ ¿ø¸®

⼔ UID¿Í GID¸¦ °¡´ÉÇÑ Á¦ÇÑÇÑ´Ù.

setuid ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§ °¡´ÉÇÑ UID¿Í GID°¡ ³·Àº ±ÇÇÑÀ» °¡Áöµµ·Ï ÇØ¾ß ÇÑ´Ù. root·Î setuidµÈ ÇÁ·Î±×·¥ÀÌ Ä§¹ü ´çÇÏ¸é ¸ðµç ½Ã½ºÅÛÀ» Æı«ÇÒ °¡´É¼ºÀÌ ÀÖÁö¸¸ ÀÏ¹Ý »ç¿ëÀÚ·Î setuidµÈ ÇÁ·Î±×·¥Àº ÀÏ¹Ý »ç¿ëÀÚÀÇ ±ÇÇѸ¸À» ħ¹ü´çÇϹǷΠÇÇÇØ°¡ Àû±â ¶§¹®ÀÌ´Ù.

⼔ exec¸¦ È£ÃâÇϱâ Àü¿¡ effective UID¿Í GID¸¦ Àç ¼³Á¤ÇÑ´Ù.

ÀϹÝÀûÀ¸·Î popenÀ̳ª system°ú °°Àº ¶óÀ̺귯¸® ¼­ºê·çƾÀÌ ½ÇÇàµÉ ¶§ ³»ºÎÀûÀ¸·Î exec ÇÔ¼ö°¡ È£ÃâµÈ´Ù. ±×·±µ¥ ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸Ó´Â ÀÌ·¯ÇÑ »ç½ÇÀ» ÀνÄÇÏÁö ¸øÇÑä ±×³É ¼­ºê·çƾ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÌ setuid rootÀÎ ÇÁ·Î±×·¥À̶ó¸é ¿©±â¿¡¼­ ½ÇÇàµÇ´Â ½©µµ ±ÇÇÑÀÌ rootÀÎ ½©ÀÌ ½ÇÇàµÉ °ÍÀÌ´Ù. ±×·¯¹Ç·Î exec ÇÔ¼ö°¡ È£ÃâµÇ±â Àü¿¡ effective UID¿Í GID¸¦ Àç ¼³Á¤ÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù.

⼔ exec¸¦ È£ÃâÇϱâ Àü¿¡ ¸ðµç ÆÄÀÏ ±â¼úÀÚ¸¦ ´Ý´Â´Ù.

setuid ÇÁ·Î±×·¥ÀÌ Áß¿äÇÑ ÆÄÀÏÀ» ÀÐÀ» °æ¿ì¿¡ execµÈ ÇÁ·Î±×·¥µµ ±× Áß¿äÇÑ ÆÄÀÏÀ» ÀÐÀ» ¼ö°¡ ÀÖ´Ù. ±×·¯¹Ç·Î ÀÌ°ÍÀ» ¹æÁöÇϱâ À§Çؼ­´Â exec°¡ ¹ß»ýÇÒ ¶§¸¶´Ù Áß¿äÇÑ ÆÄÀÏÀ» ´Ýµµ·Ï ÇÏ´Â flag¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÀÌ flag´Â ÆÄÀÏÀÌ ¿­¸®ÀÚ¸¶ÀÚ Áï½Ã ¼³Á¤µÇ¾î¾ß ÇÑ´Ù.

Áï sfd°¡ Áß¿äÇÑ ÆÄÀÏÀÇ ±â¼úÀÚÀÎ °æ¿ì

fcntl(sfd, F_SETFD, 1)

ioctl(sfd, FIOCLEX, NULL)

ÀÇ ¸í·ÉµéÀº exec°¡ ½ÇÇàµÉ ¶§ ÆÄÀÏÀ» ´Ýµµ·Ï ÇÑ´Ù.

⼔ root°¡ È®½ÇÇÏ°Ô Á¦ÇѵǾîÀÖ´ÂÁö ´Ù½Ã È®ÀÎÇ϶ó.

chroot()´Â »õ·Î¿î ·çÆ® µð·ºÅ丮¸¦ ¼³Á¤ÇÏ¿© chrootµÈ ÇÁ·Î¼¼½º°¡ µð·ºÅ丮ÀÇ »óÀ§ µð·ºÅ丮¿¡ Á¢±ÙÇÒ ¼ö ¾ø°Ô ÇØÁÖ´Â ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù.

chroot("/usr/riacs")

ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¿µ¿ªÀ» ¹Ì¸® Á¦ÇÑÇÏ¿© ÆÄÀÏ ½Ã½ºÅÛÀÇ ÀÓÀÇÀÇ ÆÄÀÏÀ» Àаųª ¾µ ¼ö ÀÖ´Â ¹®Á¦Á¡¿¡ ´ëÇÑ º¸¾È ȯ°æÀ» Á¦°øÇØ ÁØ´Ù.

ln -s /usr/demo /usr/riacs/demo

±×·±µ¥ /usr/demo¸¦ /usr/riacs/demo¿¡ ¸µÅ©½ÃÅ°¸é Á¦ÇѵǾî ÀÖ´Â µð·ºÅ丮±îÁö ħ¹üÇÒ ¼ö ÀÖ´Â À§ÇèÀÌ ÀÖÀ¸¹Ç·Î ÁÖÀÇÇØ¾ß ÇÑ´Ù. Áï, À§ÀÇ ¸µÅ©¿¡¼­ /usr/riacs´Â "/"·Î Çؼ®µÇ±â ¶§¹®¿¡

cd /demo

cd ..

¸í·É ÈÄ¿¡ /usr µð·ºÅ丮¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ±×·¯¹Ç·Î chrootÇÏ¿© »ý±ä »õ·Î¿î ·çÆ® µð·ºÅ丮ÀÇ ¼­ºêµð·ºÅ丮¿¡¼­´Â ¸µÅ©µÈ µð·ºÅ丮¸¦ »ç¿ëÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù.

⼔ ½ÇÇàµÉ ÇÁ·Î¼¼½ºÀÇ È¯°æÀ» °Ë»çÇ϶ó.

¸¹Àº ȯ°æº¯¼öÀº ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ »ó¼ÓµÈ PATH³ª IFS, umask¿Í °°Àº º¯¼öµé¿¡ ÀÇÇØ Á¿ìµÈ´Ù.

⼔ ÃÖ¼ÒÇÑÀÇ ±ÇÇÑ ¿ø¸®

±ÇÇÑÀ» ÀϽÃÀûÀ¸·Î ³·Ã߰ųª ±ÇÇÑÀ» ¿ÏÀüÈ÷ Á¦°ÅÇÏ´Â °ÍÀº À߸øµÈ ±ÇÇÑ ¼³Á¤À¸·Î ÀÎÇÏ¿© ¹ß»ýÇÒ ¼ö ÀÖ´Â °áÁ¡À» ÃÖ¼ÒÈ­ ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ´Ù.

⼔ ¿ÜºÎÀÇ ÀԷ°ªÀ» ¹ÏÁö ¸»¾Æ¶ó.

¿ÜºÎ¿¡¼­ ÀÔ·ÂµÈ °ªÀº ÃæºÐÇÏ°Ô °Ë»çÇÏ°í ÇÊ¿ä¾ø´Â °ªµéÀ» Áö¿î ÈÄ¿¡ À¯È¿ÇÑ °ªÀ¸·Î Æò°¡µÇ¾úÀ» °æ¿ì¿¡ »ç¿ëÇϵµ·Ï ÇÑ´Ù.

2. »õ·Î¿î ÇÁ·Î¼¼½ºÀÇ »ý¼º º¸¾È

2.1 ÇÁ·Î¼¼½º ½ÇÇà½Ã À§Ç輺

»ý¼ºÇÑ ÇÁ·Î¼¼½º´Â exec °è¿­ ½Ã½ºÅÛ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© »õ·Î¿î ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°´Âµ¥ ƯÈ÷ system(), popen() ÇÔ¼ö´Â »õ·Î¿î ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§ setuid³ª ³×Æ®¿öÅ© ¼­ºñ½ºÃ³·³ Ưº°ÇÑ ±ÇÇÑÀ» ¿ä±¸ÇÏ´Â ÇÁ·Î±×·¥ÀÎ °æ¿ì¿¡´Â Ưº°È÷ À¯ÀÇÇØ¾ß ÇÑ´Ù.

2.2 ¾ÈÀüÇÑ ÇÁ·Î±×·¥ ¿ø¸®

⼔ system(), popen() ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

SUID ÇÁ·Î±×·¥À̳ª ³×Æ®¿öÅ© ¼­ºñ½º ÇÁ·Î±×·¥Àº Ưº°ÇÑ ±ÇÇÑÀ» °¡Áö°í ½ÇÇàµÈ´Ù. ±×·±µ¥ system(), popen() ÇÔ¼ö´Â ½© ÀÎÅÍÇÁ¸®ÅÍÀÎ /bin/sh¸¦ ½ÇÇàÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇϱ⠶§¹®¿¡ À§ÇèÇÏ´Ù. ±×·¯¹Ç·Î ´ë½Å execl()À̳ª execv() ½Ã½ºÅÛ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

⼔ ¸ðµç ÆÄÀÏ ±â¼úÀÚ¸¦ ´Ý¾Ò´ÂÁö ²À È®ÀÎÇÑ´Ù.

»õ·Î »ý¼ºµÈ ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ ÆÄÀÏ ±â¼úÀÚÀÇ º¹»çº»À» °¡Áö¹Ç·Î ºÎ¸ð ÇÁ·Î¼¼½º°¡ Áß¿äÇÑ ÆÄÀÏ(ex, /etc/passwd)À» ¿­¾úÀ» °æ¿ì ÀÌ ÆÄÀÏÀÇ ÆÄÀÏ ±â¼úÀÚ »ó¼Ó¹Þ±â ¶§¹®¿¡ ÆÄÀÏÀÌ ³ëÃâµÉ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ÆÄÀÏ ±â¼úÀÚ¸¦ ¿­¾úÀ» °æ¿ì¿¡´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ±â Àü¿¡ ¸ðµç ÆÄÀÏ ±â¼úÀÚ¸¦ ´Ý¾Æ¾ß ÇÑ´Ù.

⼔ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§ Àüü °æ·Î À̸§À» »ç¿ëÇÏ´ÂÁö È®ÀÎÇÑ´Ù.

»ó´ë °æ·Î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿´À» °æ¿ì¿¡ ÀÓÀÇÀÇ ÇÁ·Î±×·¥À̳ª Æ®·ÎÀÌÀÜ ÇÁ·Î±×·¥À» ½ÇÇàµÉ ¼ö Àֱ⠶§¹®¿¡ ²À Àý´ë °æ·Î¸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù.

⼔ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ Àü´ÞµÈ ȯ°æº¯¼ö¸¦ È®ÀÎÇÑ´Ù.

ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ È¯°æº¯¼ö¸¦ »ó¼Ó¹Þ´Â´Ù. ±×·±µ¥ ȯ°æº¯¼ö°¡ ¼ö½Ã·Î Á¤ÀÇµÉ ¼ö ÀÖÀ¸¹Ç·Î À§ÇèÇÏ´Ù. ±×·¯¹Ç·Î ȯ°æº¯¼ö¸¦ »ó¼Ó¹ÞÀ» °æ¿ì¿¡´Â ²À ÇÊ¿äÇÑ È¯°æº¯¼ö¸¦ »ó¼Ó¹Þµµ·Ï ÇÏ°í ´Ù¸¥ ȯ°æº¯¼ö´Â ±ú²ýÇÑÁö È®ÀÎÇϵµ·Ï ÇÑ´Ù.

¥±. ÆÄÀϽýºÅÛ º¸¾È

1. µðÆúÆ® ±ÇÇÑ ¼³Á¤ º¸¾È - umask

1.1 umaskÀÇ À§Ç輺

»ý¼ºµÈ ÆÄÀÏÀ̳ª ½ÇÇàµÇ´Â ÇÁ·Î±×·¥Àº µðÆúÆ® ÆÄÀÏ ±ÇÇÑÀ» °¡Áö°í ¼³Á¤µÈ´Ù. ÀÌ·¯ÇÑ µðÆúÆ® ±ÇÇÑÀº ÇÁ·Î¼¼½º umask¿¡ ÀÇÇؼ­ ¼³Á¤µÇ´Âµ¥ ÀÌ ±ÇÇÑÀº ºÎ¸ð ÇÁ·Î¼¼½º³ª ·Î±×ÀÎ ½©¿¡ÀÇÇØ »ó¼Ó¹Þ´Â´Ù. ±×·±µ¥ umask°¡ ¾ÈÀüÇÏÁö ¾ÊÀº ±ÇÇÑÀ¸·Î ¼³Á¤µÈ °æ¿ì Çã°¡µÇÁö ¾ÊÀº »ç¿ëÀÚ¿¡°Ô±îÁö ÆÄÀÏÀ̳ª ÇÁ·Î¼¼½º¿¡ Á¢±ÙÀ» Çã¶ôÇÏ¿© º¸¾È ¹®Á¦¸¦ ¾ß±âÇÒ ¼ö ÀÖ´Ù.

1.2 ¾ÈÀüÇÑ umask »ç¿ë ¿ø¸®

µðÆúÆ®·Î umask´Â 022·Î ¼³Á¤µÇ¾î Àִµ¥ umask¸¦ ¼öÁ¤Çϱâ À§Çؼ­´Âumask()¶ó´Â ¶óÀ̺귯¸® È£Ãâ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

umask
»ç¿ëÀÚ Á¢±Ù
±×·ì Á¢±Ù
´Ù¸¥ »ç¿ëÀÚ
0000
all
all
all
0002
all
all
read, execute
0007
all
all
none
0022
all
read, execute
read, execute
0027
all
read, execute
none
0077
all
none
none

[Ç¥-1] ÀϹÝÀûÀÎ umask ¼³Á¤°ª

2. ÀÔ·Â ½Ã°£ Á¦ÇÑ

ƯÈ÷ ³×Æ®¿öÅ©¿¡¼­ µé¾î¿À´Â ÀÚ·á¿¡´Â ŸÀÓ ¾Æ¿ô°ú ·Îµå Çѵµ¸¦ Á¦ÇÑÇØ¾ß ÇÑ´Ù. ¸¸¾à ±×·¸Áö ¾ÊÀ¸¸é, ¼­ºñ½º¸¦ ²÷ÀÓ¾øÀÌ ¿äûÇÏ´Â ¼­ºñ½º °ÅºÎ °ø°ÝÀ» ½±°Ô ÃÊ·¡ÇÒ ¼ö ÀÖÀ»Áöµµ ¸ð¸¥´Ù.

3. ¾ÈÀüÇÑ Àӽà ÆÄÀÏ »ç¿ë º¸¾È

3.1 ÀÓ½Ã(tmp) ÆÄÀÏÀÇ À§Ç輺

Àӽà ÆÄÀÏÀº /tmp µð·ºÅ丮¿¡ ÀúÀåµÇ´Â ÆÄÀÏ·Î ÀÌ ÆÄÀÏ¿¡ Á¢±ÙÇϱâ À§ÇØ Æ¯º°ÇÑ ±ÇÇÑÀÌ ÇÊ¿äÇÏÁö ¾Ê°í ¶ÇÇÑ À̸§À» ¿¹ÃøÇϱ⠽±°í Àß ¾Ë·ÁÁ® ÀÖ´Ù. ±×·¡¼­ ÇÁ·Î±×·¥µéÀº ÀÌ ÆÄÀÏ¿¡ Á¢±ÙÇÏ¿© ÆÄÀÏÀ» ¿¬ ÈÄ ÆÄÀϾȿ¡ ¾î¶² µ¥ÀÌÅ͵éÀ» »ðÀÔÇϱ⠽±´Ù.

(¿¹Á¦ 2) Àӽà ÆÄÀÏÀ» ÀÌ¿ëÇÑ °ø°Ý

¨ç root·Î ½ÇÇàµÇ´Â ½Ã½ºÅÛ ÇÁ·Î±×·¥À» °ø°ÝÀÚ°¡ ½ÇÇà½ÃŲ´Ù. ÀÌ ½Ã½ºÅÛ ÇÁ·Î±×·¥Àº tmp µð·ºÅ丮 ¾ÈÀÇ Àӽà ÆÄÀÏ(/tmp/program.temp)À» ¿¬´Ù.

¨è °ø°ÝÀÚ´Â ÀÌ Àӽà ÆÄÀÏÀ» Áß¿äÇÑ ÆÄÀÏ(±ÇÇÑÀÖ´Â »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÑ ÆÄÀÏ, /etc/passwd)¿¡ ¸µÅ©¸¦ °Ç´Ù.

> ln -s /etc/passwd /tmp/program.temp

ÀÌ·¸°Ô ¸µÅ©¸¦ °É¸é °ø°ÝÀÚ°¡ ÀÓ½ÃÆÄÀÏ¿¡ ÀÓÀÇÀÇ µ¥ÀÌÅ͸¦ ¾µ °æ¿ì¿¡ ¸µÅ©¿¡ÀÇÇØ ½ÇÁ¦ ½áÁö´Â ÆÄÀÏÀº /etc/passwd ÆÄÀÏÀÌ µÇ¾î passwd ÆÄÀÏ¿¡ ¾ÇÀÇÀûÀÎ Á¤º¸°¡ »ðÀÔµÇ°Ô µÈ´Ù.

(¿¹Á¦ 3) Àӽà ÆÄÀÏÀ» ÀÌ¿ëÇÑ °ø°Ý

¨ç Àӽà ÆÄÀÏÀ» ó¸®ÇÏ´Â ±ÇÇÑÀÌ ¾ø´Â ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù.

¨è Áß¿äÇÑ ÆÄÀÏ¿¡ ¸µÅ©¸¦ °Ç´Ù.

> ln -s /etc/passwd /tmp/program.temp

¨é ½Å·ÚÇÒ ¼ö ÀÖ´Â »ç¿ëÀÚ°¡ ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù.

ÀÌ·¸°Ô ÇÏ¸é °ø°Ý (¿¹Á¦ 2)¿¡¼­Ã³·³ ÀÓ½ÃÆÄÀÏ¿¡ ¾²³ª ½ÇÁ¦·Î´Â Áß¿äÇÑ ÆÄÀÏ(/etc/passwd) ÆÄÀÏ¿¡ ½áÁö°Ô µÈ´Ù. °ø°Ý (¿¹Á¦ 1)°ú (¿¹Á¦ 2)ÀÇ Â÷ÀÌÁ¡Àº ÇÁ·Î±×·¥ÀÌ (¿¹Á¦ 1)¿¡¼­´Â rootÀÇ ±ÇÇÑÀ¸·Î ½ÇÇàµÇ°í (¿¹Á¦ 2)¿¡¼­´Â ÀÏ¹Ý »ç¿ëÀÚÀÇ ±ÇÇÑÀ¸·Î ½ÇÇàµÈ´Ù´Â °ÍÀÌ´Ù.

3.2 ¾ÈÀüÇÑ ÀÓ½ÃÆÄÀÏ »ç¿ë ÇÁ·Î±×·¥ ¿ø¸®

⼔ /tmp µð·ºÅ丮¾È¿¡ Àӽà ÆÄÀÏÀ» »ý¼ºÇÏÁö ¸»¾Æ¶ó.

⼔ ÀÓ½ÃÆÄÀÏÀ» »ý¼ºÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ´Â ½Ã½ºÅÛÀ» »ç¿ëÇÑ´Ù.

ÀÓ½ÃÆÄÀÏÀ» »ý¼ºÇϱâ À§ÇÑ ¸¹Àº ÇÔ¼öµéÀÌ Á¦°øµÇ´Âµ¥ ¹ß»ýÇÒ ¼ö ÀÖ´Â º¸¾È ¹®Á¦¿¡ ´ëºñÇϱâ À§ÇÏ¿© ÁÖÀDZí°Ô »ç¿ëÇØ¾ß ÇÑ´Ù.

- tmpfile()ÀÇ »ç¿ë

FILE *tmpfile(void);

tmpfile() ÇÔ¼ö´Â Àӽà ÆÄÀÏÀ» »ý¼ºÇÏ¿© ÆÄÀÏ ½ºÆ®¸²¿¡ ÆÄÀÏ ±â¼úÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ƯÈ÷ tmpfile() ÇÔ¼ö´Â mkstemp() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Àӽà ÆÄÀÏÀ» »ý¼ºÇÏ°í ¹Ù·Î ÆÄÀÏÀ» unlink() Çϱ⠶§¹®¿¡ ·¹À̽ºÄÁµð¼ÇÀÇ ¹ß»ýÀ» ÇÇÇÒ ¼ö ÀÖ´Ù.

⼔ Àӽà ÆÄÀÏÀÇ À̸§À» ¿¹ÃøÇÒ ¼ö ÀÖ´Â À̸§À¸·Î »ý¼ºÇÏÁö ¸»°í ·£´ýÇÏ°Ô »ý¼ºÇ϶ó.

- mkstemp() ÇÔ¼öÀÇ »ç¿ë

int mkstemp(char *template);

mkstemp() ÇÔ¼ö´Â ¸Å°³º¯¼ö·Î Àӽà ÆÄÀÏÀÇ Çü½ÄÀ» ÀÔ·Â¹Þ¾Æ ·£´ýÇÑ °ªÀ» ÀÌ¿ëÇÏ¿© ·£´ýÇÑ Àӽà ÆÄÀÏ À̸§À» »ý¼ºÇÑ´Ù.

fd = mkstemp("/tmp/tempfileXXXXXX");

¶ÇÇÑ ÀÌ ÇÔ¼ö´Â Àӽà ÆÄÀÏÀ̸§ÀÇ »ý¼º°ú ÆÄÀÏÀÇ ¿­±â »çÀÌ¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ·¹À̽ºÄÁµð¼Ç ¿À·ù¸¦ ¹æÁöÇÒ ¼ö ÀÖ´Ù.

- mktemp() ÇÔ¼öÀÇ »ç¿ë

char *mktemp(char *template);

mktemp() ÇÔ¼öµµ mkstemp() ÇÔ¼ö¿Í °°ÀÌ Àӽà ÆÄÀÏÀÇ Çü½ÄÀ» ¸Å°³º¯¼ö·Î ÀÔ·Â¹Þ¾È ·£´ýÇÑ ÆÄÀÏ À̸§À» »ý¼ºÇÑ´Ù. ±×·¯³ª ´ëºÎºÐÀÇ ½Ã½ºÅÛÀÌ ·£´ý°ªÀ¸·Î PID¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ÆÄÀÏÀÇ À̸§À» ½±°Ô ¿¹ÃøÇÒ ¼ö ÀÖ¾î ·¹À̽ºÄÁµð¼Ç °ø°ÝÀ» ¹Þ±â ½±´Ù.

filename = mktemp("/tmp/tempfileXXXXXX");

¶ÇÇÑ ÀÌ ÇÔ¼ö´Â Àӽà ÆÄÀÏÀ» »ý¼ºÇÑ ÈÄ ¹Ù·Î ÀÌ ÆÄÀÏÀ» ¿­¾î¾ß ÇÑ´Ù. ¸¸¾à ´ÙÀ½°ú °°Àº È£Ãâ·Î ÆÄÀÏÀ» ¿­¾úÀ» °æ¿ì

open(filename, O_WRONLY|O_CREAT, 0644);

ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÒÁö¶ó°í ÆÄÀÏÀ» »ý¼ºÇϱ⠶§¹®¿¡ À§ÇèÇÏ´Ù. ±×·¸±â ¶§¹®¿¡

open(filename, O_WRONLY|O_CREAT|O_EXCL, 0644);

Àº ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÒ ¶§ È£ÃâÀÌ ½ÇÆÐÇϱ⠶§¹®¿¡ ´õ ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

⼔ Àӽà ÆÄÀÏÀ» »ý¼ºÇϱâ À§ÇÑ /tmp µð·ºÅ丮 ¾È¿¡ Ãß°¡ µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. mktemp() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Àӽà ÆÄÀÏÀ» »ý¼ºÇÒ ¶§ ÆÄÀÏ À̸§À» µð·ºÅ丮 À̸§À¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.

3.3 /tmp µð·ºÅ丮 º¸¾È

°¡. /tmp µð·ºÅ丮¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â À§Ç輺

À¯´Ð½º ½Ã½ºÅÛ /tmp µð·ºÅ丮¿¡ ÀÓÀÇÀÇ Å©±â¸¦ °¡Áø ÆÄÀÏÀ» »ý¼ºÇϵµ·Ï Çϴµ¥ /tmp µð·ºÅ丮ÀÇ ÇÒ´ç·®À» °Ë»çÇÏÁö ¾Ê¾Æ ÇÑ »ç¿ëÀÚ°¡ /tmp µð·ºÅ丮ÀÇ ¸ðµç ¿ë·®À» »ç¿ëÇÏ¿© ´Ù¸¥ »ç¿ëÀÚ°¡ ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö ¾øµµ·Ï ÇÏ´Â ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.

³ª. /tmp µð·ºÅ丮ÀÇ º¸¾È ¿ø¸®

⼔ /tmp µð·ºÅ丮ÀÇ ¿ë·®À» °Ë»çÇÏ¿© ÇÑ »ç¿ëÀÚ°¡ /tmp µð·ºÅ丮 ¿ë·®ÀÇ 40% ÀÌ»óÀ» Â÷ÁöÇÒ ¼ö ¾ø°Ô ÇÑ´Ù.

⼔ /tmp µð·ºÅ丮¸¦ ¸ð´ÏÅ͸µÇÏ´Â ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ¿© ½Ã½ºÅÛ °ü¸®ÀÚ¿¡°Ô Å뺸ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

¥². ÀÚ¿ø º¸¾È

1. ½Ã½ºÅÛ ÀÚ¿øÀÇ ÇÒ´ç°ú ÀÚ¿ø Á¦ÇÑÀÇ Á߿伺

À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ÀÚ¿ø¿¡ ´ëÇÑ ÆÄÀϽýºÅÛ ÇÒ´ç·®(filesystem Quota)°ú ÇÁ·Î¼¼½º ÀÚ¿ø Á¦ÇÑ(process resource Limit)À» µÎ´Â °ÍÀº °¢ »ç¿ëÀÚ°¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÚ¿ø¿¡ Á¦ÇÑÀ» µÎ´Â °ÍÀ¸·Î ÀúÀå(storage) ºí·Ï ¼ö³ª »ç¿ëÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ ÆÄÀÏ(inode) ¼ö¸¦ Á¦ÇÑÇÏ¿© »ç¿ëÀÚ³ª ±×·ì¿¡ ´ëÇÑ ÇѰ踦 ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Á¦ÇÑÀº Àǹ̻óÀ¸·Î ¾à°£ÀÇ Â÷ÀÌ°¡ ÀÖ´Â 'hard'¿Í 'soft' Á¦ÇÑÀ¸·Î ³ª´­ ¼ö Àִµ¥ 'hard'´Â Á¦ÇÑ¿¡ ´ëÇÏ¿© ÇѰ踦 ³ÑÀ» ¼ö ¾ø´Â Á¦ÇÑÀÌ°í 'soft' Á¦ÇÑÀº ÇÑ°èÀ» ÀÓ½ÃÀûÀ¸·Î ³ÑÀ» ¼ö ÀÖ´Â °ÍÀÌ´Ù. quota(), quotactl(), quotaon()°ú °°Àº ÇÔ¼ö¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

½Ã½ºÅÛ ÀÚ¿ø¿¡ ´ëÇÑ ÇÒ´ç·®À» Á¦ÇÑÇÏ´Â °ÍÀº ¼­ºñ½º °ÅºÎ °ø°Ý(Denial of Service Attack)À» ¸·À» ¼ö ÀÖ°Ô ÇÏ´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. ¶ÇÇÑ ÆÄÀÏÀÇ Å©±â(file size)³ª ÀÚ½Ä ÇÁ·Î¼¼½º(child process)ÀÇ ¼ö, open fileÀÇ ¼ö µîÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÒ´çÀ» Áö¿øÇÏ´Â rlimit ¸ÞÄ¿´ÏÁòÀÌ Àִµ¥ getrlimit(), setrlimit(), getrusage() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù.

2. core ÆÄÀÏ º¸¾È

º¸Åë core ÆÄÀÏÀº À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ¿¹¿Ü »óȲÀÌ ¹ß»ýÇßÀ» ¶§ »ý¼ºµÇ´Â ÆÄÀÏ·Î core³ª program.core¶ó´Â À̸§À» °¡Áø´Ù. ¿¹¿Ü°¡ ¹ß»ýÇÏ´Â »óȲÀº ´ÙÀ½°ú °°´Ù.

- ÇÁ·Î±×·¥ ¸Þ¸ð¸®¿¡ ħ¹ü´çÇÑ °æ¿ì

- ÇÁ·Î±×·¥ ½ºÅÿ¡ ħ¹ü´çÇÑ °æ¿ì

- À¯È¿ÇÏÁö ¾ÊÀº ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â °æ¿ì

- À߸ø Á¤·ÄµÈ ±¸Á¶Ã¼¿¡ Á¢±ÙÇÏ´Â °æ¿ì

core ÆÄÀÏÀº ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ ½ÇÇà ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸®°¡ µð½ºÅ© ÆÄÀÏ¿¡ ¾²¿©Áø´Ù. core ÆÄÀÏÀº º¸Åë Æı«µÈ ÇÁ·Î±×·¥ÀÇ »óŸ¦ Á¡°ËÇϴµ¥ ÀÌ¿ëÇÑ´Ù.

2.1 core ÆÄÀÏÀÇ À§Ç輺

⼔ ÇÁ·Î±×·¥ÀÇ ¸ðµç ¸Þ¸ð¸® ³»¿ëÀÌ ÀÌ ÆÄÀÏ¿¡ ¾²¿©Áö¹Ç·Î Áß¿äÇÏ°í °áÁ¤ÀûÀÎ Á¤º¸µîÀ» ÀúÀåÇÏ°í ÀÖ´Ù.

⼔ °ú°ÅÀÇ ¾î¶² ¿î¿µÃ¼Á¦¿¡¼­´Â core ÆÄÀÏÀ» Á¡°ËÇÒ ¼ö ¾ø¾ú´Ù. ±×·¡¼­ core ÆÄÀÏÀ» Áß¿äÇÑ ÆÄÀÏ¿¡ ¸µÅ©¸¦ °É¾î ³ôÀº ±ÇÇÑÀ» °¡Áø ÆÄÀÏÀ» SUID/SGID ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ´À¸·Î½á Áß¿äÇÑ ÆÄÀÏÀ» °¡Á®¿Ã ¼ö ÀÖ¾ú´Ù.

2.2 ¾ÈÀüÇÑ core ÆÄÀÏ ¿ø¸®

⼔ ¿¹¿Ü°¡ ¹ß»ýÇßÀ» °æ¿ì core ÆÄÀÏÀ» »ý¼ºÇÏÁö ¸øÇÏ°Ô Á¦ÇÑÇÏ´Â setrlimit() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

int setrlimit(int recource, const struct rlimit *rlp);

ÀÌ ÇÔ¼ö´Â RLIMIT_CORE¶ó´Â ÀÚ¿øÀÇ Å¸ÀÔÀ» »ç¿ëÇÏ¿© »ý¼ºµÇ´Â core ÆÄÀÏÀÇ Å©±â¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ ÆÄÀÏÀÇ Å©±â¸¦ 0À¸·Î ¼³Á¤Çϸé core ÆÄÀÏÀº »ý¼ºµÇÁö ¾Ê´Â´Ù.

<ÇÁ·Î±×·¥-1> core ÆÄÀÏÀÌ »ý¼ºµÇÁö ¾Ê´Â ÇÁ·Î±×·¥

int nocore()

{

struct rlimit rlp;

rlp->rlim_cur = 0;

rlp->rlim_max = 0;

return(setrlimit(RLIMIT_CORE, &rlp));

}

¥³. ÀԷ°ª Æò°¡

ÀÔ·ÂµÈ °ªÀ¸·Î ÀÎÇÏ¿© °ø°ÝÀڷκÎÅÍ °ø°ÝÀ» ¹ÞÀ» ¼ö ÀÖ´Ù. ±×·¡¼­ ÀÔ·ÂµÈ °ªÀº ±× °ªÀÌ »ç¿ëµÇ±â Àü¿¡ Á¦°ÅµÇ¾î¾ß Çϴµ¥ ÀÌ Àå¿¡¼­´Â ½Å·ÚÇÒ ¼ö ¾ø´Â °ªÀÌ ÀԷµǴ ¹æ¹ýÀ» ¾Ë¾Æº¸°í °¢ ÀÔ·ÂÀ» ó¸®ÇÏ¿© ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¹æ¹ýÀ» Á¦½ÃÇÏ°íÀÚ ÇÑ´Ù.

ÀԷ°ªÀ» ó¸®Çϱâ À§Çؼ­´Â ¸ÕÀú ¾î¶² °ªÀÌ ÀûÇÕÇÑÁö ±ÔÄ¢À» Á¤ÇØ¾ß ÇÑ´Ù. ±×·¡¼­ ÀԷ°ªÀÌ Á¤ÀÇµÈ ±ÔÄ¢¿¡ ¸ÂÁö ¾ÊÀ¸¸é Á¦°ÅÇÏ°í ±ÔÄ¢¿¡ ÇÕ´çÇÑ °ª¸¸À» ÀÔ·Â¹Þ¾Æ¾ß ÇÑ´Ù. ±×·±µ¥ ¿ªÀ¸·Î ÀûÇÕÇÏÁö ¾ÊÀº °ªÀ» Á¤ÇÏ°í(what is illegal?) ±ÔÄ¢¿¡ ¸ÂÁö ¾Ê´Â, ÀûÇÕÇÑ °ªÀ» Á¦°ÅÇÏ´Â ¹æ¹ýÀº »ý°¢ÇÏÁö ¸øÇß´ø Ä¡¸íÀûÀÎ ¿À·ùµéÀ» ±×³É Áö³ªÄ¥ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ·± ¹æ¹ýÀ¸·Î ±ÔÄ¢À» Á¤ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¶Ç »ý°¢ÇØ¾ß ÇÒ °ÍÀº ÀԷµǴ °ªÀÇ ÃÖ´ë ±æÀÌ¿¡ Á¦ÇÑÀ» µÎ´Â °ÍÀÌ´Ù. Á¦ÇÑÀ» µÎÁö ¾ÊÀº ÀԷ°ªÀº ´ëÇ¥ÀûÀÎ °ø°Ý ¹æ¹ýÀÎ ¹öÆÛ¿À¹öÇ÷οì Ãë¾àÁ¡ÀÇ ¿øÀÎÀÌ µÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

1. ¸í·É¾î ¶óÀÎ º¸¾È

¸¹Àº ÇÁ·Î±×·¥Àº Àμö(argument)·Î Àü´ÞµÈ ÀԷ°ªÀ» ¹Þ¾ÆµéÀÌ´Â ¸í·É¾î ¶óÀÎ(command line)À» Á¦°øÇÑ´Ù. ±×·±µ¥ SUID/SGID ÇÁ·Î±×·¥Àº ½Å·ÚÇÒ ¼ö ¾ø´Â »ç¿ëÀÚ°¡ ¸í·É¾î ¶óÀÎ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¾ÈÀüÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î SUID/SGID ÇÁ·Î±×·¥Àº ¸í·É¾î ¶óÀÎ ÀԷ°ª¿¡ ´ëÇÏ¿© È®ÀÎÇØ¾ß ÇÏ°í ¸í·É¾î ¶óÀÎ ¸Å°³º¯¼ö¿¡ ÀÇÇØ Àü´ÞµÈ ÇÁ·Î±×·¥ÀÇ À̸§À» ¹ÏÁö ¸»¾Æ¾ß ÇÑ´Ù.

2. ¸®ÅÏ °ª º¸¾È

¿¡·¯ »óŸ¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Â ¸ðµç ½Ã½ºÅÛ È£Ãâ ÇÔ¼ö´Â Á¦ÇÑµÈ ÀÚ¿øÀ» ¿ä±¸Çϰųª »ç¿ëÀÚ°¡ ÀÚ¿ø¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖÀ¸¹Ç·Î Ç×»ó ¿¡·¯ »óŸ¦ °Ë»çÇØ¾ß ÇÑ´Ù.

ÀÌ·¯ÇÑ º¸¾È ±â´ÉÀ¸·Î Setuid/Setgid ÇÁ·Î±×·¥Àº ÀÚ¿øÀÇ »ç¿ëÀ» Á¦ÇÑÇÏ´Â ÇÔ¼öÀÎ setrlimit()³ª ½ºÄÉÁÙ¸µ ¿ì¼±±Ç(priority)À» Á¶ÀýÇÏ¿© ¸í·É¾î¸¦ ½ÇÇàÇÏ´Â nice() ÇÔ¼ö¸¦ ÇÁ·Î±×·¥»ó¿¡¼­ »ç¿ëÇÒ ¼ö ¾øµµ·Ï Á¦ÇÑÇÑ´Ù. ¶ÇÇÑ ¼­¹öÇÁ·Î±×·¥ÀÇ ¿ÜºÎ »ç¿ëÀÚ¿Í CGI ½ºÅ©¸³Æ®´Â ¸¹Àº request ¿ä±¸ÇÏ¿© ÀÚ¿øÀÌ °í°¥µÇµµ·Ï ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ¿¡ ´ëÇÑ Ã³¸®µµ ÇØÁÖ¾î¾ß ÇÑ´Ù.

3. À¯È¿°ª(Valid Value) Á¦ÇÑ

popen()À̳ª system()°ú °°Àº ½Ã½ºÅÛ È£Ãâ ÇÔ¼ö´Â ¸í·É¾î ½©(command shell)À» È£ÃâÇÏ¿© ½ÇÇàµÇ´Âµ¥ ÀÌ ÇÔ¼öµéÀº ¸ÞŸ¹®Á¦(metacharacter)¿¡ ÀÇÇØ ¿µÇâÀ» ¹Þ´Â´Ù. ¶ÇÇÑ execlp()¿Í execvp() ÇÔ¼öµµ ½©ÀÌ È£ÃâµÈ´Ù. ½©ÀÌ È£ÃâµÇ¸é ¸ÞŸ¹®Àڴ Ưº°ÇÑ Àǹ̸¦ °¡Áö°í Çؼ®µÈ´Ù. ±×·¡¼­ ÀÌ·± ¸ÞŸ¹®ÀÚ°¡ ÀÔ·ÂµÇ¾î ½©¿¡ º¸³»Áö¸é ÇÁ·Î±×·¥À» Æı«ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¸ÞŸ¹®Á¦¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù. ½©¿¡¼­ Ưº°ÇÑ Àǹ̸¦ °®´Â ¸ÞŸ¹®ÀÚ´Â ´ÙÀ½°ú °°´Ù.

& ; ` ' " | * ? ~ < > ^ ( ) [ ] { } $ n r

!

!Àº "not"ÀÇ Àǹ̸¦ °¡Áö°í ¶Ç ¸í·É¾î history¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. bash¿¡¼­´Â »óÈ£¸ðµå¿¡¼­ ½ÇÇàÇÏÁö¸¸ tcsh¿¡¼­´Â ½ºÅ©¸³Æ®·Î ÀνĵǹǷΠ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

#

ÁÖ¼®¹®À¸·Î ¸ðµç ÅؽºÆ®°¡ ¹«½ÃµÈ´Ù.

-

¿É¼ÇÀ¸·Î À߸ø ÀÎ½ÄµÉ ¼ö ÀÖµµ ÀÖ°í ¸¸¾à ÆÄÀÏÀÇ À̸§¿¡¼­ »ç¿ëµÈ´Ù¸é ½©ÀÌ °ø¹é¹®ÀÚ·Î ÀνÄÇÒ ¼ö ÀÖ¾î ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

' '

°ø¹é¹®ÀÚ´Â ÆÄÀÏÀ̸§À» ¿©·¯°³ÀÇ Àμö(argument)·Î ÀνÄÇÒ ¼ö ÀÖ´Ù.

'.'°ú '='

ÇöÀç ½©¿¡¼­ ½ÇÇàµÈ´Ù´Â ÀǹÌÀÇ '.'°ú º¯¼ö ¼³Á¤½Ã »ç¿ëµÇ´Â '='ÀÇ »ç¿ëÀÌ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.


¥´. ȯ°æº¯¼ö º¸¾È

ÇÁ·Î±×·¥¿¡¼­ ȯ°æº¯¼ö¸¦ »ç¿ëÇÒ ¶§¿¡´Â ȯ°æº¯¼ö¿¡ ÀÇÁ¸Çؼ­´Â ¾ÈµÈ´Ù. Áï, ȯ°æº¯¼öÀÇ °ªÀ» °¡Á¤ÇÏÁö ¸»¾Æ¾ß ÇÏ°í ¾Æ´Ï¸é ¸ðµç ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¥¿¡ Á¤º¸(ȯ°æº¯¼ö)¸¦ Àü´ÞÇØ¾ß ÇÑ´Ù¸é ÇÊ¿äÇÑ È¯°æº¯¼ö¸¦ Å×½ºÆ®ÇÏ°í »ç¿ëÈÄ¿¡´Â ¿ÏÀüÈ÷ »èÁ¦Çϵµ·Ï ÇÑ´Ù.

1. ȯ°æº¯¼ö ¼³Á¤ÀÇ À§Ç輺

⼔ ¹öÆÛ¿À¹öÇÃ·Î¿ì º¸¾È ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

ȯ°æº¯¼ö¿¡ ÀÇÇÑ ¹öÆÛ¿À¹öÇÃ·Î¿î º¸¾È ¹®Á¦°¡ °¡Àå ÈçÇÏ°Ô ¹ß»ýÇÏ´Â º¸¾È ¹®Á¦·Î

<ÇÁ·Î±×·¥-2> ȯ°æº¯¼ö »ç¿ëÀÇ ¹öÆÛ¿À¹öÇ÷οì

...

char *s, buf[128];

if(!(s = getenv("HOME")))

return -1;

strcpy(buf, s);

...

ÀÌ ÇÁ·Î±×·¥Àº ȯ°æº¯¼ö HOMEÀÇ Å©±â¸¦ °í·ÁÇÏÁö ¾Ê°í ±×³É 128 byte ¹öÆÛ¿¡ º¹»çÇÔÀ¸·Î ¹öÆÛ¿À¹öÇÃ·Î¿ì º¸¾È ¹®Á¦°¡ ¹ß»ýÇÒ °æ¿ì¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

⼔ »ó¼Ó¿¡ ÀÇÇÑ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

ÀϹÝÀûÀ¸·Î ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ȯ°æº¯¼ö°¡ »ó¼ÓµÇ¹Ç·Î ȯ°æº¯¼ö¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÑ´Ù.

⼔ À߸ø »ç¿ëÇÑ °æ¿ì À§ÇèÇÒ ¼ö ÀÖ´Ù.

IFS´Â command line¿¡¼­ Àμö(argument)µéÀ» ºÐ¸®ÇÏ´Â ¹®ÀÚ¸¦ ³ªÅ¸³»´Â ȯ°æº¯¼ö·Î ÈçÈ÷ " "(°ø¹é¹®ÀÚ)¸¦ »ç¿ëÇϴµ¥ »ç¿ëÀڵ鿡°Ô Ä£±ÙÇÏÁö ¾ÊÀº ¹®ÀÚ·Î ¼³Á¤µÈ °æ¿ì ½©À» È£ÃâÇÏ´Â ¸í·É(C¿¡¼­ÀÇ system, popenÀ̳ª Perl¿¡¼­ back-tick ¸í·É¾î)À» ½ÇÇàÇÏ¿© ½©À» Æı«ÇÒ ¼ö ÀÖ´Ù.

⼔ ¹®¼­È­°¡ Á¦´ë·Î µÇÁö ¾Ê¾Æ¼­ ½Ã½ºÅÛ¿¡ Àͼ÷ÇÏÁö ¾ÊÀº »ç¿ëÀÚ´Â ÀÌ·± ȯ°æº¯¼ö¸¦ Àß ¸ð¸£´Â °æ¿ì°¡ ÀÖ´Ù.

⼔ ¹®¼­È­°¡ Àß µÇ¾î ÀÖ´õ¶óµµ ȯ°æº¯¼ö°¡ ¼öÁ¤µÉ ¼ö ÀÖ¾î À§ÇèÇÏ´Ù.

2. ȯ°æº¯¼ö ÀúÀå Çü½Ä

ÇÁ·Î±×·¥ÀÌ È¯°æº¯¼ö¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â Ç¥ÁØ Á¢±Ù ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. getenv(), putenv(), setenv(), unsetenv()°ú °°Àº ÇÔ¼öµéÀ» ÀÌ¿ëÇÏ¿© ȯ°æº¯¼ö¸¦ ¼öÁ¤Çϰųª ¼³Á¤ÇÒ ¼ö Àִµ¥ execve() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥¿¡ Àü´ÞµÇ´Â ȯ°æº¯¼öÀÇ µ¥ÀÌÅÍ ¿µ¿ªÀ» Á¦¾îÇÒ ¼ö À־ À§ÇèÇÏ´Ù. Linux ½Ã½ºÅÛÀÇ environ º¯¼ö´Â ȯ°æº¯¼ö°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö º¸¿©ÁÖ´Â º¯¼ö·Î

extern char **environ;

À§¿Í °°Àº Çü½ÄÀ» °¡Áö°í ÀÖ´Ù. ÀÌ environ º¯¼ö¿¡ ÀúÀåµÇ´Â °ªÀº NAME=value¶ó´Â ÇüÅÂÀÇ ½ºÆ®¸µÀε¥ ȯ°æº¯¼öÀÇ À̸§µéÀÌ = »çÀÎÀ» Æ÷ÇÔÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ°í À̸§(NAME)À̳ª °ª(value)ÀÌ NIL ¹®ÀÚ¸¦ ³»Æ÷ÇÏ°í ÀÖÁö ¾ÊÀ» ¼öµµ ÀÖ¾î À§ÇèÇÏ´Ù. ¶ÇÇÑ °°Àº À̸§À» °¡Áö°í ´Ù¸¥ °ªÀ» °®´Â º¯¼öµéÀÌ Á¸ÀçÇÏ¿© execve()¸¦ »ç¿ëÇÏ¿© À§ÇèÇÑ »óȲÀÌ ½ÇÇàµÇ°Ô ÇÒ ¼öµµ ÀÖ´Ù.

3. ȯ°æº¯¼ö ¹®Á¦ÀÇ º¸¾È ¿ø¸®

¾ÈÀüÇÑ SUID/SGID ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱâ À§Çؼ­´Â ÀԷ°ªÀ¸·Î ÀԷµǴ ȯ°æº¯¼öµéÀ» Á¦°ÅÇÏ°í ¸ðµç ȯ°æº¯¼ö¸¦ »èÁ¦ÇÑ ÈÄ ÇÊ¿äÇÑ È¯°æº¯¼ö´Â ¾ÈÀüÇÏ°Ô ´Ù½Ã ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¸ðµç ¾ÈÀüÇÏÁö ¾ÊÀº ȯ°æº¯¼ö¸¦ ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø±â ¶§¹®¿¡ ÇÁ·Î±×·¥ÀÇ ¼Ò½º Äڵ带 ´Ù È®ÀÎÇÑ´Ù ÇÏ´õ¶óµµ ´Ù½Ã ¼öÁ¤µÉ ¼ö ÀÖÀ¸¹Ç·Î ¾ÈÀüÇÏÁö ¾Ê´Ù.

3.1 ȯ°æº¯¼ö¸¦ Áö¿ì´Â ¹æ¹ý

⼔ environ º¯¼ö¸¦ NULL·Î ¼³Á¤ÇÑ´Ù.

environ º¯¼ö´Â unistd.h¿¡ Á¤ÀǵǾî ÀÖ°í ÀÌ Çì´õÆÄÀÏÀÇ environ º¯¼ö¸¦ ¼öÁ¤ÇÏ¿© ½ÇÇàÇϵµ·Ï ÇÑ´Ù.

⼔ clearenv() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

clearenv()´Â stdlib.h Çì´õÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ°í »ç¿ëÀü¿¡ _USE_MISCÀÌ #define µÇ¾î¾ß ÇÑ´Ù.

¥µ. ¹öÆÛ¿À¹öÇÃ·Î¿ì º¸¾È

´ëºÎºÐ ¹ß»ýÇÏ´Â º¸¾È °áÁ¡Àº ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦ÀÌ´Ù. ¹öÆÛ¿À¹öÇ÷οì´Â ±â¼úÀûÀ¸·Î ÇÁ·Î±×·¥ ³»ºÎÀÇ ½ÇÇà ¹®Á¦¿¡¼­ ¹ß»ýÇϴµ¥ ÀÌ ¹®Á¦´Â °¡Àå ÀϹÝÀûÀ̸鼭µµ ½É°¢ÇÑ ¹®Á¦À̱⵵ ÇÑ´Ù. CERT¿¡¼­´Â 1998°ú 1999³âºÎÅÍ °è¼Ó ³íÀÇµÇ¾î ¿Ô°í Bugtraq¿¡ ¿Ã¶ó¿À´Â ÀÀ´äÀÇ 2/3°¡ ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦Àϸ¸Å­ ¿À·¡µÇ°í Àß ¾Ë·ÁÁ³Áö¸¸ °è¼ÓÇؼ­ À̽´°¡ µÇ°í ÀÖ´Â ¹®Á¦ÀÌ´Ù.

¹öÆÛ¿À¹öÇ÷οì´Â °íÁ¤µÈ ±æÀÌÀÇ ¹öÆÛ¿¡ °ªÀ» ¾µ ¶§ ¹öÆÛÀÇ °æ°è°ªÀ» ³Ñ¾î¼­¸é¼­ ¹ß»ýÇϴµ¥ »ç¿ëÀÚ ÀÔ·Â °ªÀ» ÀÐÀ» ¶§³ª ÇÁ·Î±×·¥³»¿¡¼­ ó¸®ÇÏ´Â Áß°£¿¡ ¹ß»ýÇϱ⵵ ÇÑ´Ù. ¾ÈÀüÇÑ ÇÁ·Î±×·¥ÀÌ ÀÌ·± ¹öÆÛ¿À¹öÇ÷ο츦 Çã¿ëÇϸé C¿Í °°Àº ¾ð¾î¿¡¼­´Â °ø°ÝÀÚ°¡ ÀÛ¼ºÇÑ ¾ÇÀÇÀûÀÎ Äڵ带 °­Á¦·Î ½ÇÇàÇÏ°Ô Ä¡¸íÀûÀÎ ÇÇÇظ¦ ÀÔÀ» ¼ö ÀÖ´Ù. ¹öÆÛ¿À¹öÇ÷οì Ãë¾àÁ¡À» "stack smashing"À̶ó°í ºÎ¸£°í Èü¹öÆÛ¿¡¼­ ¹ß»ýÇÏ´Â ¿À¹öÇ÷ο쵵 °£°£ÀÌ ¹ß»ýÇÏ°í ÀÖ´Ù.

´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦¿¡ ´ëÇÑ ¸é¿ª±â´ÉÀ» °¡Áö°í ÀÖ´Ù. PerlÀº ÀÚµ¿À¸·Î ¹è¿­ÀÇ Å©±â¸¦ ´Ù½Ã °è»êÇÏ°í Ada95´Â ¹öÆÛ¿À¹öÇ÷ο츦 ŽÁöÇÏ¿© ¸·´Â´Ù. ±×·¯³ª C ¾ð¾î¿Í C++´Â ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦¿¡ ´ëÇÏ¿© ¾î¶°ÇÑ º¸È£±â´Éµµ Á¦°øÇÏÁö ¾Ê¾Æ¼­ ¹®Á¦°¡ µÇ°í ÀÖ´Ù.

1. ¾ÈÀüÇÑ ÇÔ¼ö »ç¿ëÀ¸·ÎÀÎÇÑ ÇØ°áÃ¥

C¾ð¾î³ª C++ÀÇ ±¸Á¶»ó °æ°è°ªÀ» ³Ñ´Â °ÍÀ» Â÷´ÜÇÏÁö ¸øÇϹǷΠÇÁ·Î±×·¡¸Ó´Â °æ°è°ªÀ» üũÇÏ´Â ¾Ê´Â ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù.

strcpy(), strcat(), sprintf()(vsprintf()), gets()¿Í °°Àº ÇÔ¼ö´Â °æ°è°ª üũ¸¦ ÇÏÁö ¾ÊÀ¸¹Ç·Î strncpy(), strncat(), snprintf(), fget()°ú °°Àº ÇÔ¼ö·Î ´ëüÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ scanf °è¿­ÀÇ ÇÔ¼öµé¿À À§ÇèÇϹǷΠÃÖ´ë ÀԷ¹ÞÀ» ¼ö ÀÖ´Â ½ºÆ®¸µÀÇ ±æÀÌ Á¦ÇÑ ¾øÀÌ »ç¿ëÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. realpath()³ª getopt()°ú °°Àº ÇÔ¼öµµ ÃÖ¼ÒÇÑÀÇ PATH_MAX ¹ÙÀÌÆ® ±æÀ̸¦ Á¤ÇØÁÖ´Â getwd() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù.[Ç¥ ]

Ãë¾àÇÑ ÇÔ¼ö

´ëü ÇÔ¼ö

strcpy()

strcat()

sprintf()(¶Ç´Â vsprintf())

gets()

strncpy()

strncat()

snprintf()

fget()

scanf() fscanf() sscanf() vscanf() vsscanf() vfscanf()


realpath() getopt() getpass() streadd() strecpy() strtrns()

getwd()

[Ç¥-2] Ãë¾àÇÑ ÇÔ¼ö¿Í ´ëü ÇÔ¼ö


2. °¢ ÇÔ¼öÀÇ ¾ÈÀüÇÑ »ç¿ë

⼔ strcpy()

strcpy() ÇÔ¼ö´Â ¹öÆÛÀÇ Å©±â¸¦ Æò°¡ÇÏÁö ¾Ê¾Æ ¹®Á¦°¡ ¹ß»ýÇϹǷΠº¹»çÇÒ µ¥ÀÌÅÍÀÇ Å©±â¸¦ ¹Ì¸® °Ë»çÇÏ´Â strncpy() ÇÔ¼ö¸¦ ´ë½Å »ç¿ëÇÒ ¼ö ÀÖ´Ù. strncpy() ÇÔ¼ö´Â NULL ¹®ÀÚ·Î ³¡³»¾ß Çϴµ¥ ¼Ò½ºÀÇ ¹öÆÛ Å©±â°¡ º¹»çÇÒ ¹öÆÛº¸´Ù Å©°Å³ª °°À¸¸é NULL·Î ³¡³ªÁö ¾ÊÀ» ¼ö Àֱ⠶§¹®ÀÌ´Ù.

Incorrect

Correct

void func(char *str)

{

char buffer[256];

strcpy(buffer, str);

return;

}

void func(char *str)

{

char buffer[256];

strncpy(buffer, str, sizeof(buffer)-1);

buffer[sizeof(buffer)-1] = 0;

return;

}

<ÇÁ·Î±×·¥-3> strcpy() vs. strncpy()

⼔ strcat()

strcat() ÇÔ¼öµµ strcpy() ÇÔ¼ö¿Í ºñ½ÁÇÏ°Ô Ã·°¡ÇÒ ½ºÆ®¸µÀÇ ±æÀ̸¦ °Ë»çÇÏÁö ¾Ê¾Æ ¹®Á¦°¡ ¹ß»ýÇÏ°í ´ë½Å strncat() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸í½ÃÇÑ ±æÀ̸¸Å­ ¿ø·¡ÀÇ ½ºÆ®¸µ¿¡ µ¡ºÙÀδÙ. ±×¸®°í NULL ¹®ÀÚ·Î ³¡³­´Ù.

Incorrect

Correct

void func(char *str)

{

char buffer[256];

strcat(buffer, str);

return;

}

void func(char *str)

{

char buffer[256];

strncat(buffer, str, sizeof(buffer)-1);

return;

}

<ÇÁ·Î±×·¥-4> strcat() vs. strncat()

⼔ sprintf()

sprintf() ÇÔ¼ö´Â Æ÷¸Ë ½ºÆ®¸µ º¯¼ö°¡ »ç¿ëµÉ ¶§ ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ°í ¹öÆÛ¿¡ Ãâ·ÂµÇ´Â µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Á¦ÇÑÇϱâ À§ÇØ snprintf() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅÍÀÇ ±æÀÌ°¡ ¹öÆÛº¸´Ù ´õ Å©¸é ¹öÆÛ¿¡ ¾î¶² °Íµµ ±â·ÏÇÏÁö ¾Ê´Â´Ù. snprintf() ÇÔ¼öÀÇ ¸®ÅÏ°ªÀ» È®ÀÎÇÏ¿© ¹öÆÛ¿¡ ¾²¿©Áø °ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

Incorrect

Correct

void func(char *str)

{

char buffer[256];

sprintf(buffer, "%s", str);

return;

}

void func(char *str)

{

char buffer[256];

if(snprintf(target, sizeof(target)-1, "%s", string) > sizeof(target)-1)

/*....*/

return;

}

<ÇÁ·Î±×·¥-5> strcpy() vs. strncpy()

⼔ gets()

gets() ÇÔ¼ö´Â ±æÀ̸¦ ¸í½ÃÇÏ´Â ºÎºÐÀÌ ³ª¿Í ÀÖÁö ¾ÊÀ¸¹Ç·Î ¿À¹öÇÃ·Î¿ì ¹®Á¦°¡ Ç×»ó ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â new-lineÀ̳ª EOF¸¦ ¸¸³ª°Å³ª ¹öÆÛ°¡ ´Ù Âû ¶§±îÁö Ç¥ÁØ ÀԷ°ªÀ» Àд´Ù. fgets() ÇÔ¼ö´Â n-1 °³ÀÇ ¹®ÀÚ¸¦ Àд´Ù.

Incorrect

Correct

void func(char *str)

{

char buffer[256];

gets(buffer);

return;

}

void func(char *str)

{

char buffer[256];

fgets(buffer, sizeof(buffer)-1, stdin);

return;

}

<ÇÁ·Î±×·¥-6> gets() vs. fgets()


⼔ scanf(), sscanf(), fscanf()

ÁöÁ¤µÈ Å©±âÀÇ ¹öÆÛ¸¦ ÀоîµéÀ̴µ¥ ÀоîµéÀÏ ¼ö ÀÖ´Â ÃÖ°íÀÇ ¹öÆÛ ±æÀ̸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù.

Vulnerable

Safe

char buffer[256];

int num;

num = fscanf(stdio, "%s", buffer);

char buffer[256];

int num;

num = fscanf(stdio, "%255s", buffer);

<ÇÁ·Î±×·¥-7> scanf(), sscanf(), fscanf()

⼔ memcpy()

¿ÜºÎÀÇ ÀÚ·á¿¡ÀÇÇؼ­ memcpy() ÇÔ¼ö¿¡¼­ ¸í½ÃµÈ ±æÀÌ°¡ ¹Ù²ð ¶§ ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

Incorrect

unsigned long copyaddress(struct hosten *hp) {

unsigned long address;

memcpy(&address, hp->h_addr_list[0], hp->h_length);

}

Correct

unsigned long copyaddress(struct hosten *hp) {

unsigned long address;

if(hp->h_length > sizeof(address))

return 0;

memcpy(&address, hp->h_addr_list[0], hp->h_length);

return address;

}

<ÇÁ·Î±×·¥-8> memcpy() ÇÔ¼ö

ÀÌ°ÍÀº ½ÇÁ¦·Î BIND¿¡¼­ ³ªÅ¸³­ Ãë¾àÁ¡À¸·Î hp->h_lengthÀÇ ±æÀ̸¸Å­ address º¯¼ö¿¡ º¹»çÇϴµ¥ hp->h_length º¯¼ö´Â ÀÎÅÍ³Ý ÁÖ¼ÒÀÇ Å©±âÀ̹ǷΠ4 byteÀÌ´Ù. ±×·±µ¥ °ø°ÝÀÚ°¡ À§Á¶µÈ DNS reply¸¦ ½ºÇªÇÎÇÒ ¼ö ÀÖ´Ù¸é h_lengthÀÇ °ªÀº ´õ Ä¿Á®¼­ address º¯¼ö¿¡ ´õ ¸¹Àº µ¥ÀÌÅÍ°¡ º¹»çµÇ¾î ¹öÆÛ¿À¹öÇ÷ο찡 ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀ» À§ÀÇ Ç¥¿¡¼­Ã³·³ ±æÀ̸¦ °Ë»çÇÑ ÈÄ º¹»çÇÑ´Ù¸é ÇØ°áÇÒ ¼ö ÀÖ´Ù.

3. ´õ »ý°¢ÇØ¾ß ÇÒ ¹®Á¦

À§ÀÇ [Ç¥-2]¿¡¼­Ã³·³ Ãë¾àÇÑ ÇÔ¼ö¸¦ ¾ÈÀüÇÑ ´ëü ÇÔ¼ö·Î ¹Ù²å´Ù°í ¹öÆÛ¿À¹öÇ÷οìÀÇ ¸ðµç ¹®Á¦°¡ ÇØ°áµÇ´Â °ÍÀº ¾Æ´Ï¶ó´Â »ç½ÇÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.

⼔ snprintf()¿Í °°Àº ÇÔ¼ö´Â ISO 1990(ANSI 1989)ÀÇ Ç¥ÁØ C ÇÔ¼ö°¡ ¾Æ´Ï´Ù. ±×·¡¼­ ´ëºÎºÐÀÇ ½Ã½ºÅÛÀÌ sprintf()ÇÔ¼ö´Â Áö¿øÇÏ´õ¶óµµ snprintf() ÇÔ¼ö´Â Áö¿øÇÏÁö ¾ÊÀ» ¼ö ÀÖ°í Áö¿øÇÑ´Ù°í ÇÏ´õ¶óµµ snprintf() ÇÔ¼ö°¡ ¹Ù·Î sprintf() ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï µÇ¾î ÀÖ¾î ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦¿¡ ´ëÇÑ º¸È£±â´ÉÀ» Á¦´ë·Î ÇØÁÖÁö ¸øÇÏ´Â °æ¿ìµµ ÀÖ´Ù. ¾î¶² ¹öÀüÀÇ snprintf() ÇÔ¼ö¿¡¼­´Â NULL ¹®ÀÚ·Î ³¡³ªµµ·Ï º¸ÀåÇÏÁö ¾Ê¾Æ ±ä ½ºÆ®¸µÀÌ ÀԷµǸé NULL ¹®ÀÚ·Î ³¡³ªÁö ¾ÊÀ» ¼öµµ Àִµ¥ glib ¶óÀ̺귯¸®¿¡¼­´Â Ç×»ó NULL ¹®ÀÚ·Î ³¡³ª´Â g_snprintf() ÇÔ¼ö¸¦ Áö¿øÇÑ´Ù.

⼔ strlen() ÇÔ¼ö´Â NULL ¹®ÀÚ¸¦ ¸¸³¯ ¶§±îÁö ¹®ÀÚ¿­ÀÇ ¼ö¸¦ °è»êÇϴµ¥ NULL ¹®ÀÚ·Î ³¡³ªÁö ¾Ê´Â ¹®ÀÚ¿­À» ÀԷ¹ÞÀ» ¶§´Â ó¸®ÇÏÁö ¸øÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÁÖÀÇÇØ¾ß ÇÑ´Ù.

4. C++ÀÇ ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®Á¦

C++ ¾ð¾îµµ ºÎ°¡ÀûÀÎ º¸¾È ¹®Á¦Á¡À» °¡Áö°í Àִµ¥ C ÄÚµåÀÇ gets() ÇÔ¼ö¿Í °°Àº ¹öÆÛ¿À¹öÇÃ·Î¿ì °ø°ÝÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

char buf[128];

cin >> buf;

À§ÀÇ ÇÔ¼ö´Â ¹®ÀÚ¸¦ ÀÐÀ» ¶§ ¾î¶² ±æÀÌ °Ë»çµµ ÇÏÁö ¾Ê¾Æ¼­ ¹öÆÛ¿À¹öÇÃ·Î¿ì º¸¾È ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ¹öÆÛÀÇ ÃÖ´ë ÀÔ·Â ±æÀ̸¦ ¾Ë±â À§Çؼ­´Â cin.width() ¸â¹öÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¥¶. ·¹À̽ºÄÁµð¼Ç º¸¾È

Á¢±Ù ±ÇÇÑÀ» Æı«Çϰųª ÆÄÀÏ »ý¼ºÀ» Æı«ÇÒ ¼ö ÀÖ´Â ¹®Á¦¸¦ °¡Áö´Â °æÀï »óÅ°¡ º¸¾È ¹®Á¦¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æÀï »óÅ´ ´ÙÀ½°ú °°Àº »óȲ¿¡¼­ ¹ß»ýÇÑ´Ù.

- Á¢±Ù ±ÇÇÑ Ã¼Å©³ª »óÅ üũ´Â ÆÄÀϸíÀ» ÀÌ¿ëÇÒ ¶§ ¹ß»ýÇÑ´Ù.

- ÆÄÀÏ ¸í·ÉÀº °°Àº ÆÄÀÏÀ̸§ÀÇ ¸í·É¾î¸¦ ÅëÇØ ½ÇÇàµÈ´Ù.

¿©±â¼­ ÀϾ´Â ¹®Á¦´Â ù ¹ø°¿Í µÎ¹ø° ¸í·É¾î »çÀÌ¿¡ Á¢±Ù ±ÇÇÑÀ̳ª »óÅ üũ¸¦ üũÇϰųª ´Ù¸¥ ÆÄÀÏÀÌ ÆÄÀÏ ¸í·É¾î¸¦ ÂüÁ¶ÇÒ ¶§ °ø°ÝÀÚ°¡ ÆÄÀÏÀ» À§Á¶ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

ÀϹÝÀûÀ¸·Î ÀÌ Å¸ÀÔÀÇ °ø°ÝÀº ÇÁ·Î±×·¥ÀÇ ºÒ¾ÈÁ¤À» ÀÌ¿ëÇϱâ À§ÇØ ½Éº¼¸¯ ¸µÅ©¸¦ ÀÌ¿ëÇÑ´Ù. ºÒ¾ÈÁ¤ÇÑ setuid ÀÖ´Â ·çÆ® ÇÁ·Î±×·¥ ¼Ò½ºÄÚµåÀÇ ÀϺκÐÀ» ¿¹·Î º¸ÀÚ.

<ÇÁ·Î±×·¥-9> ·¹À̽ºÄÁµð¼ÇÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥

int unsafeopen(char *filename)

{

struct stat st;

int fd;

if (stat(filename, &st) != 0)

return -1;

if (st.st_uid != 0)

return -1;

fd = open(filename, O_RDWR, 0);

if (fd < 0)

return -1;

return fd;

}

À§ÀÇ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº Ư¡À» °¡Áö°í ÀÖ´Ù.

¨ç ÆÄÀϸíÀÌ Á¸ÀçÇÏ´ÂÁö üũÇÏ°í, ±× ÆÄÀÏÀÌ ·çÆ® ¼ÒÀ¯°¡ È®½ÇÇϸé ÆÄÀÏÀ» ¸¸µç´Ù.

¨è ÆÄÀÏÀ» ¿¬´Ù.

µÎ °³ÀÇ ºÐ¸®µÈ ½Ã½ºÅÛ È£ÃâÀÌ ÀϾ´Âµ¥ µÎ °³ÀÇ ¸í·É »çÀÌ¿¡ ½Ã°£ Áö¿¬ÀÖ´Ù. ÀÌ ½Ã°£ Áö¿¬³»¿¡¼­ ÆÄÀÏ°ú ½Ã½ºÅÛ Æ¯Â¡À» ¹Ù²Ù´Â °ÍÀÌ °¡´ÉÇÏ´Ù. °ø°ÝÀÚ´Â ¾Æ·¡ÀÇ ¹æ¹ýÀ¸·Î °¡´ÉÇÏ°Ô µÈ´Ù.

¨ç ·çÆ® ±ÇÇÑÀÇ ÆÄÀÏ(/etc/passwd)À» ½Éº¼¸¯ ¸µÅ©(/tmp/filename)·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù.

¨è stat()´Â ½Éº¼¸¯ ¸µÅ©¸¦ ÅëÇØ È£ÃâÇÑ´Ù. ±×¸®°í /etc/passwdÀÇ Á¤º¸¸¦ µÇµ¹¸°´Ù.

¨é °ø°ÝÀÚ´Â ½Éº¼¸¯ ¸µÅ©¸¦ ÇØÁ¦ÇÑ´Ù. ±×¸®°í ÆÄÀÏÀ» ÀÚ½ÅÀÇ ±ÇÇÑÀ¸·Î ÇÑ´Ù.

¨ê ÇÁ·Î±×·¥¿¡¼­ ÇöÀç ¿ì¿¬È÷µµ /tmp/filenameÀÌ ¿­·Á ÀÖÀ¸¸é, ·çÆ® ±ÇÇÑÀÇ ¶Ç ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÆÄÀÏÀÇ µ¥ÀÌÅÍ ´ë½Å¿¡ ÀÚ½ÅÀÇ µ¥ÀÌÅ͸¦ Àд´Ù.

<ÇÁ·Î±×·¥-10> ·¹À̽ºÄÁµð¼ÇÀÌ ¹ß»ýÇÏÁö ¾Ê´Â ÇÁ·Î±×·¥

int safeopen(char *filename)

{

struct stat st, st2;

int fd;

if (lstat(filename, &st) != 0)

return -1;

if (!S_ISREG(st.st_mode))

return -1;

if (st.st_uid != 0)

return -1;

fd = open(filename, O_RDWR, 0);

if (fd < 0)

return -1;

if (fstat(fd, &st2) != 0) {

close(fd);

return -1;

}

if (st.st_ino != st2.st_ino || st.st_dev != st2.st_dev) {

close(fd);

return -1;

}

return fd;

}


À§ÀÇ ÇÁ·Î±×·¥Àº ¾ÈÀüÇÏ°Ô ÀÛ¼ºµÈ ÇÁ·Î±×·¥À¸·Î stat() ´ë½Å¿¡ lstat()¸¦ »ç¿ëÇÑ´Ù. ¸¸ÀÏ ÁöÁ¤µÈ ÆÄÀÏÀÌ ½Éº¼¸¯ ¸µÅ©¸é ÀÌ°ÍÀº ¸µÅ©ÀÇ »óŸ¦ µ¹·ÁÁØ´Ù. ´ÙÀ½ ÆÄÀÏÀ» ¿­°í, ¿­¸° ÆÄÀÏÀÇ »óŸ¦ ¾ò´Â´Ù. »óÅ Á¤º¸ÀÇ inode¿Í device number´Â ºñ±³µÇ¾î ±×µéÀÌ µ¿ÀÏÇÏ´Ï ¾ÊÀ¸¸é ÁßÁöµÈ´Ù.

¥·. chroot()ÀÇ º¸¾È

À¯´Ð½º ½Ã½ºÅÛÀº ¿î¿µÃ¼Á¦ÀÇ °üÁ¡¿¡¼­ ÇÁ·Î±×·¥À» Á¦ÇÑÇÔÀ¸·Î½á ¿ÜºÎ¿¡ ³ëÃâµÇ´Â °ÍÀ» ¸·À» ¼ö ÀÖ´Â ´É·ÂÀÌ Àִµ¥ ÀÌ·¯ÇÑ ±â´ÉÀ» chroot() ÇÔ¼ö°¡ ¼öÇàÇÑ´Ù.

int chroot(const char *path);

chroot() ÇÔ¼ö¿¡¼­ÀÇ path´Â »õ·Î¿î ÆÄÀϽýºÅÛÀÇ root µð·ºÅ丮·Î ÀνĵǾî ÆÄÀϽýºÅÛÀÇ ´Ù¸¥ ºÎºÐ¿¡ ´ëÇÑ Á¢±ÙÀº Á¦ÇѵȴÙ

if (chroot("/jail") < 0 || chdir("/") < 0)

perror("Failure setting new root directory");

chroot() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °Íµµ ¼öÆÛÀ¯ÀúÀÇ ±ÇÇÑÀ» Á¦ÇÑÇÏ´Â ÁÁÀº ¹æ¹ýÀ̱⵵ ÇÑ´Ù.

¥¸. ÃÖ¼ÒÇÑÀÇ ±ÇÇÑ ¿ø¸®

1. ÃÖ¼ÒÇÑÀÇ ±ÇÇÑÀÇ Çʿ伺

´ëºÎºÐÀÇ ÇÁ·Î±×·¥Àº root³ª Ưº°ÇÑ ±ÇÇÑÀ» °¡Áø »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÏ°í ÀÖ´Â ½Ã½ºÅÛ ÀÚ¿ø¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â Ưº°ÇÑ ±ÇÇÑÀ» °¡Á®¾ß ÇÑ´Ù. ³×Æ®¿öÅ© ¼­ºñ½º¿Í °°Àº °æ¿ì ÀϹݻç¿ëÀÚ´Â »ç¿ëÇÒ ¼ö ¾ø´Â ±ÇÇÑÀÖ´Â TCP³ª UDP Æ÷Æ®¸¦ ÇÒ´çÇϱâ À§Çؼ­ Ưº°ÇÑ ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù. ·ÎÄà ±ÇÇÑÀÌ ÀÖ´Â ÇÁ·Î±×·¥Àº ¸Þ¸ð¸®³ª µð½ºÅ©, ½Ã½ºÅÛ ±¸¼º Á¤º¸ µîÀÇ Á¦ÇÑµÈ ½Ã½ºÅÛ ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ƯÈ÷ ¸ðµç ÀÚ¿øµé¿¡ ´ëÇØ ÃʱâÈ­ÇÏ°í ±ÇÇÑÀ» ³·Ãß´Â °ÍÀº Ưº°ÇÑ ±ÇÇÑÀ» °¡Áö°í ½ÇÇàµÇ´Â ÇÁ·Î±×·¥¿¡¼­´Â Áß¿äÇÏ´Ù.

2. ÃÖ¼ÒÇÑÀÇ ±ÇÇÑ ¼³Á¤ ¹æ¹ý

±ÇÇÑÀ» ³·Ãß±â À§Çؼ­´Â ÇÁ·Î¼¼½ºÀÇ EUID¿Í EGID¸¦ ´õ ³·Àº ±ÇÇÑÀ¸·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÀÓÀÇ·Î ±ÇÇÑÀ» ³·Ã߰ųª Á¦°ÅÇϱâ À§Çؼ­´Â seteuid()¿Í setegid() ÇÔ¼ö°¡ ÇÊ¿äÇÏ°í ¿µ±¸ÀûÀ¸·Î ±ÇÇÑÀ» Á¦°ÅÇϱâ À§Çؼ­´Â setuid()¿Í setgid() ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

2.1 ³×Æ®¿öÅ© ¼­ºñ½º¿¡¼­ ±ÇÇÑ ³·Ãß±â

³×Æ®¿öÅ© ¼­ºñ½ºÀÇ ±ÇÇÑÀ» ³·Ãß±â À§Çؼ­´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇÀÚ¸¶ÀÚ ±ÇÇÑÀ» ³·Ãß¾î¾ß ÇÑ´Ù. º¸Åë ÃÖ¼ÒÇÑÀÇ Á¢±Ù ±ÇÇÑÀ» °¡Áø »ç¿ëÀÚ¸¦ "nobody"·Î »ç¿ëÇÑ´Ù.

<ÇÁ·Î±×·¥-11> ÃÖ¼ÒÇÑÀÇ ±ÇÇÑ

int drop()

{

struct passwd *pep = getpwnam("nobody");

if(!pep)

return -1;

if(setgid(pep->pw_gid) < 0)

return -1;

if(setuid(pep->pw_uid) < 0)

return -1;

return 0;

}

ƯÈ÷ À§ÀÇ ÇÁ·Î±×·¥¿¡ setuid¸¦ ¼³Á¤Çϱâ Àü¿¡ setgid¸¦ ¸ÕÀú ¼³Á¤ÇÒ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº setuid¸¦ ¸ÕÀú ¼³Á¤ÇÏ¿´À» °æ¿ì ±ÇÇÑÀÌ gid°¡ °¡Áö°í ÀÖ´Â ±ÇÇѺ¸´Ù ³·¾ÆÁ® ±ÇÇÑÀ» ¼öÁ¤ÇÒ ¾ø°Ô µÉ ¼ö Àֱ⠶§¹®¿¡ setgid ¸ÕÀú ¼³Á¤ÇÑ´Ù.

2.2 ·ÎÄà setuid ÇÁ·Î±×·¥¿¡¼­ ±ÇÇÑ ³·Ãß±â

±ÇÇÑÀÖ´Â SUID/SGID ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â °æ¿ì ÇÁ·Î¼¼½ºÀÇ RUID¿Í RGID´Â ÇÁ·Î±×·¥À» ½ÇÇàÇÑ »ç¿ëÀÚÀÇ uid¿Í gidÀÌÁö¸¸ EUID¿Í EGID, saved UID, saved GIDÀº ÆÄÀÏÀÇ ¼ÒÀ¯ÀÚ³ª ±×·ìÀÇ ±ÇÇÑÀ¸·Î ¼³Á¤µÈ´Ù.

ÀÌ·± SUID ÇÁ·Î±×·¥´Â ±ÇÇÑÀ» Àӽ÷γª ¿µ±¸ÀûÀ¸·Î ±ÇÇÑÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

⼔ ±ÇÇÑÀ» ¿µ±¸ÀûÀ¸·Î ³·Ãß±â

±ÇÇÑÀ» ¿µ±¸ÀûÀ¸·Î ³·Ãß±â À§Çؼ­´Â ÇÁ·Î±×·¥ÀÇ EUID, EGID SUID¿Í SGID¸¦ RUID¿Í RGID·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. setuid()¿Í setgid() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© RUID/RGID·Î ¼³Á¤Çϸé EUID/SUID/RUID´Â ¸ðµÎ º¯ÇÑ´Ù.

<ÇÁ·Î±×·¥-12> ¿µ±¸ÀûÀ¸·Î ±ÇÇÑ ³·Ãß´Â ÇÁ·Î±×·¥

if(setgid(getgid()) < 0)

return -1;

if(setuid(getuid()) < 0)

return -1;

⼔ ±ÇÇÑÀ» Àӽ÷Π³·Ãß±â

Àӽ÷Π±ÇÇÑÀ» ³·Ãß±â À§ÇÏ¿© EUIDÀÇ °ªÀ» ¿øÇÏ´Â °ªÀ¸·Î ¼³Á¤ÇÑ´Ù. EUIDÀº ½Ã½ºÅÛ ÇÔ¼ö³ª ±ÇÇÑ °Ë»ç¸¦ ¼öÇàÇÒ ¶§ »ç¿ëµÇ¹Ç·Î ´ÙÀ½¿¡ »ç¿ëÇϱâ À§ÇÏ¿© ÀÌ °ªÀ» ÀúÀåÇØ ³õ´Â´Ù.

<ÇÁ·Î±×·¥-13> ÀÓ½ÃÀûÀ¸·Î ±ÇÇÑÀ» ³·Ãß´Â ÇÁ·Î±×·¥

struct passwd *pep = getpwnam("nobody");

uid_t saved_uid;

gid_t saved_gid;

if (!pep)

return -1;

saved_uid = geteuid();

saved_gid = getegid();

if (setegid(pep->pw_gid) < 0)

return -1;

if (seteuid(pep->pw_uid) < 0)

return -1;

/* perform desired unprivileged operations then revert back */

if (setegid(saved_gid) < 0)

return -1;

if (seteuid(saved_uid) < 0)

return -1;


¸¶Ä¡¸ç

Áö±Ý±îÁö Àü¹ÝÀûÀ¸·Î À¯´Ð½º ÇÁ·Î±×·¥ ÀÛ¼º½Ã À¯ÀÇÇØ¾ß ÇÒ »çÇ×°ú ¾î¶»°Ô ÀÛ¼ºÇØ¾ß ¾ÈÀüÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö Àִ°¡¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸¾Ò´Ù. À§¿¡¼­ ¼³¸íÇÑ °Í°ú °°ÀÌ ÇÁ·Î±×·¥À» ÀÛ¼ºÇß´Ù°í ¿ÏÀüÇÏ°Ô ¾ÈÀüÇÑ ÇÁ·Î±×·¥Àº ¾Æ´Ï´Ù. ´Ù¸¸ ¾ÈÀü¼ºÀ» °í·ÁÇÏÁö ¾ÊÀº ÇÁ·Î±×·¥º¸´Ù´Â ¾àÁ¡À̳ª ÇêÁ¡ÀÌ ¾ø´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÀÚ´Â Àǵµ¿¡¼­ ÀÌ Áöħ¼­ ÀÛ¼ºÇÑ °ÍÀÌ´Ù. ´ëºÎºÐ ÇØÅ· °ø°ÝÀÇ ¿øÀÎÀÌ µÇ´Â Ãë¾àÁ¡µéÀÌ ¿î¿µÃ¼Á¦³ª ½Ã½ºÅÛ ÇÁ·Î±×·¥µîÀÇ ¾ÈÀü¼ºÀ» °í·ÁÇÏÁö ¾ÊÀº Äڵ忡¼­ ³ª¿Â´Ù°í ÇÒ ¼ö Àֱ⠶§¹®¿¡ ÀÌ Áöħ¼­´Â ½ÇÁ¦ ÇÁ·Î±×·¥À» °³¹ßÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù.

¶ÇÇÑ ÇØÅ· °ø°Ý ¹æ¹ýÀÌ ¼³¸íÇÑ ¹æ¹ýµé¿¡¸¸ ¸Ó¹«¸£Áö ¾Ê°í °è¼Ó º¯È­ÇÏ°í °³¹ßµÇ¾îÁö¹Ç·Î ¾ÈÀüÇÑ ¼Ò½ºÄÚµå Áöħ¼­µµ ±×¿¡ µû¶ó ¼öÁ¤µÇ°í ¹öÀü¾÷µÇ¾î¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù.

<Âü°í¹®Çå>

[1] Simson Garfinke and Gene Spafford, "Practical UNIX & Internet Security", O'Reilly & Associates, Inc., 2nd Edition, April 1996.

[2] Nemeth¡¤Snyder¡¤Seebass¡¤Hein, "Unix System Administration Handbook", A Division of Simon & Schusyer, Inc., Third Edition, October 1998.

[3] Grahan Glass Àú. Á¶°æ»ê ¿ª, "ÇÁ·Î±×·¡¸Ó¿Í »ç¿ëÀÚ¸¦ À§ÇÑ UNIX ¿Ï¼º", ÀÌÇÑÃâÆÇ»ç, March 1998.

[4] David A. Wheeler, "Secure Programming for Linux and Unix HOWTO", 1999.

[5] whitefang.com, "Secure UNIX Programming FAQ", 1999.

[6] M. Bishop, "Writing Safe Privileged Programs," Network Security 1997.

[7] M. Bishop, "How to Write a Setuid Program," 1986.

[8] ``Secure Programming Guidelines''. FreeBSD, Inc. 1999.

[9] AUSCERT and O'Reilly, "Lab Engineers Check List for Writing Secure Unix Code.", 1996

[10] NCSA "Secure Programming Guidelines".

[11] SETUID manual page.




Ãâó : cert
     
15   MySQL ¿¡·¯Äڵ庰 ¿¡·¯¸Þ¼¼Áö ÀÔ´Ï´Ù.  1day 05¡¤08¡¤16 474176
14   ÀÎÅͳÝÀÇ »Ñ¸® TCP/IP ³×Æ®¿öÅ© ¹Ù·Î¾Ë±â  1day 04¡¤02¡¤12 38400
13   ·¹µåÇÞ ½Ã½ºÅÛ ÃÖ½ÅÀ¸·Î À¯ÁöÇÏ±â  1day 04¡¤02¡¤03 36410
12   Sendmail ¸ÞÀϼ­¹öÀÇ ½ºÆÔ¸±·¹ÀÌ ´ëÀÀ¹æ¹ý  1day 04¡¤02¡¤01 40809
11   Ä§ÇØ»ç°í ´ëÀÀ¹æ¹ý ¹× ÀýÂ÷  1day 04¡¤02¡¤01 37396
10   ³×Æ®¿öÅ© ½º´ÏÇÎ ±â¼ú ¹× ¹æÁö´ëÃ¥  1day 04¡¤02¡¤01 46181
9   À©µµ¿ì NT¼­¹ö ¹× IIS º¸¾È °ü¸®  1day 04¡¤02¡¤01 47103
8   Solaris Network Kernel Tunning for Security  1day 04¡¤01¡¤31 40999
  ¾ÈÀüÇÑ À¯´Ð½º ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Áöħ¼­ V.0.7  1day 04¡¤01¡¤30 40218
6   Abnormal IP Packets  1day 04¡¤01¡¤28 42406
5   DNS ¾ÈÀü¿î¿ë°¡ÀÌµå  1day 04¡¤01¡¤20 53824
4   MTX ¿ú¹ÙÀÌ·¯½º ºÐ¼® º¸°í¼­  1day 04¡¤01¡¤17 38976
3   IP FragmentationÀ» ÀÌ¿ëÇÑ °ø°Ý±â¼úµé  1day 04¡¤01¡¤14 40195
2   ¸®´ª½º ½Ã½ºÅÛ °ü¸®ÀÚ¸¦ À§ÇÑ º¸¾È Áöħ¥°  1day 04¡¤01¡¤14 39376
1   ¿î¿µÃ¼Á¦¿Í Ä¿³Î Â÷¿ø¿¡¼­ÀÇ Æ©´× ¹× º¸..  1day 04¡¤01¡¤11 37023
1
Copyright 1999-2025 Zeroboard / skin by GGAMBO
Copyright (c) 2003~2004 by 1day all rights reserved.