187. 권한 변경 이상 — setuid/setgid 호출 이상 탐지

changseop lee·7일 전

시스템 보안 · 취약점

목록 보기
187/450

시스템 보안 · 취약점 › D. 권한 변경 이상 징후 · 37/50편 (전체 187/450)
학습 단계: sudo·PAM·capability 권한 변경
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

5단계는 권한 변경의 감사·로그 분석을 다룹니다. 첫 번째는 setuid/setgid 시스템 콜입니다. 파일 권한(SUID 비트)이 "상승 경로"라면, setuid() 호출은 실제로 UID를 바꾸는 "상승 실행"입니다. 이 호출을 감사하면 상승이 일어나는 순간을 포착합니다.

setuid/setgid 호출과 상승
 setuid(0)   → 실행 UID를 root로 변경
 setgid(0)   → 실행 GID를 root로 변경
 setresuid() → real/effective/saved UID 변경
 호출 주체:  SUID 바이너리·cap_setuid 프로세스

정상: su/sudo/passwd 등이 호출
비정상: 예상 외 프로세스의 setuid(0)

파일 권한 변경(D22·27)이 "경로 생성"이면, setuid 호출은 "경로 사용(실행)"의 직접 증거입니다.

2. 왜 중요한가

  • setuid(0) 호출은 UID를 root로 바꾸는 실제 상승 순간이라, 상승 실행의 직접 증거입니다.
  • 정상 호출자(su·sudo·passwd)는 고정적이라, 예상 외 프로세스의 호출이 이상 징후입니다.
  • SUID 바이너리·cap_setuid 프로세스의 setuid 호출을 그 출처와 연결해 분석합니다.

3. 핵심 명령어 / 설정

호출의미정상 호출자
setuid(0)root UID 변경su/sudo/passwd
setgid(0)root GID 변경로그인·sudo
setresuid(0,0,0)3-UID root상승 도구
예상 외 호출자비정상 상승—
비표준 바이너리백도어 상승—

4. 실습 (실습 예시)

# setuid/setgid 호출 이상 탐지 (분석 방법)
# setuid/setresuid 호출 감사(execve+setuid 규칙 필요, D03)
sudo ausearch -k priv_esc,setuid_call -i --start recent 2>/dev/null | grep -E 'setuid|setresuid|setgid' | tail

# 호출 프로세스별 집계(예상 외 식별)
sudo ausearch -k setuid_call -i --start today 2>/dev/null | grep -oE 'comm="[^"]+"' | sort | uniq -c

5. 정상 상태

$ (setuid 호출)
14:30 comm="sudo" setuid success=yes (정상)
$ (호출 프로세스 집계)
   45 comm="sudo"  12 comm="su"  8 comm="crond"

setuid 호출이 정상 호출자(sudo·su·crond)에 집중된 상태가 정상입니다. 예상 목록은 기준선에 등록합니다.

6. 이상 상태

$ (setuid 호출)
04:00 comm="find" setuid(0) success=yes      (SUID find)
04:02 comm="python3" setresuid(0,0,0)         (cap_setuid python)
$ (호출 프로세스 집계)
   45 comm="sudo"  3 comm="find"  2 comm="python3"
  • find의 setuid(0) → D22에서 설정한 SUID find로 상승 실행
  • python3의 setresuid → D27 cap_setuid 부여 후 상승
  • 예상 외 호출자(find·python) → 권한 변경(D22·27)과 연결 → 정탐

7. 로그 분석 (분석 방법)

setuid 호출 흐름입니다(가상의 예시 로그).

type=SYSCALL ... syscall=setuid comm="find" auid=devops euid=0 success=yes key="setuid_call"
 → find가 setuid(0) 호출(SUID find, D22에서 설정)
[연결] D22 SUID 설정 → 여기 setuid 호출 : 경로 생성→사용
필드해석
syscall=setuidUID 변경 호출
comm=find예상 외 호출자
euid=0root로 상승
auid=devops원래 사용자

setuid 호출(실행)을 그 바이너리의 권한 변경(D22·27)과 연결하면 "경로 생성→사용"이 완성됩니다.

8. SOC 관제 포인트

  • setuid/setgid 호출은 UID를 root로 바꾸는 상승 실행의 직접 증거입니다.
  • 정상 호출자(su·sudo·passwd) 외의 프로세스 호출이 이상 징후입니다.
  • 호출(실행)을 권한 변경(D22·27)과 연결해 경로 생성→사용을 추적합니다.

9. 탐지 규칙

<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_d,privilege,">
  <rule id="103350" level="12">
    <if_sid>103000</if_sid>
    <field name="audit.syscall" type="pcre2">^(setuid|setreuid|setresuid)$</field>
    <field name="audit.comm" type="pcre2">^(?!(sudo|su|passwd|login|crond|sshd|systemd)).+</field>
    <field name="audit.euid">0</field>
    <description>예상 외 프로세스의 setuid(0) 상승 호출</description>
    <mitre><id>T1548</id></mitre>
  </rule>
</group>

정상 호출자 화이트리스트(sudo·su 등)로 오탐을 줄이고, 예상 외 호출자를 권한 변경 룰과 세션 상관합니다.

10. 대응 방법

  1. 초기 확인 — setuid/setgid를 호출한 프로세스(comm)·원래 사용자(auid)·결과를 확인합니다.
  2. 범위 확인 — 정상 호출자 여부와 그 바이너리의 권한 변경(D22·27) 연결을 확인합니다.
  3. 증거 확보 — setuid 호출 이벤트와 호출 바이너리 정보를 보존합니다.
  4. 차단/조치 — 비정상 상승이면 바이너리 경로 제거·세션 종료·상승 조사를 진행합니다.
  5. 재발 방지 — setuid 호출 감사와 호출자 화이트리스트를 운영합니다.

11. 핵심 정리

호출의미
setuid(0)root UID 변경
setresuid(0,0,0)3-UID root
예상 외 호출자비정상 상승
권한 변경 연결경로 생성→사용
면접 포인트"setuid(0) 호출은 상승 실행의 직접 증거 — 호출자 화이트리스트로 비정상 포착"

12. 다음 편 예고

다음 편 188. 권한 변경 이상 — 권한 변경 기반 지속성 탐지 에서는 권한 변경 기반 지속성을 다루는 권한 변경 기반 지속성 탐지를 다룹니다.


이전 편: 186. 권한 변경 이상 — root 권한 획득 경로 종합
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글