Information*/알면도움됨

Breakout from the Seccomp Unconfined Container 정리

ch4rli3kop 2022. 5. 4. 23:48
반응형

Breakout from the Seccomp Unconfined Container 정리

Original Article : https://tbhaxor.com/breakout-from-seccomp-confined-container/

Keywords : AppArmor and Seccomp of Docker options

도커에서는 일반적으로 호스트 시스템 자원(네트워크, 커널 등)에 접근할 수 없지만, --privileged 옵션을 통해 컨테이너에서 호스트 시스템 자원에 접근이 가능하다.

문제의 컨셉은 다음과 같다. 일반적으로 docker container는 낮은 권한에서 사용할 수 없기 때문에, sudo docker ~ 로 sudo 를 이용하여 실행하거나, 사용자를 docker group에 추가하여 사용한다. 이 docker group은 높은 권한을 갖고 있기 때문에 시스템 자원에 접근이 가능한데, docker group에 부여된 권한을 이용하여 권한이 없는 사용자가 호스트의 시스템 자원 /root/flag에 접근하는 것이 목표이다. 일반적으로 docker firewall이 잘못된 접근을 막지만, 이 문제에서는 잘못된 firewall의 사용으로 firewall을 우회하여 시스템 자원에 접근한다.

다음과 같이 일반 사용자가 시스템 자원에 접근할 수 있는 컨테이너 생성은 Firewall에 의해 차단되는 것을 확인할 수 있다.

image1

근데 docker 에서는 privileged 모드로 생성되지 않은 컨테이너에 docker exec 를 이용하여 privileged로 쉘을 생성할 수 있다. 문제의 Firewall은 해당 동작을 탐지하지 못한다. 먼저 해당 컨테이너 내에서 root 유저의 linux capabilities를 살펴보면 다음과 같다. 이 중 cap_sys_module 이 존재하므로 커널 모듈을 로드할 수 있다.

image2

해당 컨테이너 내에서 리버스 쉘 모듈을 컴파일한다. 리버스쉘 c 코드와 make 파일은 다음과 같다.

이 상태로 insmod 를 이용하여 revershell.ko 모듈을 로드하면 될 것 같지만, 기본적으로 컨테이너를 생성할 때, seccomp가 걸려 system call 호출에 제약이 생긴다. 특히 finit_module system call 호출에 제약이 생기기 때문에, 컨테이너 생성 시 --security-opt seccomp=unconfined 옵션을 통해 seccomp 제약을 꺼야 정상적으로 리버스쉘 모듈을 로드할 수 있다.

stat("/root", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
stat("/root/reverse-shell.ko", {st_mode=S_IFREG|0644, st_size=4856, ...}) = 0
openat(AT_FDCWD, "/root/reverse-shell.ko", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4856, ...}) = 0
mmap(NULL, 4856, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f52a9aa8000
finit_module(3, "", 0)                  = -1 EPERM (Operation not permitted)

다음과 같이 unconfined 모드로 seccomp를 제약을 없앤 상태로 컨테이너를 생성하고 앞서 진행했던 리버스쉘 모듈을 insmod 명령어를 통해 로드하면, 사전에 실행해놨던 netcat 프로세스에 리버스쉘이 붙는 걸 확인할 수 있다.

이제 이 리버스쉘로 호스트 시스템 자원에 접근할 수 있다.

image3

Conclusion

docker group에 할당된 권한을 이용하여, 사용자가 컨테이너를 통해 시스템 자원에 접근한다는 시나리오인데, 이 글을 읽어보면서 몇가지 재밌는 개념을 배웠다. docker 에서 사용하는 privileged 옵션이나 seccomp와 관련된 security-opt 옵션을 새로 알았고, 특히나 linux capabilities에 해당하는 개념을 새로 알게 된 게 컸다. Link (위에서 언급된 capabilities에 대한 man page) / Link Capabilties를 이용하여 프로세스의 권한같은 거를 검사한다고 하는데, permission denied 같은게 이거를 검사해서 발생하는 거라고 한다. 요부분은 나중에 따로 정리해야겠당. 암튼 흥미로운 글이었음.

References

반응형