Jump to content

setuid

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning

유닉스 접근 권한 플래그 setuidsetgid ("set user ID"와 "set group ID"의 약어)는 사용자에게 각각 실행-파일의 소유자 또는 그룹의 파일 시스템 허가권을 갖는 실행 파일을 실행하고 디렉토리에서 동작을 변경하는 것을 허용합니다.[1] 그것들은 종종 컴퓨터 시스템에서 사용자에게 특정 임무를 수행하기 위해 일시적으로 상승된 권한과 함께 프로그램을 실행하도록 허용하기 위해 사용됩니다. 제공된 가정된 사용자 ID 또는 그룹 ID 권한이 항상 상승되는 것은 아니지만, 최소한 그것들은 특정적입니다.

플래그 setuidsetgid는 로그인 암호를 변경하기 위해 시스템 파일이나 데이터베이스를 변경하는 능력과 같이 통상적으로 사용자에게 부여되는 권한과 다른 권한이 필요한 임무에 필요합니다.[2] 그러나, 네트워크 인터페이스에서 제어 패킷을 보내고 수신해야 하는 ping 명령과 같은 추가 권한이 필요한 작업 중 일부는 즉시 명확하지 않을 수 있습니다.

Effects

setuidsetgid 플래그는 그것들이 파일, 디렉토리 또는 이진 실행 파일 또는 비-이진 실행 파일에 적용되는지 여부에 따라 다른 효과를 갖습니다. setuidsetgid 플래그는 오직 이진 실행 파일에 영향을 미치고 스크립트 (예를 들어, Bash, Perl, Python)에는 영향을 미치지 않습니다.[3]

When set on an executable file

setuid 또는 setgid 속성은 실행 파일에 설정될 때, 파일을 실행할 수 있는 임의의 사용자는 설정된 플래그에 따라 파일의 소유자 (공통적으로 루트) 및/또는 파일의 그룹의 권한으로 파일을 자동으로 실행합니다.[2] 이것은 시스템 설계자에게 사용자가 실행하도록 허용되지 않는 신뢰할 수 있는 프로그램을 실행되도록 수용하는 것을 허용합니다. 이것들이 항상 명확하게 되지는 않을 수 있습니다. 예를 들어, ping 명령은 정규 사용자가 접근할 수 없는 네트워킹 권한에 접근해야 할 수 있습니다; 따라서, 자신의 계정에 패킷을 보내는 데 필요한 권한이 없더라도, 또 다른 시스템을 ping해야 하는 사용자가 그렇게 할 수 있도록 setuid 플래그가 제공될 수 있습니다.

보안을 위해, 호출하는 사용자는 보통 시스템에서 ptrace, LD_LIBRARY_PATH를 사용하거나, 상승된 권한을 악용하기 위해 신호를 보내는 것과 같은 임의의 방법으로 새로운 프로세스를 변경하는 것을 금지하지만, 터미널로부터 신호는 여전히 허용될 것입니다.

setuidsetgid 비트는 통상적으로 setuid에 대해 상위 팔진수를 4로 설정하거나 setgid에 대해 2로 설정함으로써 chmod 명령으로 설정됩니다. "chmod 6711 file"은 setuidsetgid 비트 (4+2=6)를 모두 설정할 것이며, 파일을 소유자 (7)에 대해 읽기/쓰기/실행 가능하게 만들고 그룹 (첫 번째 1)과 다른 사람들 (두 번째 1)에서 실행 가능하게 만듭니다. 소유자가 아닌 다른 사용자가 파일을 실행할 때, 프로세스는 소유자에 의해 설정된 사용자와 그룹 허가권으로 실행될 것입니다. 예를 들어, 파일이 사용자 root와 그룹 wheel에 의해 소유되면, 누가 파일을 실행하든 상관없이 root:wheel로 실행될 것입니다.

chmod 명령의 대부분의 구현은 역시 이들 비트를 설정하기 위해 보다-세분화된, 기호 인수를 지원합니다. 바람직하게는 세분화된-모드가 아래 데모에서 "chmod ug+s"로 표시됩니다.

Security impact

setuid 기능은 많은 경우에 매우 유용하지만, 만약 setuid 속성이 신중하게 설계되지 않은 실행 프로그램에 할당되면, 그것의 부적절한 사용이 보안 위험에 빠질 수 있습니다.[2] 잠재적인 보안 문제로 인해,[4] 많은 운영 시스템은 실행 가능한 쉘 스크립트에 적용될 때 setuid 속성을 무시합니다.

setuid 실행 파일의 존재는 chroot 시스템 호출이 유닉스에서 루트가 아닌 사용자에게 유용하지 않는 이유를 설명합니다. 자세한 내용에 대해 chroot의 제한 사항을 참조하십시오.

When set on a directory

디렉토리에 대한 setgid 허가권을 설정 ("chmod g+s")하면 그것 내부에 생성된 새로운 파일과 하위디렉토리를 파일을 생성했던 사용자의 주요 그룹 ID (소유자 ID는 영향을 받지 않고, 오직 그룹 ID가 영향을 받음)가 아닌, 그룹 IP를 상속하는 원인이 됩니다.

  1. 새로 생성된 하위디렉터리는 setgid 비트를 상속합니다. 따라서, 이것은 그룹 구성원에게 새로운 파일이나 디렉터리를 만들기 전에 현재 그룹을 명시적으로 변경을 요구하는 불편함없이 그룹에 대해 공유 작업 공간을 활성화합니다.
  2. setgid 비트가 설정된 후에 생성된 새로운 파일과 하위디렉터리의 그룹 ID에만 영향을 미치고, 기존 엔터티에는 적용되지 않습니다.
  3. 다른 곳에서 생성되고 해당 디렉토리로 이동된 파일의 그룹 ID에는 영향을 미치지 않습니다. 파일은 그것이 생성된 시기와 위치에 영향을 받은 그룹 ID를 계속 유지할 것입니다.

기존 하위디렉토리에 setgid를 설정하려면 find /path/to/directory -type d -exec chmod g+s '{}' \; 와 같은 명령과 함께 수동으로 행해져야 합니다.

디렉토리에 설정된 setuid 허가권은 대부분의 유닉스리눅스 시스템에서 무시됩니다.[citation needed] 어쨌든, FreeBSDsetgid와 유사한 방식으로 setuid를 해석하도록 구성될 수 있으며, 이 경우에서 그것은 디렉토리에 생성된 모든 파일과 하위-디렉토리를 해당 디렉토리의 소유자에 의해 소유된 것으로 강제합니다 - 단순한 형식의 상속입니다.[5] 이것은 일반적으로 BSD에서 파생된 대부분의 시스템에서 필요하지 않는데, 왜냐하면 기본적으로 디렉토리는 실제 값에 관계없이 setgid 비트가 항상 설정된 것처럼 취급되기 때문입니다. open(2)에 설명된 것처럼, "새 파일이 생성될 때 그것을 포함하는 디렉토리의 그룹이 주어집니다."[6]

Examples

Checking permissions

파일의 허가권은 명령줄 도구 stat와 함께 팔진수 형식 및/또는 알파벳 형식으로 확인될 수 있습니다:

[ torvalds ~ ] $ stat -c "%a %A" ~/test/
1770 drwxrwx--T

SUID

'루트' 및 '루트' 그룹에 의해 소유된 실행 파일에 대한 4701

'thompson'이라는 사용자가 파일을 실행하려고 시도합니다. 모든 사용자에 대해 실행 허가권이 설정 ('1')되므로 'thompson'이 파일을 실행할 수 있습니다. 파일 소유자는 '루트'이고 SUID 허가권은 설정 ('4')되어 있으므로 파일은 '루트'로 실행됩니다.

실행 파일이 '루트'로 실행되는 이유는 사용자에게 전체 루트 접근 권한을 부여하지 않고 통상적으로 허용되지 않는 특정 파일을 수정할 수 있기 때문입니다.

이것의 기본 사용은 /usr/bin/passwd 이진 파일에서 볼 수 있습니다. /usr/bin/passwd는 모든 사용자에 대한 계정 정보와 암호 해시를 저장하는 /etc/passwd/etc/shadow를 수정해야 하고, 이것들은 오직 'root' 사용자에 의해 수정될 수 있습니다.

[ thompson ~ ] $ stat -c "%a %U:%G %n" /usr/bin/passwd
4701 root:root /usr/bin/passwd

[ thompson ~ ] $ passwd
passwd: Changing password for thompson

프로세스의 소유자는 실행 파일을 실행하는 사용자가 아니라 실행 파일의 소유자입니다.

SGID

'root' 사용자와 'engineers' 그룹에 의해 소유된 'music' 디렉토리에 2770

주로 'torvalds' 그룹에 속하지만 이차적으로 'engineers' 그룹에 속하는 'torvalds'라는 이름의 사용자는 'music'이라는 디렉토리 아래에 'electronic'이라는 디렉토리를 만듭니다. 'electronic'이라는 새 디렉토리의 그룹 소유권은 'engineers'를 상속합니다. 이것은 'imagine.txt'라는 새 파일을 만들 때도 같습니다.

SGID없이 새 디렉토리/파일의 그룹 소유권은 'torvalds' 사용자의 주요 그룹인 'torvalds'가 됩니다.

[ torvalds ~ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds ~ ] $ stat -c "%a %U:%G %n" ./music/
2770 root:engineers ./music/

[ torvalds ~ ] $ mkdir ~/music/electronic

[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/electronic/
torvalds:engineers ./music/electronic/

[ torvalds ~ ] $ echo 'NEW FILE' > ./music/imagine.txt

[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/imagine.txt
torvalds:engineers ./music/imagine.txt

[ torvalds ~ ] $ touch ~/test

[ torvalds ~ ] $ stat -c "%U:%G %n" ~/test
torvalds:torvalds ~/test

Sticky bit

사용자 'torvalds'와 그룹 'engineers'에 의해 소유된 'videogames'라는 디렉토리에 1770

'torvalds'라는 사용자는 'videogames'라는 디렉토리 아래에 'tekken'이라는 파일을 만듭니다. 역시 'engineers' 그룹에 속한 'wozniak'이라는 사용자가 'tekken'이라는 파일을 삭제하려고 시도하지만 소유자가 아니기 때문에 삭제할 수 없습니다.

스티키 비트없이, 'wozniak'는 그 파일을 삭제할 수 있는데, 왜냐하면 'videogames'라는 디렉토리는 'engineers'에 의해 읽기와 쓰기 허가권을 가지기 때문입니다. 이 기본 사용법은 /tmp 폴더에서 볼 수 있습니다.

[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds /home/shared/ ] $ stat -c "%a  %U:%G  %n" ./videogames/
1770  torvalds:engineers  ./videogames/

[ torvalds /home/shared/ ] $ echo 'NEW FILE' > videogames/tekken

[ torvalds /home/shared/ ] $ su - wozniak
Password:

[ wozniak ~/ ] $ groups wozniak
wozniak : wozniak engineers

[ wozniak ~/ ] $ cd /home/shared/videogames

[ wozniak /home/shared/videogames/ ] $ rm tekken
rm: cannot remove ‘tekken’: Operation not permitted

Sticky bit with SGID

'engineers' 그룹과 'root' 사용자에 의해 소유된 'blog'라는 디렉토리에 3171

주로 'torvalds' 그룹에 속하지만 이차적으로 'engineers' 그룹에 속해 있는 'torvalds'라는 이름의 사용자는 'blog' 디렉토리 안에 'thinks'라는 파일이나 디렉토리를 만듭니다. 역시 'engineers' 그룹에 속한 'wozniak'이라는 이름의 사용자는 'thinks'라는 이름의 파일이나 디렉토리를 삭제하거나 이름을 바꾸거나 이동할 수 없는데, 왜냐하면 그는 소유자가 아니고 스티키 비트가 설정되어 있기 때문입니다. 어쨌든, 'thoughts'가 파일이면 'wozniak'이 그것을 편집할 수 있습니다.

스티키 비트가 최종 결정권을 가집니다. 만약 스티키 비트와 SGID가 설정되지 않으면, 'blog'라는 디렉토리는 그룹별로 읽기 및 쓰기를 허용하고 'wozniak'은 그룹에 속하기 때문에 사용자 'wozniak'은 'thinks'라는 파일의 이름을 바꾸거나 이동하거나 삭제할 수 있고, 기본 0002 umask는 그룹별로 편집될 수 있는 새로운 파일을 허용합니다. 스티키 비트 및 SGID는 읽기-전용 umask 또는 덧붙임-전용 속성과 같은 어떤 것과 결합될 수 있습니다.

[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds /home/shared/ ] $ stat -c "%a  %U:%G  %n" ./blog/
3171  root:engineers  ./blog/

[ torvalds /home/shared/ ] $ echo 'NEW FILE' > ./blog/thoughts

[ torvalds /home/shared/ ] $ su - wozniak
Password:

[ wozniak ~/ ] $ cd /home/shared/blog

[ wozniak /home/shared/blog/ ] $ groups wozniak
wozniak : wozniak engineers

[ wozniak /home/shared/blog/ ] $ stat -c "%a  %U:%G  %n" ./thoughts
664  torvalds:engineers  ./thoughts

[ wozniak /home/shared/blog/ ] $ rm thoughts
rm: cannot remove ‘thoughts’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ mv thoughts /home/wozniak/
mv: cannot move ‘thoughts’ to ‘/home/wozniak/thoughts’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ mv thoughts pondering
mv: cannot move ‘thoughts’ to ‘pondering’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ echo 'REWRITE!' > thoughts

[ wozniak /home/shared/blog/ ] $ cat thoughts
REWRITE!

Security

개발자는 버퍼 오버런경로 주입을 포함한 보안 취약성을 피하기 위해 실행 파일에서 이 비트를 사용하는 프로그램을 신중하게 설계하고 구현합니다. 취약한 응용 프로그램에 대한 성공적인 버퍼 오버런 공격은 공격자에게 악용되는 프로세스의 권한 아래에서 임의 코드를 실행하는 것을 허용합니다. 취약한 프로세스가 setuid 비트를 루트로 실행하도록 사용하는 사건에서, 코드는 루트 권한으로 실행될 것이고, 사실상 공격자에게 취약한 프로세스가 실행 중인 시스템에 대한 루트 접근 권한을 제공합니다.

setuid 프로세스의 경우에서 특히 중요한 것은 프로세스 환경입니다. 만약 환경이 권한 있는 프로세스에 의해 적절하게 삭제되지 않으면, 그것의 동작은 그것을 시작했던 권한 없는 프로세스에 의해 변경될 수 있습니다.[7] 예를 들어, GNU libc는 한때 신뢰할 수 없는 공유 라이브러리에서 코드를 실행할 수 있는 환경 변수와 setuid를 사용하는 익스플로잇에 취약했습니다.[8]

History

setuid 비트는 데니스 리치에 의해 발명되었고,[9] su에 포함되었습니다.[9] 그의 고용주였던, Bell Telephone Laboratories는 1972년에 특허를 신청했습니다; 이 특허는 1979년 특허 번호 US 4135240  "Protection of data file contents"로 부여되었습니다. 특허는 나중에 공개 도메인에 배치되었습니다.[10]

See also

References

  1. ^ von Hagen, William (2010-05-13). Ubuntu Linux Bible. pp. 3–59. ISBN 9780470881804.
  2. ^ a b c Frisch, Æleen (2009-02-09). Essential system administration. O'Reilly. p. 351. ISBN 9780596550493.
  3. ^ Billimoria, Kaiwan N. (2018). Hands-On System Programming with Linux: Explore Linux system programming interfaces, theory, and practice. Packt Publishing Ltd. p. 250. ISBN 978-1-78899-674-7.
  4. ^ "Unix - Frequently Asked Questions".
  5. ^ "chmod -- change file modes". freebsd.org.
  6. ^ "open, openat -- open or create a file for reading, writing or executing". freebsd.org.
  7. ^ Brown, Neil (November 23, 2010). "Ghosts of Unix past, part 4: High-maintenance designs". LWN.net. Retrieved 30 March 2014.
  8. ^ Edge, Jake (October 27, 2010). "Two glibc vulnerabilities". LWN.net. Retrieved 30 March 2014.
  9. ^ a b McIlroy, M. Douglas (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  10. ^ "Summary of key software patents".

External links