PromleeBlog
sitemap
aboutMe

posting thumbnail
정보보안기사 - 1.3 특수 권한(SetUID)의 위험성과 보안 설정
Risks of Special Permissions SetUID and Security Configuration - InfoSec Engineer 1.3

📅

들어가기 전에 🔗

지난 시간에는 파일의 읽기(Read), 쓰기(Write), 실행(Execute) 권한을 다루는 방법을 배웠습니다.
일반적인 환경에서는 이 세 가지 권한만으로도 접근 제어가 가능하지만, 시스템을 운영하다 보면 특수한 상황이 발생합니다.

가장 대표적인 예가
비밀번호 변경
입니다.
사용자의 계정 정보가 담긴 /etc/shadow 파일은 관리자(
root
)만이 수정할 수 있습니다.
그런데 일반 사용자가 passwd 명령어를 통해 자신의 비밀번호를 변경하면, 결과적으로 이 파일이 수정됩니다.
권한이 없는 일반 사용자가 어떻게 관리자 전용 파일을 수정할 수 있을까요?

이 모순을 해결하기 위해 리눅스에는
특수 권한
이라는 메커니즘이 존재합니다.
오늘은 이 특수 권한이 어떻게 동작하며, 왜 보안 관리자가 가장 주의 깊게 모니터링해야 하는지 알아보겠습니다.

특수 권한의 종류와 동작 원리 🔗

특수 권한은 기존의 권한 비트 외에 추가적인 기능을 부여하며, 4자리 8진수 표기법 중 맨 앞자리를 사용합니다.

1. SetUID (4000) 🔗

2. SetGID (2000) 🔗

3. Sticky Bit (1000) 🔗

일반 실행(사용자 UID 유지) vs SetUID 실행(파일 소유자 UID로 일시적 변경)
일반 실행(사용자 UID 유지) vs SetUID 실행(파일 소유자 UID로 일시적 변경)

특수 권한 확인 및 설정 실습 🔗

특수 권한은 ls -l 명령어로 확인할 수 있으며, chmod 명령어로 설정할 수 있습니다.
직접 파일을 만들고 권한을 변경해 보며 표기법을 익혀보겠습니다.

실습: SetUID 파일 확인 🔗

시스템에 존재하는 대표적인 SetUID 파일을 확인해 봅니다.
Terminal
ls -l /usr/bin/passwd
출력 결과
-rwsr-xr-x 1 root root 68208 Feb  7  2024 /usr/bin/passwd
소유자 권한 부분의 세 번째 글자가 x가 아닌 s로 되어 있음을 확인할 수 있습니다.

실습: 권한 설정 및 제거 🔗

테스트용 파일을 생성하고 특수 권한을 부여해 봅니다.
Terminal
 # 1. 테스트 파일 생성
touch setuid_test
touch sticky_dir
 
 # 2. SetUID 설정 (4000번대)
 # 숫자 모드: 4(SetUID) + 755
chmod 4755 setuid_test
 # 심볼릭 모드: user에게 s 권한 추가
chmod u+s setuid_test
 
 # 3. Sticky Bit 설정 (1000번대)
 # 숫자 모드: 1(Sticky) + 777
chmod 1777 sticky_dir
 # 심볼릭 모드: other에게 t 권한 추가
chmod o+t sticky_dir
숫자 모드로 SetUID, Sticky Bit 설정
숫자 모드로 SetUID, Sticky Bit 설정

[참고] 대문자 S와 T의 의미 🔗

만약 실행 권한(x)이 없는 상태에서 특수 권한만 부여하면, ls 결과에 대문자 S 또는 T가 나타납니다.
이는 실행 권한이 없어 특수 권한이 실제로 동작하지 않는다는 경고 표시입니다.

SetUID의 위험성과 권한 상승 공격 🔗

SetUID는 시스템 운영에 필수적이지만, 공격자에게는
권한 상승
(Privilege Escalation)을 위한 최고의 매개체가 됩니다.
만약
root
소유의 쉘(/bin/bash) 파일에 SetUID가 설정된다면 시스템은 무방비 상태가 됩니다.

[시나리오] 백도어 생성 원리 🔗

공격자가 시스템에 침투하여 일시적으로
root
권한을 얻었거나, 관리자가 실수로 권한을 잘못 설정했을 때 발생할 수 있는 상황입니다.
  1. 쉘 복사
    공격자는 /bin/bash를 숨겨진 경로(/tmp/.hidden_shell)로 복사합니다.
  2. SetUID 설정
    복사한 파일에 SetUID 권한(4755)을 부여합니다.
    이때 파일의 소유자는
    root
    여야 합니다.
  3. 권한 상승
    공격자는 나중에 일반 계정으로 접속하여 /tmp/.hidden_shell을 실행합니다.
    이 파일은 실행되는 순간
    root
    권한을 획득하므로, 공격자는 손쉽게 루트 쉘을 얻게 됩니다.
이러한 위험 때문에 보안 가이드라인에서는
SetUID가 설정된 파일의 목록을 주기적으로 관리
하도록 권고합니다.

보안 설정: 불필요한 SetUID 색출 🔗

시스템 관리자는 주기적으로 시스템 전체를 스캔하여, 의도하지 않은 SetUID/SetGID 파일을 찾아내야 합니다.
find 명령어를 활용하면 이를 효율적으로 수행할 수 있습니다.

실습: 특수 권한 파일 검색 🔗

Terminal
 # -perm 옵션: 권한 비트를 기준으로 검색
 # -4000: SetUID가 설정된 파일 (최소 조건 포함)
 # -type f: 디렉토리가 아닌 일반 파일만 검색
 # 2>/dev/null: 'Permission denied' 에러 메시지는 출력하지 않음
 
find / -user root -perm -4000 -type f 2>/dev/null
위 명령어를 실행하면 /usr/bin/passwd, /usr/bin/sudo 등 합법적인 파일들이 출력됩니다.
하지만 리스트에서
생소한 파일명
이나,
홈 디렉토리, 임시 디렉토리(/tmp, /var/tmp)
등에 위치한 파일이 발견된다면 즉시 침해 여부를 분석하고 권한을 제거해야 합니다.

권한 제거 방법 🔗

Terminal
 # SetUID 권한 제거 (s -> x)
chmod u-s setuid_test
 # 또는 절대 모드로 권한 재설정
chmod 0755 setuid_test
 
 # Sticky Bit 권한 제거 (t -> x)
chmod o-t sticky_dir
 # 또는 절대 모드로 권한 재설정
chmod 0777 sticky_dir
심볼릭 모드로 SetUID, Sticky Bit 설정 제거
심볼릭 모드로 SetUID, Sticky Bit 설정 제거

/tmp 디렉토리와 Sticky Bit 🔗

/tmp 디렉토리는 시스템의 모든 사용자가 임시 파일을 생성하고 공유하는 공간입니다.
따라서 권한이 777(rwxrwxrwx)로 설정되어 있어야겠죠.
하지만 이 설정에는 치명적인 약점이 있습니다.
"누구나 쓸 수 있다"는 것은 "누구나 지울 수 있다"는 뜻
이기도 하기 때문입니다.

이 문제를 해결하기 위해 /tmp에는 반드시
Sticky Bit
가 설정되어야 합니다.
Terminal
 # -d 옵션: 디렉토리 자체의 정보 확인
ls -ld /tmp
출력 결과
drwxrwxrwt 19 root root 4096 Jan 31 12:00 /tmp
마지막 권한이 t로 설정되어 있음을 확인할 수 있습니다.
이 설정 덕분에 A 사용자가 만든 파일은 오직
A 사용자
(소유자)와
관리자
(root)만이 삭제할 수 있게 되어, 데이터 무결성이 보장됩니다.

결론 🔗

이번 시간에는 리눅스 권한 관리의 심화 내용인 특수 권한에 대해 알아보았습니다.
이로써 리눅스 파일 시스템과 권한에 대한 핵심적인 내용을 모두 다루었습니다.
다음 시간에는 시스템에서 실행 중인 프로그램, 즉
1.4 리눅스 프로세스 관리와 Cron 스케줄링
에 대해 알아보겠습니다.
프로세스의 상태를 모니터링하고, 주기적인 작업을 자동화하는 방법을 배워보겠습니다.

참고 🔗