이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[SSS] Set-UID Privileged Programs

  • 2025.09.13 17:30
  • Computer Science/Computer Security
반응형

 

 

 

프로그램은 실행하는 사람의 권한으로 동작한다.

리눅스에서 사용자 비밀번호 해시값은 /etc/shadow에 저장되고, 보안상 root 사용자만 읽고 쓸 수 있다. (/etc/passwd : 기본 정보 저장)

 

다만 일반 사용자가 비밀번호를 바꿀 때 passwd 명령어를 사용하는데, 이 passwd 프로그램에는 Set-UID 비트가 켜져 있다.

즉, 커널이 passwd를 실행할 때 실행자의 UID가 아닌 파일 소유자인 root의 UID로 실행하게 되고, passwd 프로세스는 root 권한을 획득한다. 

 

이 과정으로 일반 사용자는 /etc/shadow를 직접 수정할 권한이 없지만, Set-UID 를 사용해 root 권한으로 동작하는 passwd로 /etc/shadow를 수정한다. 

 

Set-UID 가 걸린 프로그램에 버퍼 오버플로우같은 취약점이 있으면 공격자가 이를 악용해 root 권한을 얻을 수 있으니.. Set-UID 프로그램은 철저하게 관리되어야 하고, 사용자 입력을 철저하게 검증해야 한다. (execve 사용)

 

Set-UID 프로그램이 민감한 파일을 열고, 이후 권한을 일반 사용자로 낮춘다고 하더라도 이미 열린 fd는 그대로 유지된다.

그러니 일반 사용자가 루트로 열어둔 fd를 악용하는 Capability Leaking이 발생할 수 있으니 Set-UID를 프로그램을 다룰 때 주의하자.

 

-rwsr-xr-x 1 root root 12345 Sep 13 10:00 /usr/bin/passwd
// 여기서 s 는 SUID 비트

 

 

passwd 프로그램 파일에는 Set-UID 비트가 설정되어 있고, 이 파일의 소유자는 root.

원래대로라면 passwd 프로그램은 비밀번호 변경이라는 목적만 수행하지만, passwd 프로그램에 취약점이 있다면 root 권한을 탈취해서 root 쉘을 따버린다던지.. 악의적으로 사용할 수 있다. 

 

리눅스에서 프로세스는 항상 UID 정보를 두 개 가진다.

 

Real UID - 실제로 프로그램을 실행한 사용자 ID (프로세스를 누가 실행했는지)

Effective UID - 프로세스가 동작할 때 참조하는 ID (실행할 때 어떤 권한을 가지는지)

 

일반 프로그램은 RUID 와 EUID가 같지만, Set-UID 가 걸린 프로그램을 실행할 때는 RUID와 EUID가 Set-UID 비트 때문에 다르다. 

Set-UID 가 걸려있다고 해서 무조건 루트 권한으로 실행되는건 아니고, 그 파일 소유자의 권한으로 실행된다.

 

 

 

 

 


 

 

 

 

 

 

 

 

/etc/shadow 파일의 소유자는 root 이고, passwd 프로그램에는 Set-UID 비트가 설정되어있다.

 

 

 

 

 

현재 myid 프로그램은 실행자의 UID인 1000으로 실행되었다. 

EUID는 RUID와 같아서 따로 표시되지 않았다.

 

 

 

 

 

myid 프로그램의 소유자를 root로 바꾸고 권한을 -rwsrxr-x로 변경한다.

이제 Set-UID 비트가 설정됐고, 이제 myid 프로그램을 실행할 때 EUID가 root로 설정된다. 

 

 

 

 

 

 

그대로 적용해보자. 

Set-UID를 부여하기 전에는 /etc/shadow 파일을 읽을 수 없었지만 

Set-UID를 부여한 후에는 /etc/shadow 파일이 읽힌다. 

 

 

 

 

 

 

C로 쉘을 하나 띄우는 프로그램을 작성하고 컴파일하자.

컴파일해서 나온 프로그램에 Set-UID 비트를 설정해주자.

 

dash는 root 권한을 버리고 일반 사용자 권한으로 돌아가니 아직 root 권한을 가진 쉘을 가질 수는 없다. 

 

 

 

 

 

 

쉘 링크를 /bin/zsh로 설정하자.

이제 쉘을 띄울 때 root 권한을 가진 쉘을 띄울 수 있다. 

 

 

 

 

 

 

 

쉘은 환경변수인 PATH로부터 경로를 불러오고 앞에서부터 차례대로 실행파일을 검색한다. 

system("ls") 실행 시 쉘이 실행되고 PATH 에 있는 ls를 찾아서 실행한다.

 

PATH = /home/seed/bin:/usr/local/bin:/usr/bin:/bin

 

 

공격자가 PATH를 조작하면 악성 ls 명령어를 실행하도록 설정할 수 있다. 

Set-UID 와 결합하면 루트 권한으로 악성 ls 명령어를 실행시킬 수 있다.

 

 

 

 

PATH를 조작해서 기본 ls 대신 내가 만든 ./ls 를 실행시킨다.

./ls 가 사실 /bin/sh 이니.. root 권한의 쉘을 열게 된다. 

 

 

 

 

유저는 모든 파일을 읽을 수 있고, 수정할 수는 없다.

Set-UID 프로그램이니 실행 시 루트 권한을 가지고, 수정은 안되고 읽을 수만 있다. 

 

 

 

 

 

system() 부분에서 쉘이 개입했고, 세미콜론이 명령어 구분자로 작동해 rm remove.txt가 추가로 실행됐다. 

 

 

 

 

 

system 부분을 execve() 함수로 교체하자.

쉘을 직접 다루지 않으니 공격이 막힌다. 

반응형
저작자표시 (새창열림)

'Computer Science > Computer Security' 카테고리의 다른 글

[SSS] Race Condition  (0) 2025.10.20
[SSS] Return Oriented Programming  (0) 2025.10.09
[SSS] Format String Bug  (0) 2025.10.06
[SSS] Control Flow Hijacking - Shellcode  (0) 2025.09.29
[SSS] Control Flow Hijacking - Buffer Overflow  (0) 2025.09.21

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [SSS] Return Oriented Programming

    [SSS] Return Oriented Programming

    2025.10.09
  • [SSS] Format String Bug

    [SSS] Format String Bug

    2025.10.06
  • [SSS] Control Flow Hijacking - Shellcode

    [SSS] Control Flow Hijacking - Shellcode

    2025.09.29
  • [SSS] Control Flow Hijacking - Buffer Overflow

    [SSS] Control Flow Hijacking - Buffer Overflow

    2025.09.21
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (679) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (10)
    • 💬 기록 (8) N
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바