我正在尋找一個安全的地方來放置 Unix 域套接字,該套接字將用於控制 REPL。
在 Linux 上,我會使用/run/user/$UID
,它滿足除可移植性之外的所有要求。我需要處理它們的程序是可移植的。
一種選擇是使用下面的目錄,~
但這會遇到不同的問題:由於路徑長度的限制,使用者的主目錄可能位於太深而無法綁定 Unix 域套接字的目錄中。
將套接字放在下面的目錄中/tmp
是可移植的,但我擔心刪除目錄時的競爭條件。我還擔心是否/tmp
可以依賴在所有平台上設定黏性位(即用戶無法刪除或重命名其他用戶的臨時檔案)。然而,我假設它/tmp
是黏性的,否則許多應用程式(每個使用的腳本mkstemp
)都是不安全的。
我目前的計劃是讓伺服器在 中 建立一個臨時目錄/tmp
,並讓客戶端在使用套接字之前檢查包含目錄的所有權。這對於安全來說足夠了嗎?
答案1
這法律上的標準臨時檔案的位置在環境變數中給出TMPDIR
。
此變數應表示可供需要建立暫存檔案的位置的程式所使用的目錄的路徑名。
事實上,很多系統並沒有定義TMPDIR
。這事實上的臨時文件的標準位置是/tmp
.因此請檢查TMPDIR
,如果未設置,則使用/tmp
.在 shell 腳本中,您可以使用${TMPDIR:-/tmp}
,或者如果您覺得它更方便,
if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi
或應付set -u
: "${TMPDIR:=/tmp}"
您可以假設該位置是可寫入的,但它可能是世界可讀和世界可寫的,因此:
- 當您建立常規文件時,請務必確保您沒有覆蓋現有文件,該文件可能不屬於您。不要為此使用 shell 重定向。單獨測試所有權並不安全,因為對手可能會在您的程式運行時移動符號連結來欺騙檢查。此外,您不能依賴不存在的特定名稱;為了防止並發程序透過在您之前建立同名檔案來造成拒絕服務,請使用隨機名稱。您可以使用
mktemp
實用程式(廣泛使用,存在於 GNU、BusyBox、BSD,但不存在 POSIX)或mkstemp
C 函式庫函數。在幕後,open
還是creat
必須用旗幟來稱呼O_EXCL
。 - 您可以使用 來建立目錄
mkdir
。這可以防止所有權欺騙竊取,因為這不會重複使用現有文件,但它很容易像常規文件一樣出現拒絕服務的情況,因此您應該使用隨機名稱。mktemp -d
是一個很好的方法來做到這一點。 - 您可以建立一個套接字(沒有標準的 shell 實用程式)。與目錄情況一樣,它可以防止所有權欺騙,但不能防止拒絕服務。
Linux 尊重命名套接字上的權限,但有些 Unix 變體則不尊重。這就是為什麼/tmp
通常在子目錄中建立套接字的原因。
建立子目錄/tmp
(或$TMPDIR
如果設定)並建立命名套接字的程式包括 X11 伺服器、ssh-agent、gpg-agent、KDE、emacs,...(這只是我發布此文章的電腦上存在的程式) ) 。正如您所看到的,您將會有很好的陪伴。