Bash

為什麼 binfmt_misc 在沒有任何標誌的情況下工作時不帶有標誌“OC”?

  • March 19, 2021

我一直binfmt_misc在 Debian 10 上測試 Linux 的功能,並發現將標誌設置為“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容器的 ’d 文件系統中評估的,並且解釋器的執行發生在容器內,即ls -la /顯示容器根目錄(而不是主機根目錄)。

資源

https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html

你被兩個功能絆倒了。

第一個是,當exec失敗時,shell 將查看您嘗試執行的文件的內容,如果它看起來像一個 shell 腳本,它將自己解釋它。一個空文件看起來像一個 shell 腳本。您可以通過執行strace -f ./qux.go(顯示失敗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

引用自:https://unix.stackexchange.com/questions/640034