Linux 시스템 보안 기초 · 18/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
SUID는 '실행하는 동안 파일 소유자의 권한으로 동작'하게 하는 특수 비트입니다. passwd가 일반 사용자로도 shadow를 수정할 수 있는 이유죠. 그런데 이 편리함이 곧 권한 상승의 단골 통로입니다. 이번 편은 정상 SUID와 비정상 SUID를 구분하는 실무 기준을 세웁니다.
SUID 비트(s, 8진수 4000)가 실행 파일에 있으면, 실행 시 프로세스의 EUID가 파일 소유자로 설정됩니다. 소유자가 root면 그 프로그램은 실행 중 root 권한을 갖습니다.
문제는 그 프로그램이 '쉘 실행'이나 '임의 파일 쓰기' 같은 기능을 제공할 때입니다. 예컨대 SUID가 붙은 find, vim, bash 등은 GTFOBins에 정리된 기법으로 root 쉘로 이어질 수 있습니다.
정상 SUID (passwd) 비정상 SUID (find)
일반 사용자 실행 일반 사용자 실행
│ EUID→root │ EUID→root
▼ ▼
shadow의 '자기 항목만' 수정 find -exec /bin/sh → root 쉘
(기능이 제한적) (임의 명령 실행 가능) ← 권한 상승
커널은 SUID 바이너리를 exec할 때 EUID를 소유자로 승격합니다. 정상 SUID 프로그램은 '자신이 필요한 최소 작업'만 root로 수행하도록 설계됩니다. 반면 범용 도구(find/vim/awk/perl 등)에 SUID가 붙으면, 그 도구의 '명령 실행 기능'을 통해 root 권한으로 임의 명령을 돌릴 수 있어 즉시 권한 상승이 됩니다.
따라서 점검의 핵심은 '목록에 있어야 할 표준 SUID 외에 무엇이 추가되었는가'입니다.
# 모든 SUID 파일 나열
sudo find / -xdev -perm -4000 -type f 2>/dev/null
# 기준선(표준 SUID)과 비교: 현재 목록 저장 후 diff
sudo find / -xdev -perm -4000 -type f 2>/dev/null | sort > /root/suid.now
diff /root/suid.baseline /root/suid.now # 기준선이 있을 때
실습 컨테이너(Ubuntu 24.04)의 실제 SUID 목록 일부입니다. (실제 캡처)
$ find /usr/bin /usr/sbin /bin -perm -4000 -type f 2>/dev/null
/usr/bin/fusermount3
/usr/bin/sudo
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/su
/usr/bin/umount
이들은 모두 표준 SUID입니다. 여기에 /usr/bin/find, /bin/bash, /usr/bin/vim 같은 범용 도구가 나타나면 즉시 조사 대상 — 권한 상승 백도어일 가능성이 큽니다.
/tmp·홈 디렉터리·비표준 경로의 SUID 바이너리GTFOBins(gtfobins.github.io)는 어떤 SUID 바이너리가 어떻게 악용되는지 정리한 참고자료입니다. 공격자 관점을 알면 방어 우선순위가 명확해집니다.
/tmp, /home)의 SUID 즉시 조사chmod/fchmodat에서 mode에 04000 포함신규 SUID 바이너리 등장은 강력한 권한 상승/지속성 IOC입니다. Wazuh rootcheck/SCA는 SUID 목록을 정기 점검하고, FIM으로 실행 디렉터리 변경을 감시합니다. SIEM에서는 'SUID 기준선에 없던 파일'을 알람으로 올리고, 해당 파일 경로·해시를 IOC로 등록합니다.
[ ] 전체 SUID 목록 확보
[ ] 표준 SUID 기준선과 diff
[ ] 범용 도구/비표준 경로 SUID 탐지
[ ] 신규 SUID 감사 설정
다음 편에서는 19. SGID 파일 보안 점검 를 다룹니다. SUID의 그룹 버전인 SGID를, 파일과 디렉터리에서 각각 어떤 의미인지 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.