4n6x4t

Set-UID Privileged Programs의 취약점을 이용한 공격 방법 2가지 본문

Study/System Security

Set-UID Privileged Programs의 취약점을 이용한 공격 방법 2가지

HCHC 2023. 4. 25. 10:17
728x90

안녕하세요! 오늘은 Set-UID 권한을 받은 프로그램들의 취약점에 대해서 알아보겠습니다.

기본적으로 Set-UID란 EUID ≠ RUID인 프로그램입니다. ex) passwd

설정될 경우 파일(프로그램) owner의 권한으로 프로그램이 실행됩니다.

EUID: Privilege of Process → 일반적으로 RUID와 같지만, SetUID 설정된 파일 실행 시 EUID가 파일 소유자의 ID로 바뀜

RUID: Real Owner of Process (설정 예) sudo chmod 4755 mycat → rwsr-xr-x

1. SetUID를 이용한 User Input 공격 예시

코드를 보면 system()가 있는데, 여기가 취약한 부분입니다.

해당 코드로 컴파일하여 catall이라는 프로그램을 만들었습니다. 여기에 

gcc -o catall catall.c
sudo chown root catall
sudo chmod 4755 catall #Set-UID 설정
catall "aa; /bin/sh"

여기에 command 인자값으로 공격자가 위의 명령어를 입력할 때 쉘이 열리게 됩니다.

2. SetUID를 이용한 환경변수 공격 예시

PATH 환경 변수는 프로세스가 프로그램 위치를 찾을때 참조하는 환경 변수로 프로그램 위치의 전체 경로 미입력 시 문제가 발생할 수 있습니다. 예를 들어 리눅스의 utility함수와 같은 이름의 악성프로그램을 만들어서 환경변수 PATH 맨앞에 utility의 경로를 넣어 버리면 악성프로그램이 기존 utility보다 먼저 참조되어 실행되게 됩니다.

2-1. 여기서 잠깐 Linking에 대해서 알아봅시다.

Linking은 외부 library에서 찾는 것으로 런타임이나 컴파일 시 사용됩니다. 동적과 정적 Linking이 있는데 이중 Dynamic Linking은 환경 변수를 적극 이용하는 성질이 있습니다.

  • Dynamic Linking: 컴파일 과정에서 Linking
  • Static Linking: 필요한 Library 정보를 포함되고 실행 시 OS가 필요한 Library를 가져와서 Linking

링킹은 이름을 가지고 Library를 찾아야 하는데 이때 사용하는데 '환경 변수' 입니다. 즉 환경 변수를 참조하여 Library의 위치정보를 가져오게 됩니다.

허접한, 동적링킹과 정적링킹 개념도

우리는 'ldd' 명령어로 동적링킹 시 어떤 라이브러리가 공유됐는지 볼 수 있습니다.

몇가지 환경변수 설정 값이 있는데

LD_PRELOAD: 링커가 먼저 검색할 Library list : 다른 동작을 하는 sleep()을 fake library에 넣고 이를 LD_PRELOAD에 넣으면 lib.so 가 아닌 fake에서 sleep()를 참조

LD_LIBRARY_PATH : 링커가 못찾은 함수 찾기위해 검색

2-2. Attack via External Programs : case study

.을 사용한 환경변수 PATH 등록으로 현재 디렉터리에 있는 실행파일 먼저 찾게함

3. Countermeasure(보안대책)

  1. Set UID 프로그램을 만들 때 안전한 함수를 사용
    system() → execve(v[0], v, 0) 으로 execve()는 인자로 코드와 데이터를 구분하여 받기 때문에 안전함
  2. Set UID 프로그램 사용을 피하고, sudo나 파일의 권한을 조정하여 사용

감사합니다.

728x90
Comments