Debian 10에서 Linux 기능을 테스트 한 binfmt_misc
결과 플래그를 "OC"로 설정하면(인터프리터 대신 바이너리 자격 증명 사용) 실행이 자동으로 실패하는 것으로 나타났습니다.
아래 POC에서는 /tmp/test.sh
인터프리터와 qux.go
바이너리 파일입니다. /tmp/test.sh
플래그 없이는 성공적으로 실행되지만 "OC" 플래그가 있으면 조용히 실패하는 이유는 무엇입니까 ?
POC:
$ touch qux.go
$ chmod +x qux.go
$ cat <<EOF >/tmp/test.sh
> #!/bin/sh
> echo Golang
> EOF
$ chmod +x /tmp/test.sh
$ echo ':golang:E::go::/tmp/test.sh:' | sudo tee /proc/sys/fs/binfmt_misc/register
:golang:E::go::/tmp/test.sh:
$ ./qux.go
Golang
$ echo -1 | sudo tee /proc/sys/fs/binfmt_misc/golang
-1
$ echo ':golang:E::go::/tmp/test.sh:OC' | sudo tee /proc/sys/fs/binfmt_misc/register
:golang:E::go::/tmp/test.sh:OC
$ ./qux.go # no output
반품:
mount | grep binfmt_misc
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=28,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=658)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
보너스:
일부 리소스는 binfmt_misc
컨테이너에서 호스트로의 이스케이프에 사용할 수 있다고 주장합니다. 그러나 내가 볼 수 있듯이 인터프리터 경로는 chroot
컨테이너의 파일 시스템 내에서 평가되고 인터프리터의 실행은 컨테이너 내에서 발생합니다. 즉, ls -la /
컨테이너 루트(호스트 루트가 아님)가 표시됩니다.
자원:
https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html
답변1
두 가지 기능 때문에 문제가 생겼습니다.
첫 번째는 exec
실패할 경우 쉘이 실행하려는 파일의 내용을 살펴보고 쉘 스크립트처럼 보이면 자체적으로 해석한다는 것입니다. 빈 파일은 쉘 스크립트처럼 보입니다. 다음을 실행하고 strace -f ./qux.go
( failure 표시 ) 변경하여 exec
이를 확인할 수 있습니다 qux.go
.
$ echo echo Failed Golang > qux.go
$ ./qux.go
Failed Golang
또 다른 특징은 O
로고 입니다.계단식 인터프리터에서는 작동하지 않습니다.: 귀하의 경우에는 qux.go
인터프리터가 필요하지만 인터프리터 자체에는 인터프리터가 필요하므로 /bin/sh
해석할 파일이 두 개이고, test.sh
- qux.go
하지만 모드에서 최종 실행 파일은 하나만 처리할 수 있습니다 O
. 다음은 작동합니다:
$ cat <<EOF > /tmp/test.c
#include <stdio.h>
int main(int argc, char **argv) {
puts("Golang");
return 0;
}
EOF
$ make /tmp/test
cc /tmp/test.c -o /tmp/test
$ echo ':golang:E::go::/tmp/test:OC' | sudo tee /proc/sys/fs/binfmt_misc/register
:golang:E::go::/tmp/test:OC
$ ./qux.go
Golang