剛重構 Windows 核心庫,Rust 又重寫 sudo 和 su!

高級前端進階 發佈 2023-12-30T12:18:37.801055+00:00

大家好,很高興又見面了,我是"高級前端‬進階‬",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點讚、收藏、轉發!

家好,很高興又見面了,我是"高級前端‬進階‬",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點讚、收藏、轉發!

前言

Rust 由前 Mozilla 開發人員 Graydon Hoare 於 2006 年創建,作為 C++ 語言的替代品,Rust 正在開發人員的世界中慢慢為自己正名。 Rust 現在可用於創建網絡軟體、嵌入式計算機和分布式服務或命令行。而 Rust 最令人稱道的是其安全性和性能。

  • 安全性方面:Rust 語言有一個內置的內存安全系統,可以防止常見的編程錯誤,例如:空指針取消引用和緩衝區溢出。 語言本身內置的這些特性可以確保應用程式不會出現常見的安全漏洞,開發者可以在開發和編譯期間輕鬆捕獲錯誤。
  • 性能方面: 該語言旨在快速高效,使其成為需要處理大量請求的伺服器端應用程式的絕佳選擇。

當然,除了專注於安全和性能之外,Rust 還擁有不斷壯大的庫和框架生態,可以輕鬆開發 Web 應用程式。 例如,Rocket Web 框架是使用 Rust 開發 Web 應用程式的流行選擇, 它旨在簡單、快速和安全。

1.Prossimo 為何選擇 Rust

微軟正在用 Rust 重寫核心 Windows 庫的消息剛過去不久,Rust 生態的最新資訊表明:網際網路安全研究小組 (ISRG) 的 Prossimo 項目正在用 Rust 重寫 Sudo 和 su,目標是提升在內存方面的安全性,確保不再遭受內存安全漏洞的困擾,並進一步增強 Linux 和開源生態系統的安全性。

開發者都知道,Sudo(substitute user [或 superuser] do)是一種電腦程式,用於類 unix 作業系統,如: BSD、Mac OS X/macOS 以及 GNU/Linux,該電腦程式可以讓用戶以安全的方式使用特定的權限執行程序,通常為作業系統的超級用戶。

Sudo 於 1980 年代首次開發,幾十年來,Sudo 已成為執行更改同時最大程度降低作業系統風險的重要工具。 但是因為是用 C 寫的,所以 Sudo 經歷了很多內存安全問題相關的漏洞。而之所以選擇用 Rust 替換 C,主要是基於以下幾個因素的考量。

  • 使用非常廣泛(幾乎每個伺服器和/或客戶端)
  • 在臨界邊界上
  • 執行關鍵功能
  • 避免使用內存不安全的語言編寫(例如 C、C++、asm)

sudo 程序符合避免上面定義的四個風險標準,提高 Sudo 安全性可以保護系統最關鍵的軟體,尤其是避免內存安全漏洞。這項工作目前由 Ferrous Systems 和 Tweede Golf 的聯合團隊在 Amazon Web Services 的大力支持下完成。

值得一提的是,Sudo-rs 目前正在積極開發中,不適用於生產環境。 僅建議將 sudo-rs 用於開發和測試目的,避免系統崩潰和不安全。

2.快速使用 Sudo-rs

Sudo-rs 目前只支持基於 Linux 的作業系統,雖然其他基於 unix 的作業系統也可以使用,但目前沒有積極支持或維護它們。

Sudo-rs 是用 Rust 編寫的,目前僅支持最新的穩定編譯器工具鏈。 要獲得最新的編譯器工具鏈,官方團隊建議使用 rustup。 要構建 sudo-rs 需要安裝依賴項:

  • clang (clang)
  • libclang 開發庫 (libclang-dev)
  • PAM 庫 (libpam0g-dev)

安裝相應的依賴項後,可以使用如下命令輕鬆構建 sudo-rs :

cargo build --release

該命令會產生一個二進位文件,即 target/release/sudo。 但是,此二進位文件必須設置 setuid 標誌並且必須由 root 用戶擁有才能發揮有用的功能。 因為目前該項目仍然處於早期階段,所以還需要設置一個環境變量 SUDO_RS_IS_UNSTABLE,值為「I accept that my system may break unexpectedly」 以免造成系統意外崩潰。 如果不確定如何設置它,那麼當前版本的 sudo 可能並不適合你。

Sudo-rs 需要 sudoers 配置文件,目前程序會在 /etc/sudoers.test 文件中讀取它,而不是默認位置,開發者必須確保該位置存在有效的 sudoers 配置。 雖然 sudoers 大多數語法最終會原樣支持,但大多數功能目前還沒有實現,也可能不會有警告拋出。

目前,Sudo-rs 使用 PAM 進行身份驗證,系統必須針對 PAM 進行設置, Sudo-rs 將使用 sudo 服務配置。目前該項目在 Github 上進行託管, 已 Apache-2.0、MIT licenses 開源,已經有超過 1.9k 的 star、代碼貢獻者 14+,是所有開發者都值得關注的終端項目。

3.Rust 有何魔力

內存安全性

Rust 被認為是內存安全的, Rust 代碼不能有任何懸空指針、緩衝區溢出或任何其他類型的內存相關錯誤。 它允許開發者定義內存的管理方式以及內存中的值的布局方式,在不損失性能的情況下兼顧控制線和安全線,並使其成為 Rust 的巨大資產。

同時,提高內存安全性是 Rust 開發人員的主要目標之一,也是該語言最重要的賣點。 Rust 的代碼編譯器非常嚴格,每一個使用到的變量或者內存地址都會被自動檢查。 如果發現任何錯誤, Rust 將退出編譯並拋出不安全警告。

Rust 社區不斷壯大

雖然 Rust 的社區和庫的數量遠不及 C++。 但隨著 Rust 語言的日益普及,加入 Rust 語言的開發人員和熱情人士的數量也在增加。 社區創建的框架、庫和開發工具的數量已經接近 57k,並且每天都在增加。

除了不斷增長的工具和框架庫之外,Rust 還擁有一個活躍而熱情的社區。 無論開發者是需要幫助解決問題還是尋找使用 Rust 的用法和技巧都能獲得支持。

以下是一些新興社區項目的例子:

  • redox:一個用 Rust 編寫的作業系統;
  • cgmath:一個線性代數和計算機圖形庫;
  • Iron:一個並發網絡框架;

Rust 快速且靈活

Rust 被認為是一種相對快速的語言。 當使用通用代碼時,它可以比 Scala 運行得快得多,尤其是在性能關鍵型任務中。 在某些領域,它的運行速度很可能比 Scala 或 Java 快三倍。

當然,這歸功於 Rust 語言的幾個核心因素:

  • 靜態類型和編譯特性,使編譯器可以優化代碼以提高速度
  • 提供特徵的靜態分派:類似於 C++ 模板,但更簡潔
  • 明確地跟蹤變量的所有權: Rust 不假設任何具有地址的變量都可以隨時更改,因此可以在不對代碼產生負面影響的情況下進行優化。
  • 期望變量在默認情況下是不可變的(因此優化更容易)
  • 提供代數數據類型,也有利於優化
  • 存儲數據沒有任何開銷,沒有運行時或由於缺乏垃圾收集而突然暫停
  • 提供零成本抽象

Rust 可以廣泛使用

如果有一個項目,除了性能和底層優化外,還需要一個安全穩定的執行環境,那麼 Rust 值得考慮。Rust 被認為是一種底層語言,適合系統級,以及嵌入式和其他性能關鍵代碼。

Rust 也被認為是一種用於新興的、創新的利於市場的語言,這些場景更加關心性能、速度和安全性的組合質量。同時 Rust 還被用於加密貨幣和區塊鏈,一方面是易於理解和學習,另一方面就在於它的獨特性能和安全性指標。

大公司加持

儘管 Rust 是一門相對年輕的語言,但在提高編程的安全性和易用性方面,Rust 已經被開發人員公認為是朝著正確方向邁出的一步。 不僅開發人員對 Rust 感興趣,很多公司、大企業已經或計劃轉向 Rust,比如:微軟、Dropbox、Sentry、Amazon 和 Mozilla、字節跳動等等。

4.本文總結

本文主要和大家介紹剛用 Rust 重構 Windows 核心庫後,Rust 又開始重寫 sudo 和 su。相信通過本文的閱讀,大家對 Rust 重構sudo、su會有一個初步的了解。

因為篇幅問題,文章並沒有過多展開,如果有興趣,可以在我的主頁繼續閱讀,同時文末的參考資料提供了大量優秀文檔以供學習。最後,歡迎大家點讚、評論、轉發、收藏!

參考資料

https://dev.to/nickjeon/the-future-of-rust-in-web-development-1ik4

https://scalac.io/blog/5-reasons-why-rust-is-the-future-rust-functional-programming/

https://www.memorysafety.org/blog/sudo-and-su/

https://www.oschina.net/news/239377/rewrite-sudo-and-su

https://www.oschina.net/news/238894/microsoft-windows-rust

https://threatpost.com/sudo-bug-root-access-linux/149169/

https://blog.devgenius.io/a-new-era-of-linux-security-reimagining-sudo-and-su-with-rust-55f2e10123f8

https://theburningmonk.com/2015/05/rust-memory-safety-without-gc/

關鍵字: