○ Environment attack
기본적으로 리눅스 명령은 파일에 의해서 동작한다.
리눅스에서 제공하는 명령어는 /bin
, /usr/bin
등의 디렉터리에 위치한다. 명령어를 입력하면 환경 변수에 명시된 디렉터리에서 명령어를 탐색하고, 실행하기 때문에 명령어의 경로를 입력하지 않아도 된다.
보통 사용하는 ls
, id
, find
, touch
, cat
, sh
등의 시스템 명령어들은 bin 디렉토리 내부에 정의된 파일들이 실행되는 구조다.
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
export 명령으로 환경변수들을 출력하면 여러가지 환경변수가 나오는데, 그 중에서 path 환경변수를 볼 수 있다.
path 환경변수는 명령어들을 절대경로 지정없이 ls
, id
처럼 간편하게 사용할 수 있도록 미리 정의한 것이다.
그렇다면 path 환경변수가 없으면 어떻게 될까?
→ ls
, id
, find
, touch
, cat
, sh
등의 명령이 실행되지 않고 오류가 발생한다.
path 환경변수가 선언되지 않아서 bin 디렉토리에 정의된 ls
, id
, find
, touch
, cat
, sh
파일을 가리키지 못하기 때문이다.
만약, path 환경변수 없이 명령을 실행하려면 /usr/bin/ls
와 같이 직접 절대경로를 지정해서 실행해야한다.
조금 응용해서 생각해보자.
○ id.c
#include <stdlib.h>
void read() {
execve("/bin/sh", 0, 0);
}
id.c
는 쉘을 실행하는 코드다.
컴파일해서 id라는 파일을 생성했다고하자.
이때, path 환경변수를 id 파일이 있는 디렉토리만 지정하도록 변경하면 어떻게 될까?
→ id 명령을 실행하면 컴파일한 id 파일이 실행되면서 쉘이 실행될 것이다.
이처럼 환경변수를 조작할 수 있는 환경이라면 내가 원하는 명령이 실행되도록 프로그램 흐름을 유도할 수 있다.
이렇게 환경변수를 조작해서 공격하는 방식을 Environment attack이라고 한다.