binfmt_misc가 플래그 없이 작동하는 동안 "OC" 플래그를 사용하지 않는 이유는 무엇입니까?

binfmt_misc가 플래그 없이 작동하는 동안 "OC" 플래그를 사용하지 않는 이유는 무엇입니까?

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

관련 정보