腳本可以執行但不可讀嗎?

腳本可以執行但不可讀嗎?

如果沒有權限讀取腳本,是否可以執行該腳本?在 root 模式下,我製作了一個腳本,我希望其他使用者執行該腳本但不讀取它。我確實chmod禁止讀取和寫入但允許執行,但是在使用者模式下,我看到了訊息:權限被拒絕。

答案1

問題是腳本不是正在運行的,而是解釋器(bashperlpython等)。口譯員需要閱讀腳本。這與“常規”程式(例如 )不同,ls因為該程式像解釋器一樣直接載入到核心中。由於核心本身正在讀取程式文件,因此不需要擔心讀取存取。解釋器需要讀取腳本文件,就像需要讀取普通文件一樣。

答案2

這僅適用於二進位檔案。

$ chown foo:foo bar
$ chmod 701 bar

作為非特權用戶:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

現在,問題來了。雖然無法透過傳統讀取讀取該文件,但您實際上無法阻止讀取該文件。這實際上是一個挑戰http://smashthestack.org/(13級)。有一個眾所周知的實用程序,hktrace它允許您使用ptrace.

答案3

前面的說法只說對了一半。您可以設定一個腳本,使其不被使用者讀取,但仍然可執行。這個過程有點冗長,但可以透過在 /etc/sudoer 中設定例外來實現,以便使用者可以暫時以自己的身分執行腳本,而不會提示輸入密碼。此方法: - 繞過其他發行版的 setuid 補丁。 - 允許您暫時為特定腳本授予提升的權限,而不向使用者授予對所有內容的 sudo 權限。

請按照這篇文章中的說明進行操作: 文件權限僅執行

答案4

我認為你可以用 來做到這一點setuid

但你不能,因為大多數發行版(顯然)已經setuid停用,因為這是一個巨大的安全漏洞。它在我的上被禁用,所以我實際上不知道這個答案是否有效,無論如何我都會發布它,因為我認為它應該

不管怎樣,如果我想做你想做的事——而且我有一個setuid啟用了腳本的發行版——我會做類似的事情:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

也就是說,我會編寫另一個腳本,其唯一目的是呼叫 root 唯讀腳本,將其更改為 root 所有,並為其授予 setuid 權限。 (以及其他人隨之而來的不可寫狀態。)

由於 myscript-nonroot 函數對每個人都是可讀的,因此它可以被讀取和執行,並且當您獲得實際執行腳本的兩行時 ( bash myscript),它正在以root 身份(或您想要的任何其他人,確切的用戶)運行沒關係,只要包裝文件由同一用戶擁有即可。

相關內容