반응형

Set- UID Privileged Programs


Need for Privilieged Programs

예를 들어 /etc/shadow 파일의 권한을 보면

-rw-r----- 1 root shadow 1443

=> 오직 오너만이 write할 수 있다.

하지만 일반 유저들이 그들의 비밀번호를 바꿀때 어떻게 바꿀 수 있을까? 특권 프로그램을 이용해서 바꾼다

일반적으로 운영체제 내에서 세부적으로 접근 제어를 하는 것은 굉장히 복잡하다.
rwx 3가지 권한을 세부적으로 할 경우 write를 1. 앞에 2. 중간에 3. 뒤에 와 같이 3가지로 나눌 수 있다. 하지만 복잡해진다.

따라서 rwx + 3bits 총 12비트로 permission을 나타낸다.
(확장, fine-grained access control을 위해 3bits를 추가한다.)

일반적으로 OS가 제공하는 접근제어를 바로 사용가능하지만 (e.g system call)
특별한 경우(e.g root가 가진 파일 수정)는 특권 프로그램이 필요하다! => setUID가 설정된 프로그램이 필요하다! 혹은 daemons
(관리자(super user)를 믿는다고 가정한다. 일반 사용자들은 특권 프로그램을 이용해서 바꿀 수 있다)

Different Type of Privileged Programs

  1. Daemons in Linux (MS Windows 에서는 services)
    백그라운드에서 계속 수행된다. 따라서 키보드로 부터 입력을 받을 수 없다.
    root나 특권을 가진 유저의 권한으로 실행해야한다.

    • 만약 daemon에게 요청을 하고 요청이 타당하면 daemon이 수행한다.
      (특히 Network는 Service를 위해 daemon들을 많이 사용한다.
      ps - af, ef, af 등을 통하여 모든 프로세스들을 보면 d로 끝나는 것들이 있다.
      Network daemon을 뜻한다. => 중요한 일을 하므로 root의 권한을 주던지 어떤 특권이 있는 사용자의 권한으로 돌아간다.
      중요한 일을 하므로 daemon을 임의로 만들지 못한다.
  2. Set-UID Programs
    Unix 시스템에서 사용된다.
    특정한 비트가 표시되어있는 프로그램이다.

Set-UID Concept

  • superman story

    1. Power suit 1.0
      Super man은 자신의 모든 권한을 superpeople 준다.
      문제점 : superpeople중 나쁜 사람이 있을 수 있다.

    2. Power Suit 2.0
      주어진 일만 가능하게 한다.
      특정한 일을 위한 컴퓨터 칩을 같이 내장한다. => chip에서 시킨 일만 함
      미리 프로그래밍이 되어 있어 프로그래밍된 일만 한다.

setUID는 위와 같은 매커니즘을 리눅스 운영체제에 구현한 것이다.
  • 프로그램의 소유자 권한으로 실행을 할 수 있게 해준다.

  • 일시적으로 권한을 상승시켜준다.

    예시)
    $ ls -l /usr/bin/passwd

    -rwsr-xr-x 1 root root 41284 Sep 12 2012 /usr/bin/passwd

    • s : setUID가 설정되었다.
    • others가 r-w로 누구나 실행가능하다. => 실행하는 동안 권한이 root로 상승된다.
    • /usr/bin/passwd : pw 변경 명령어 이다.

root가 실행? => RUID == EUID
seed가 실행? => RUID != EUID
(EUID = 현재 명령을 수행하는 주체의 UID, RUID : real UID 프로세스의 주인)

  • 일시적으로 권한을 상승시켜주기위하여 프로세스들은 사용자 ID를 두가지 가진다.

  • Real UID : 프로세스의 실제 주인

  • Effective UID (유효 사용자 아이디) : 권한 식별
    (권한 제어는 EUID에 기반한다.)

  • 일반 프로그램이 실행되었을때 RUID와 EUID는 같지만, setUID 가 실행되었을때는 다르다.

mycat의 owner를 root로 변경하였다.

mycat으로 /etc/shadow를 보려하면 권한이 없는 것을 볼 수 있다.

chmod로 "4"775로 setUID를 설정하였다. (setUID bit 설정)

그러자 /etc/shadow를 볼 수 있다.

setUID bit를 설정하였을 때, euid가 root가 됨을 알 수 있다.

exec전에는 RUID=EUID=25

exec을 하면서 owner가 17이고 setUID가 설정된 program을 실행함.

그러면 EUID가 17로 변경이 됨

i=getruid => ruid를 가져와서

setuidI(i) => euid를 이전의 상태로 돌림

Unix setuid그림을 보면

setuid bit가 0, 1일때 각각 euid를 보면 201, 100인 것을 볼 수있다.

pid1 = 모든 사용자 프로세스의 조상 (처음에 만들어지고 1번으로 계속 남아있음)

pid 523 ruid 0 euid 0 => pid 523 ruid 42 euid 42

setgroups, setgid, setuid를 실행하면 변경됨을 알 수 있다.

다시한번 예시를 보면

setUID bit를 설정해주면 일시적 권한 상승으로 소유자 권한으로 실행되는 것을 볼 수 있다.

setUID 보안?

  • 일반 유저들에게 권한을 상승시켜준다.

    • 슈퍼맨의 컴퓨터 칩처럼 행동이 제한되어있다.
    • setUID 내 포함된 행위만 가능하다
  • sudo command와 달리 직접 권한을 주는것은 아니다.
    (sudo => 1. root의 pw 아는 경우

         2. 다른 user(권한이 있는) pw 아는 경우
       3. /etc/shadow file에 사용자가 등록되어 있는 경우
       )
  • 만약 superman이 "북쪽으로 가서 왼쪽으로 틀고 성벽을 부셔라"라는 명령을 할때, 만약 명령을 받는 Mallory가 지구 반대편에 있고, 성벽의 반대쪽에 은행이 있다고 할 경우, Mallory의 기준에서 북쪽으로 가서 왼쪽으로 틀면 은행이 나올것이다. 그러면 Mallory는 은행을 털 수 있다.
    따라서 chip안의 SW구현도 중요하다!

Attack Surfave of Set-UID Programs

  1. 사용자의 입력으로 부터
  2. 사용자가 제어할 수 있는 시스템 입력을 통해서
  3. 환경변수
  4. 사용자에 의해 제어되는 비특권 프로세스 이용

1. 사용자의 입력

  • 버퍼 오버플로우

  • Format String Vulerability ( string형태로 유저입력을 받았을 때 프로그램을 바꿈)

  • chsh 명령어

    default shell을 바꾸는 명령(setUID 프로그램이다)

    shell 프로그램은 /etc/passwd 파일의 마지막 filed에 표시되어 있음.

입력값은 두개의 줄을 포함할 수 있다. 따라서 첫번재 라인은 정상적이고 두번째 라인에 root 계정을 만들도록 할 수 있다.  
혹은 만약 공격자가 3, 4번째 필드(UID, GID)에 0을 넣는다면 root 계정을 만들 수 잇다.
  • 시스템 inputs (사용자가 통제 가능한 시스템 input을 통해서도 setUID 프로그램 공격이 가능하다.)
    경쟁 조건

2. 환경변수

  • 환경 변수를 사용해서 setUID 프로그램 공격이 가능하다.

  • 환경 변수는 printenv나 env명령어를 통해 확인 가능하다.

  • 등호 앞에 있는 것이 환경변수이고 오른쪽이 환경변수에 들어있는 값이다.
    (PWD = /home/scho)

일반적으로 파일의 경로를 지정할때 절대 경로나 상대 경로를 지정할 수 있다.
모든 명령들은 어떠한 폴더 아래에 존재한다.

system("/bin/sh") => 값을 입력받아 명령을 수행함을 알 수 있다.
system(ls)를 할 경우 운영체제가 알아서 경로를 찾아서 ls를 실행한다.
이때 환경변수를 사용하여 알아서 경로를 찾음
echo path를 하면
:로 경로가 구분되어있고 처음 경로부터 해당 경로에 파일이 있는지 찾는다.
path라는 환경변수에 등록된 경로들 순서대로 명령을 찾는다.

cd /home/attacker
vi attack.c
gcc -o ls attack.c
export PATH=/home/attacker/:$PATH:/home/user1/bin

이러한 상황에서 공격자가 home 밑의 attack 파일을 만든다.
그리고 실행파일을 ls로 하고 환경변수를 바꾼다.
그러면 ls를 명령으로 입력하였을때 /bin/ls가 아닌 /home/attacker/ls가 실행된다.

  • Capability Leaking

    자격 유출
    어떤 특권 프로그램은 실행 중에 자기 자신의 권한을 다운그레이드한다.
    대표적으로 su라는 명령어는 switch user로 사용자를 바꾸는 명령어다.
    setUID프로그램이다.

    예시로 user1에서 user2로 바꿀때, EUID는 root이고 RUID는 user1이다.
    그리고 비밀번호가 확인되었을때 RUID와 EUID는 동일하다. 그리고 EUID는 root에서 user2로 내려간다.

<set UID 프로그램의 소스>

/etc/zzz의 owner는 root이고 root만 writable하다.

fd 0은 표준입력 , 1은 표준 출력, 2는 표준에러이고 프로세스가 생성되자마자 default로 open된다.

따라서 open성공시 fd는 3이된다.

setuid(getuid()) => real uid를 가져와서 euid로 설정한다. (실행하는 사람은 root가 아님)

새로운 shell을 실행한다. 그 프로세스는 이전에 open된 파일을 그래도 상속한다. (fd 0, 1, 2, 3)

cap_leak을 owner를 root로 하고 setUID bit를 설정한다.

/etc/zzz에 쓰기를 할 수없다.

하지만 cap_leak을 실행하면 파일의 owner인 root의 권한으로 상승되고, fd를 상속받았으므로 fd 3이 open된 /etc/zzz이고 그곳에 ccccccccccc가 적혀진다.

그리고 새로운 쉘을 빠져나오면 ccccccccccccccc가 쓰여진 것을 알 수 있다.

높은 권한을 가진 EUID가 중요한 파일을 open한 상태로 새로운 shell이 상속받아 문제가 발생하였다.

getuid : real user ID

geteuid : effective user ID

setuid : set effecitive user ID

3. Invoking Programs

  • 하나의 프로그램 내에서 외부 명령어 수행

  • 외부 명령어가 setUID 내에서 실행된다면 안전하지 않거나 엉뚱한 결과를 보여줌

  • 공격 : 사용자는 명령에 대한 입력 데이터를 줌, 명령이 제대로 호줄 되지 않으면 유저 입력 데이터는 명령어 이름으로 될 수 있음.

system은 외부 명령어를 호출하는 함수이다.

root소유 setUID프로그램이다. 따라서 프로그램은 모든 파일을 볼 수 있지만 쓰기는 하지 못한다.

 

실행권한이 마지막 r-x이므로 누구나 실행이 가능하다.

';'은 shell에 두개 이상의 명령어를 줄 수 있게 한다. 예시) ls;ps ls;cp a b

(root가 owner인 setUId프로그램이기 때문에 shell이 뜰때 root shell이 뜬다. => $가 아니라 #)

aa를 입력하고 그 뒤 /bin/sh를 입력한다.

그러면 uid는 1000이지만 euid가 0임을 알 수 있다.

 

execve을 사용하여 명령어 + 인자로 나누어주면 안전해 질 수 있다.

 

"aa;/bin/sh"를 하나의 인자로 인식힌다.

 

 

Principle of Isolation

 

system() 사용 줄임

권한이 필요할 때만 잠시 상승 하지만 그 권한이 더이상 필요없을땐 권한을 다시 낮춘다.

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Buffer Over flow 2  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
운영체제 보안 2  (0) 2020.09.10
블로그 이미지

아상관없어

,