如何用一行命令讓 Systemd 崩潰

2021-09-23 07:25:10 字數 3123 閱讀 7540

以任何乙個使用者執行下面的命令列,都會讓systemd崩潰:

1notify_socket=/run/systemd/notify systemd-notify 

"" 執行這行命令後,pid 1將在系統呼叫pause這裡掛起,再也不能啟動或停止後台程式。inetd-style服務不再接受任何連線。你也不能乾淨地重啟系統,系統一般會感覺不穩定(例如,從systemd與登入系統整合後,ssh和su處於30秒的假死狀態)。短的可以寫在一條tweet裡的命令就會導致以上所有情況。

這個bug非常普通。上述的systemd-notify 命令向位於/run/systemd/notify的全域性unix域socket傳送乙個長度為零的訊息。pid 1接收到這條訊息,並且斷言(訊息長度大於0)判斷為錯誤。儘管這個這個bug非常普通,但卻非常嚴重,它允許任何本地使用者很輕鬆的向關鍵的系統元件通過拒絕服務的方式發起攻擊。

立即有人提出關於這個bug的疑問:是什麼樣的質量保證過程能使如此簡單的bug生存了兩年以上(這個bug在systemd 209就被引入了)。難道這個空串不是乙個很明顯的測試用例嗎?有人希望最重要的使用者空間程序pid 1能得到更好的質量保證。不幸的是,按照瀏覽systemd提交日誌的情況來看,pid1的崩潰似乎並不罕見,比如:

systemd出問題遠不止是乙個bug。systemd的設計本來就有缺陷,要寫出沒有bug的軟體及其困難。即使是優秀的程式設計師也不可避免在systemd這樣的規模和複雜程度的專案中帶入缺陷。然而,一旦優秀的程式設計師意識到了編寫沒有bug的軟體的困難性,也就懂得了另外一種重要性,即在設計軟體時降低bug發生的可能性或至少減少bug帶來的影響。但是systemd的開發者沒理解這一點,他們選擇了用大量不必要的複雜內容填入到pid 1,並作為root使用者執行,同時還採用了一種記憶體不安全的語言編寫。

一定的複雜性是意料之中的,因為systemd提供了一些有用和有說服力的功能(儘管這些功能不是由systemd發明,但由它推廣的)。systemd是否取得了功能性與複雜性之間的適當權衡,關於這一點還存在爭議。但可以確認的是,systemd的複雜性不應該由pid 1來解決。正如 rich felker 所解釋的, pid 1的唯一工作就是執行實際的init系統,並接管殭屍程序。除此之外,實際的init系統即使作為非pid 1程序執行時,也應以模組化的方式構造,使得某個高風險部件的故障不會影響更關鍵的部件。例如,守護管理相關**出現的故障不應影響系統的正常重啟。

特別的,對從不可信**接收資訊的任何**都應在專用的程序中並作為非特權使用者執行,比如systemd-notify 。無特權的程序在將訊息向特權程序傳遞之前應分析並驗證資訊。這就是所謂的特權分離,這已在安全感知軟體中良好地實踐了十多年。相比之下,systemd解析來自不受信任**的訊息,由c寫成,並在pid 1以root身份執行。如果你覺得systemd不需要特權分離,因為它只解析來自本地使用者的訊息,但請記住,在網際網路時代,本地攻擊往往會獲得遠端載體。 考慮一下shellshock, 還有今年的systemd會議中名為 "從web瀏覽器談到systemd"的演示。

systemd對待安全問題上不犯錯的態度在其他地方可以看出,比如pid 1的 main()函式中的這段**:

/* disable the umask logic */ 

if (getpid() == 1) 

umask(0); 

設定umask為0意味著,預設情況下systemd建立的任何檔案都是全域性可讀可寫的。systemd定義了乙個巨集run_with_umask,這個巨集被用來在systemd需要建立乙個不同許可權的檔案時,臨時設定乙個更加嚴格的umask。因此,當建立檔案時忘記修改umask將導致檔案無法工作,這被稱為失效安全設計。反而systemd是故障時開啟的,因此,忘記修改umask(這已經發生過兩次了)建立了乙個檔案,卻是乙個潛在的安全隱患。

linux的生態系統在編寫安全,健壯的軟體方面落後於其他作業系統.

但是,我認為改進即將到來.心臟滴血和破殼漏洞喚醒了人們對加強開源軟體安全性的意識,並直接導致對開源軟體審查更加嚴格.

在編寫系統型別的軟體上,go 和 rust相比傳統的c語言更具安全性。

go 和 rust 安全的語言編寫,系統型別的軟體,傳統上使用c書寫

systemd是非常危險的,不只因為引入了成千上萬缺乏關於長期安全考慮(例如許可權分離或故障安全設計)的c**,還因為該設定本身是不可替代的。

systemd遠遠超過乙個init系統:

它成為乙個次級作業系統核心,提供了乙個日子服務,乙個裝置管理器,乙個容器管理器,乙個登陸管理器,乙個dhcp客戶端,乙個dns解析器,和乙個ntp客戶端。

這些服務是相互依賴的並且提供為其他應用提供非標準的介面。

這造成systemd的元件很難被替代,這也將阻礙未來採用更安全的替代方案。

考慮到systemd的dns 解析器。dns是乙個輔助的,安全敏感的協議。在2014,8月份,lennart poettering聲稱"systemd-resolved,現在是乙個完全快取的dns和llmnr(鏈路本地多播名稱解析)樁解析器"。實際上,systemd-resolved未實現任何有記錄的最佳實踐的方式來預防dns快取汙染。它容易受到dan kaminsky的快取中毒攻擊,在2023年其他dns服務經過了大規模協調一致的響應處理後已經修復(djbdns 在2023年已經修復這個問題)。儘管systemd 不強制你使用 systemd-resolved,但是它在dbus暴露了乙個非標準的介面,而他們鼓勵應用程式使用dbus來替代在53埠的標準的dns協議代。如果應用程式遵循這個建議,這將造成不可能使用更安全地dns解析器替換systemd-resolved,除非該dns解析器選擇效仿systemd提供有的dbus api。

停止這種做法還不是太晚。雖然大多數 linux 發行版現在使用 systemd 以初始化它們的系統,init 是針對systemd 的程序,因其可替換性很差。但對於其他systemd試圖取代的服務,並不也是這樣,例如,網路管理,dns 和 ntp 等。在現有的實現中,systemd 提供了一些引人注目的特性,但也存在大量的風險。如果你是乙個系統管理員,會抵制更換成現有的服務,而會轉而更換更安全的服務。如果你是乙個應用開發者,就不會使用 systemd 專有的介面。未來肯定會有更好的替換選擇,肯定會比我們現在替換安全得多的選項。如果在未來,使得創新成為可能的模組化和標準化沒有被systemd摧,那麼,到時候再去採用它也是可以的。

如何用一行python命令讓手機讀取電腦檔案!

好了,廢話不多說了,首先我隨便找了個資料夾,裡面有一些檔案,我要將這些檔案共享給我的手機和同事,我該如何做?進入命令列,想必很多人可能還是會通過 windows r cmd 切換碟符 cd切換目錄這樣的方式來進入我們需要的資料夾目錄,比如下面的一步步操作 接下來我們輸入命令,預設埠是8000,我這裡...

css動畫讓文字一行一行逐漸顯示

這幾天在做乙個年終總結的活動,需要將顯示的內容以動畫的形式逐漸顯示,而且還要使用輪播的效果顯示好幾頁,每頁內容都不同 其實簡單的css就可以實現,但是css 太長,就寫了個迴圈用js實現啦我是在vue的基礎上寫的,1 輪播可以使用外掛程式swiper,使用可以參考 或者我下篇文章介紹 2 每頁輪播頁...

如何讓兩個div處於一行

我們知道 div是塊級元素,是獨佔一行的.一般情況下,兩個相鄰的div是不會處於一行的 例如 html html head lang en meta charset utf 8 title 讓兩個div處於同一行 title head body divstyle height 40px width ...