?作者 | 千山、言征
審校 | 云昭
進(jìn)入2023年,技術(shù)圈都在圍觀大洋彼岸的聊天機(jī)器ChatGPT,但對(duì)于編程圈而言,沒有什么比內(nèi)存安全更能引起熱議。近期美國國家安全局(NSA)點(diǎn)名批評(píng)C++,建議使用Rust等內(nèi)存安全的語言,霎時(shí)間讓“編程語言的安全問題”擺到桌面上,那么,C++到底能扛住這波壓力,“存活(安全)”下來嗎?
面對(duì)來自政府方面的壓力,C++創(chuàng)建者Bjarne Stroustrup最終還是低頭了。他一改之前的激奮言辭,不再喊話“誰誰不懂C++”、“沒有看到30多年來C++的進(jìn)步”等,而是開始傾向于“編程語言也應(yīng)該與時(shí)俱進(jìn)”的說辭,加入了改變編程語言本身以解決安全問題的隊(duì)伍之中,這一點(diǎn)對(duì)其他核心貢獻(xiàn)者來說顯然出乎意料。
1、安全掉隊(duì)的C++,正在找對(duì)策
C++社區(qū)一直存在安全爭(zhēng)議,其內(nèi)存安全漏洞引起了很多開發(fā)者的警覺。
1月中旬,官方C++“指導(dǎo)小組”發(fā)布了一份聲明,解決了人們對(duì)C++安全性的擔(dān)憂。雖然許多語言現(xiàn)在都支持“基本類型安全”,即確保變量只訪問由其數(shù)據(jù)類型明確定義的內(nèi)存部分,但C++一直難以提供類似的保證。
這個(gè)由C++創(chuàng)建者Bjarne Stroustrup共同撰寫的新聲明現(xiàn)在似乎呼吁改變C++編程語言本身,以解決安全問題。“我們現(xiàn)在支持這樣的想法,即安全性的更改不僅需要在工具中,而且需要在語言/編譯器和庫中可見。”
“指導(dǎo)小組”還支持其長(zhǎng)期以來首選的調(diào)試工具,以確保安全(以及“推動(dòng)工具,以便在識(shí)別人類難以識(shí)別的安全問題時(shí)進(jìn)行更全面的分析”)。但1月份的聲明強(qiáng)調(diào)了它對(duì)C++內(nèi)部變化的建議。
具體來說,它建議“將幾個(gè)特性打包到概要文件中”(概要文件稍后定義為“定義要執(zhí)行的屬性的限制和要求的集合”,例如,通過觸發(fā)自動(dòng)分析。)
這樣,新的安全更改“應(yīng)該是可見的,這樣安全代碼部分就可以被命名(可能使用配置文件),并且可以與普通代碼混合?!?/p>
這種新方法最終不僅帶來了安全性,還帶來了靈活性,其配置文件專門設(shè)計(jì)用于支持嵌入式計(jì)算、性能敏感應(yīng)用程序或高度特定的問題領(lǐng)域,如汽車、航空航天、航空電子、核或醫(yī)療應(yīng)用程序。
指導(dǎo)小組還建議:“例如,我們甚至可能有安全嵌入式、安全汽車、安全醫(yī)療、性能游戲、性能HPC和歐盟政府法規(guī)的安全配置文件?!薄?/p>
在文件的其他地方,他們的表述更為簡(jiǎn)潔?!盀榱酥С植恢挂粋€(gè)‘安全’概念,我們需要能夠說出它們的名字?!?/p>
但提議的改變與去年12月與美聯(lián)邦政府?dāng)偱茣r(shí)出現(xiàn)的想法相呼應(yīng)。1月中旬的聲明指出,一個(gè)特別重要的組織,即美國商務(wù)部頗具影響力的國家標(biāo)準(zhǔn)與技術(shù)研究所,對(duì)C++的安全性提出了擔(dān)憂。11月,美國國家安全局(National Security Agency)也在一份關(guān)于軟件內(nèi)存安全的信息表中調(diào)用了C++(作為其任務(wù)的一部分,以識(shí)別對(duì)各種聯(lián)邦系統(tǒng)的威脅,并“發(fā)布網(wǎng)絡(luò)安全規(guī)范和緩解措施”)。
也許正是這種來自高層的擔(dān)憂最終埋下了變革的種子…
2、國家安全問題
美國國家安全局援引了微軟和谷歌的分析評(píng)估。
微軟在2019年的一次會(huì)議上透露,從2006年到2018年,其發(fā)現(xiàn)的70%的漏洞都是因內(nèi)存安全問題造成的;據(jù)Google估計(jì),Chrome中存在了類似比例的內(nèi)存安全漏洞,另外90%的Android系統(tǒng)漏洞也都是內(nèi)存安全問題。
他們隨后警告稱,黑客可以利用這些漏洞進(jìn)行遠(yuǎn)程代碼執(zhí)行或其他不利影響,這通常會(huì)危及設(shè)備,并且成為大規(guī)模網(wǎng)絡(luò)入侵的第一步。因此,無論是內(nèi)存溢出、內(nèi)存分配漏洞、還是變量未初始化,“所有這些內(nèi)存問題都太常見了?!?/p>
2019年微軟安全演示發(fā)現(xiàn),從2006年到2018年,70%的漏洞涉及內(nèi)存安全
顯然,軟件分析工具和“操作環(huán)境選項(xiàng)”可以發(fā)現(xiàn)許多問題,但美國國家安全局仍然建議,“在可能的情況下”,只使用內(nèi)存安全語言。
為了明確起見,他們將其定義為一種語言,通過運(yùn)行時(shí)和編譯時(shí)檢查,內(nèi)存“作為計(jì)算機(jī)語言的一部分自動(dòng)管理;它不依賴于程序員添加代碼來實(shí)現(xiàn)內(nèi)存保護(hù)?!盢SA提供了C#、Go、Java、Ruby、Rust和Swift等示例。
在美國國家安全局看來,常用的編程語言如C++,在內(nèi)存管理方面提供了很大的靈活性,但用這種語言開發(fā)的應(yīng)用程序的安全性很大程度上需要依賴程序員的檢測(cè)環(huán)節(jié)。但是只要程序員自身有所疏忽,就可能帶來嚴(yán)重的內(nèi)存安全隱患。盡管不少軟件分析工具能夠檢測(cè)到內(nèi)存管理問題,操作環(huán)境選項(xiàng)也可以提供一些防護(hù),但內(nèi)存安全語言所提供的固有保護(hù)可以規(guī)避或減輕大多數(shù)內(nèi)存管理問題。
去年12月,Stroustrup在開放標(biāo)準(zhǔn)網(wǎng)站上回應(yīng)稱,他并不認(rèn)為這些語言“在我所關(guān)心的使用范圍內(nèi)”優(yōu)于C++。
Stroustrup還反對(duì)美國國家安全局對(duì)安全的討論“僅限于內(nèi)存安全,而忽略了一種語言可能(并且將會(huì))被用來違反某種形式的安全和保障的十幾種其他方式……‘安全’的定義不止一種,我們可以通過編程風(fēng)格、支持庫和通過靜態(tài)分析執(zhí)行的組合來實(shí)現(xiàn)各種安全。”
在這一過程中,Stroustrup還提出了第二個(gè)論點(diǎn):在一些性能至關(guān)重要的現(xiàn)實(shí)場(chǎng)景中,“并非所有人都將‘安全’放在首位?!币虼薙troustrup認(rèn)為,“明智”的做法是列出安全問題(包括未定義的行為),然后根據(jù)需要使用預(yù)執(zhí)行調(diào)試工具(如靜態(tài)分析器)找到防止這些問題的方法。
沿著這些路線,Stroustrup已經(jīng)在為C++調(diào)用編譯器選項(xiàng)和代碼注釋,以請(qǐng)求類型安全(和資源安全),說這“讓你只在需要的地方應(yīng)用安全保證,并在需要的地方使用你最喜歡的調(diào)優(yōu)技術(shù)…”
新提出的“配置文件”似乎是實(shí)現(xiàn)這一目標(biāo)的一種語言方式。
3、理性看待C++的安全性
Stroustrup還反對(duì)在美國安全局的文件中將C++與C混為一談。他指出,即使是現(xiàn)在,“C++核心指南也專門致力于為那些需要的人提供靜態(tài)保證的類型安全和資源安全,而不會(huì)破壞代碼庫,因?yàn)檫@些代碼庫可以在沒有這種強(qiáng)有力的保證或引入額外的工具鏈的情況下進(jìn)行管理。”
微軟的Visual Studio分析器(及其內(nèi)存安全配置文件)以及許多靜態(tài)分析器已經(jīng)支持這些核心準(zhǔn)則。Stroustrup認(rèn)為,這種方法允許C++“完全實(shí)現(xiàn)這些保證,而花費(fèi)的成本只是轉(zhuǎn)向各種新穎的‘安全’語言的一小部分”。
Stroustrup還引用了他在2021年寫的另一篇論文,該論文指出:“從1979年開始,完全的類型和資源安全就一直是C++的理想(目標(biāo)),并且可以通過語言規(guī)則和靜態(tài)分析強(qiáng)制執(zhí)行的明智編程技術(shù)實(shí)現(xiàn)。”(后來Stroustrup寫道,解決方案是“一套精心設(shè)計(jì)的編程規(guī)則,由庫設(shè)施支持,并由靜態(tài)分析強(qiáng)制執(zhí)行”。)
論文承認(rèn),就其本身而言,“默認(rèn)情況下,核心指南不提供完整的類型和資源安全”——但認(rèn)為它可以通過實(shí)施額外的規(guī)則來保證(例如,“由微軟Visual Studio發(fā)布的核心指南檢查器實(shí)現(xiàn)”)。Stroustrup對(duì)Rust基于編譯器的類型檢查表示認(rèn)可,他寫道:“編譯器不是我們唯一的工具,從來都不是”,并提供了(預(yù)編譯)靜態(tài)分析可以執(zhí)行的強(qiáng)大檢查的具體示例。例如,靜態(tài)分析可以:
- 防止不安全的類型轉(zhuǎn)換
- 防止創(chuàng)建未初始化的對(duì)象
- 確保沒有內(nèi)存引用指針“轉(zhuǎn)義”超出其狹窄定義的范圍而錯(cuò)誤地指向其他對(duì)象
在去年12月對(duì)美國安全據(jù)的回應(yīng)中,Stroustrup寫道,我們生活在一個(gè)“數(shù)十億行C++代碼不會(huì)神奇消失”的世界里,并補(bǔ)充說,逐漸采用這些安全規(guī)則(以及在適當(dāng)?shù)那闆r下采用不同的安全規(guī)則)是很重要的。
在某種程度上,美國國家安全局的論文似乎同意其中的一些觀點(diǎn)。其文件包括了關(guān)于“強(qiáng)化”用非內(nèi)存安全語言編寫的代碼的技巧,推薦了用于靜態(tài)分析(檢查源代碼)和動(dòng)態(tài)分析(在代碼執(zhí)行時(shí)執(zhí)行)的工具,以及簡(jiǎn)化結(jié)果的漏洞相關(guān)工具?!敖鉀Q這些工具發(fā)現(xiàn)的問題可能需要大量的工作,但會(huì)產(chǎn)生更健壯和安全的代碼?!?/p>
美國國家安全局的文件確實(shí)提到了“對(duì)非內(nèi)存安全語言使用附加保護(hù)”所提供的“相當(dāng)大的保護(hù)”。(它還建議通過控制流保護(hù)、地址空間布局隨機(jī)化和數(shù)據(jù)執(zhí)行預(yù)防等安全功能強(qiáng)化編譯和執(zhí)行環(huán)境。)
4、憶往昔,C++做長(zhǎng)期主義者
在Honeypot的《不為人知的開發(fā)者故事》(Untold Developer Stories)的一次新采訪中,72歲的Stroustrup回顧了自己的學(xué)生時(shí)代,當(dāng)他還是個(gè)年輕人時(shí),獲得了獲得了數(shù)學(xué)和計(jì)算機(jī)科學(xué)碩士學(xué)位的他發(fā)現(xiàn)自己的數(shù)學(xué)不如想象中那么好,但“機(jī)器架構(gòu)真的很有趣”。
當(dāng)被問及,如果有時(shí)間機(jī)器可以讓他回到最初創(chuàng)建C++的時(shí)候,他最想改變的東西是什么?Bjarne說,現(xiàn)在的他不會(huì)比創(chuàng)建C++時(shí)的那個(gè)他更了解那個(gè)時(shí)代,他做的任何改動(dòng)可能都無法適應(yīng)那個(gè)內(nèi)存只有1MB的工作環(huán)境,也沒法編譯到早期的640MB Windows電腦上。
“編程語言設(shè)計(jì)的有趣之處在于,如果你成功了,你就擁有了多年前和幾十年前所做的一切,你必須忍受它。一旦你得到了用戶,你就有責(zé)任,其中一個(gè)責(zé)任就是不破壞他們的代碼……有數(shù)千億行C++代碼,我們無法破壞它們?!?/p>
Stroustrup強(qiáng)調(diào)了他對(duì)C++的信心?!拔艺J(rèn)為C++可以做Rust可以做的任何事情,我希望它使用起來簡(jiǎn)單得多。”但他在2020年的采訪中也表示,基本類型安全——確保變量只能訪問其清晰劃分的內(nèi)存塊——是他最早的設(shè)計(jì)目標(biāo)之一,也是他花了幾十年時(shí)間試圖實(shí)現(xiàn)的目標(biāo)。
5、沒有時(shí)間機(jī)器,一切猶如開始
這位年逾古稀的C++創(chuàng)建者,此時(shí)雖然已經(jīng)恢復(fù)信心,但對(duì)于評(píng)論者的言論有些小難過,“當(dāng)我聽到人們?cè)谡務(wù)揅++時(shí),這些人就好似回到八九十年代那樣(指指點(diǎn)點(diǎn))。”
但正如前文所述,世間沒有時(shí)間機(jī)器,C++的設(shè)計(jì)理念也要隨著所處的時(shí)代一路演進(jìn)。
C++在誕生近四十年后,依然保持著強(qiáng)大的生命力。Stroustrup認(rèn)為保持其穩(wěn)定性,并追求漸進(jìn)式進(jìn)化是必要的。
“我從一開始就知道,我不可能構(gòu)建理想的語言,因此我必須以漸進(jìn)式發(fā)展為目標(biāo):改進(jìn)。說真的,我并不相信完美語言的構(gòu)想:要怎樣就算是完美呢?對(duì)誰來說(是完美的)?”他補(bǔ)充說:“為了應(yīng)對(duì)不斷變化的世界的挑戰(zhàn),融入新思想,改進(jìn)是必須的。”
參考鏈接:https://thenewstack.io/can-c-be-saved-bjarne-stroustrup-on-ensuring-memory-safety/