Contents

白宮想要內存安全編程,但這是什麼?

### 快速鏈接

⭐白宮在說什麼?

⭐為什麼它很重要?

⭐不安全的語言是什麼樣的?

⭐記憶體安全碼是什麼樣的?

⭐我應該切換語言嗎?

要點

白宮建議使用優先考慮記憶體安全的程式語言,例如 Rust,以減輕與編碼錯誤和漏洞相關的潛在安全風險。

在更原始的程式語言(例如 C)中,程式碼中的錯誤很可能導致安全漏洞。

Rust 是一種以其安全措施而聞名的語言,透過其自動記憶體管理和內建錯誤預防功能提供了額外的安全層。

美國政府機構最近發布的一項指令提倡程式設計專業人員採用 Rust 和 Java 等記憶體安全語言。然而,它提出了這些語言與其他語言的區別以及這種區別在實踐中是否重要的​​問題。

白宮在說什麼?

白宮國家網路主任辦公室在 2 月 26 日的聲明中提倡軟體開發人員使用 Rust 等記憶體安全程式語言。

ONCD 表示:

作為一個社會,我們有能力也有義務透過採用記憶體安全程式語言來阻止包含一系列類別的安全缺陷的引入,從而最大限度地減少網路空間的脆弱性。然而,這提出了一個需要解決的具有挑戰性的問題。

它為什麼如此重要?

網路空間和數位創新辦公室 (ONCD) 成立於 2021 年,在總統的直接管轄下運作,就網路安全及其相關問題提供專家諮詢。預計美國在這一領域做出的決定將對國內和國際更廣泛的技術進步產生重大影響。

一些值得注意的安全漏洞歸因於記憶體管理的缺陷,記憶體管理是程式設計的一個基本面向。使用較舊的低階語言為開發人員提供了廣泛的功能,但同時也增加了錯誤編碼可能導致有害後果的可能性。

儘管如此,使用 Rust、Python 和 JavaScript 等記憶體安全程式語言的趨勢越來越明顯。物件、類別和數據 (ONCD) 標準化委員會很可能因 C 等不安全語言的盛行而做出這一宣布,這些語言已在我們的技術基礎設施中根深蒂固,並在許多日常應用中普遍使用。

不安全的語言是什麼樣的?

當然,我很樂意提供該聲明的更精緻的翻譯。以下是我嘗試以優雅的方式重新表述它: 值得注意的是,危險的程式碼並不總是表現出不祥的外觀或錯綜複雜的複雜性。一個典型的例子是一個基本的 C 程序,儘管如此,它仍然可能對系統的安全性和穩定性帶來潛在的風險。

#include <stdio.h>

int main (void) {
    int arr[3] = { 0, 0, 0 };
    printf("%d\n", arr[3]);
    return 0;
}

這說明了一個缺陷的範例實例,該缺陷可能會導致

/bc/images/memory-safety-c-overflow.png

儲存在變數「arr[3]」指定位置的資訊構成了合法的記憶體位址,與系統內的其他位址相當。然而,這個特定位址並不對應於定義的陣列邊界內的元素。因此,任何資料都可能儲存在該位置,潛在的後果包括系統完全故障到嚴重的安全漏洞。從歷史上看,許多網路犯罪分子都利用了類似的漏洞。

儘管發出警告通知,C 編譯器仍然繼續產生可執行程式。開發人員可以自行決定透過特定的編譯器指令選擇性地抑製或隱藏此類警報。不管這個選擇如何,C 都會繼續提供自我傷害的可能性,而 Rust 等替代程式語言則放棄提供實現此類結果所需的工具。

記憶體安全碼是什麼樣的?

在 Rust 等優先考慮安全性並防止資料損壞的程式語言中,不會出現緩衝區溢位問題。下面的程式碼在 Rust 中演示了這個概念:

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
} 

儘管語法正確,但 Rust 由於編譯錯誤而無法處理這段特定的程式碼。

/bc/images/memory-safety-rust-compile-error.png

Rust 程式語言嚴格遵守自己的原則,拒絕執行任何違反其既定準則的程式碼。當遇到有問題的程式碼時,編譯器會提供問題的清晰解釋,有效防止產生可執行程式。

除前面提到的功能外,Rust 還提供了許多附加功能,旨在透過自動記憶體管理和避免空指標取消引用來增強安全性。其中包括智慧指標的實現,它可以有效地管理資源並減少因不當使用或處理這些指標而導致的潛在錯誤。

我應該切換語言嗎?

必須認識到每種程式語言都有其特定的功能和目的,因此,在考慮絕對避免某些語言時忽視謹慎是不明智的,無論它們是否得到總統等高層人士的認可。儘管一個人傾向於掌握一種特定的語言,但掌握多種語言可以為未來的工作中的多功能性和適應性提供廣泛的機會。

記憶體安全是許多當代程式語言的一個突出特徵,因此必須熟悉至少一種這樣的語言。雖然C可能具有一定的實用性,但由於缺乏安全措施,它帶來了巨大的風險。幸運的是,有提供增強安全功能和效率的替代方案,尤其是 Rust,那些尋求具有強大安全機制同時保持效能優化能力的語言的人應該考慮它。