Shell function을 child process에게 전달하는 방법
▶Shell function 예시
▶방법 1.
parent shell에서 "함수" 형태를 가진 환경 변수를 정의한다.
(정말 함수로서 정의됐는지 보려고 declare -f로 확인해 보았을때 정상적으로 함수 코드가 보이며, 함수를 실행하면 제대로 작동한다.)
이제 export -f로 함수를 export하고,
child shell을 실행하면, child shell은 함수를 잘 전달받았다.
(정말 잘 전달받은지 보려고 다시 declare -f로 확인해 보았을 때 정상적으로 함수 코드가 보이며,
함수를 실행하면 제대로 작동함)
▶방법 2.
parent에서 (이 방법에서는 parent가 꼭 shell이 아니어도 된다.) 단순히 "string" 형태의 환경 변수를 정의한다.
(정말로 함수 형태로 전달된 것이 아닌지를 declare -f로 확인해 보았을 때, 예상대로 함수 코드가 없다.)
이제 환경 변수를 export하고,
child shell을 실행하면, child shell은 이를 함수 정의로 전환한다.
(정말 함수로서 인식하는지 보려고 다시 declare -f로 확인해 보았을때 여기서는 정상적으로 함수 코드가 보이며,
함수를 실행하면 제대로 작동함)
Bash 프로그램의 문제점
▶근본적 원인
bash 프로그램의 소스 코드 내 존재하는 아래 parse_and_execute() 함수로 인해 취약해지는 것이다.
이 함수는 environment variable을 parse하고, 그 조각이
function definition이면 ㅡ execute는 안하고,
shell command면 ㅡ execute한다.
▶직접 실험해보자
아래 command를 통해, 위의 Shell function을 child process에게 전달하는 방법 에서 방법 2.를 수행한다.
echo해 보면 foo는 아래와 같다:
이제 이를 export한 뒤 vulnerable한 bash를 실행하면 아래와 같다:
위처럼 되는 bash 내부 매커니즘은 아래와 같다:
bash는 environment variable인 foo (아래)의 맨 앞 () { 를 보고 함수임을 인지한다.
따라서 아래처럼 = 을 없앤다.
이렇게 하고 나니 그냥 command가 두개 있는것처럼 보인다!
이제, parse_and_execute() 함수가 위 두 command를 각각 실행해버리는 것이다.
Shellshock vulnerability
▶이 공격이 일어나기 위한 선결 조건
i) target 프로세스가 bash나 system()을 실행하여야 함
- system()은 내부적으로 bash를 실행하므로 bash의 취약점을 내포함
ii) target 프로세스가 환경 변수를 통해 위험한 사용자 입력을 받아야 함
Exploit
▶on Set-UID program
예시 프로그램 분석
만약 RUID != EUID이면, bash는 환경 변수에 있는 함수 정의를 애초에 처리하지 않으므로 (보안을 위한 bash의 기본적 조치임), shellshock attack가 안 먹힌다.
그러나 이 프로그램에는 setuid(geteuid())가 있어서, RUID도 EUID와 같이 root로 설정되므로, shellshock attack에 취약하다!
※ setuid(value): 프로세스의 EUID가 root면 → 프로세스의 RUID는 value로 설정됨.
위 Set-UID 프로그램은 원래 아래와 같이 진행된다:
system() → fork() → execl() → /bin/sh (= vulnerable bash) → /bin/ls
정상 실행의 경우 아래와 같다.
exploit
환경변수 foo를 export하므로, Set-UID 프로그램 실행 시 foo는 이후의 child process의 환경 변수가 될 것이다.
Set-UID 프로그램에 의해 실행된 bash는 위 foo를 위험한 parsing logic에 의해 parse하여,
함수 정의 부분 뒤의 /bin/sh를 실행해버리는데,
이때 현재 프로그램은 Set-UID이니 사용자는 임시적으로 root 권한이므로,
root 권한의 /bin/sh가 실행되는 것이다.
▶on CGI Program
아래 글 참고.
'IT > 시스템 보안' 카테고리의 다른 글
[Shellshock attack] 환경변수를 통해 bash에게 명령어 string 전달해 실행시키기, reverse shell, patch [SEED Labs - 7] (0) | 2024.05.30 |
---|---|
[DirtyCow] read-only 파일에 write하여 root 권한 얻기 [SEED Labs - 6] (0) | 2024.05.30 |
[RELRO] RELRO의 개념, RELRO의 우회 (0) | 2024.05.15 |
[PIE] PIC와 PIE의 개념, 상대 참조, PIE의 우회 (0) | 2024.05.15 |
[DirtyCOW] memory mapping, mmap(), Copy on Write (0) | 2024.05.14 |