Bash
為什麼 binfmt_misc 在沒有任何標誌的情況下工作時不帶有標誌“OC”?
我一直
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