LWN: Fedora將缺省提供debuginfod!
關(guān)注了就能看到更多這么棒的文章哦~
Enabling debuginfod for Fedora by default
By Jake Edge
April 14, 2021
DeepL assisted translation
https://lwn.net/Articles/852416/
4 月初,F(xiàn)edora 項(xiàng)目經(jīng)理 Ben Cotton 發(fā)布了一項(xiàng)建議,在 Fedora 35 中缺省使用 Fedora 的 debuginfod 服務(wù)器。debuginfod 目的是幫助開發(fā)者用各種工具調(diào)試或追蹤那些缺乏必需的源代碼和調(diào)試符號(hào)的程序。服務(wù)器可以根據(jù)需求來直接向工具提供這些數(shù)據(jù)。但在默認(rèn)打開這個(gè)功能之前,有一些安全和隱私問題需要解決。
實(shí)際上,這個(gè)功能所需的源代碼和調(diào)試信息 Fedora 早就已經(jīng)具有了,但是存放在 debuginfo 和 src RPMs 中,必須先被安裝上,之后才能被調(diào)試工具訪問到。這些 RPM 文件相當(dāng)大,比起用戶在追蹤、調(diào)試過程中可能想看的那少數(shù)幾個(gè)文件的符號(hào)表文件以及源代碼文件來說,要大得多。此外,通過 DNF 安裝它們的話還需要 root 權(quán)限,而用戶可能不具備這種權(quán)限。debuginfod 功能所提供的一個(gè)非常有價(jià)值的服務(wù),就是只根據(jù)合適的時(shí)機(jī),以及用戶的權(quán)限,來抓取必需的那一小部分?jǐn)?shù)據(jù)。
2019 年 10 月的一篇 Red Hat 博客文章描述了 debuginfod,并指出它是 elfutils 工具中即將出現(xiàn)的一個(gè)新功能。它的背后想法是,GCC 和 LLVM 會(huì)在 object 文件中存儲(chǔ)的 Build.ID hash 值可以用來識(shí)別對(duì)應(yīng)的是哪個(gè)版本的符號(hào)表和源代碼。Build.ID 是在 2007 年被添加到 Fedora 8 中的。Build.ID 可以直接根據(jù) object 文件找出對(duì)應(yīng)的調(diào)試符號(hào)表,并且源代碼路徑也存儲(chǔ)在 object 文件中,也可以用來識(shí)別(并提供出)正確的源代碼包。
2020 年 10 月,F(xiàn)rank Ch. Eigler 在 fedora-devel 郵件列表中發(fā)布了關(guān)于 debuginfod 功能和相應(yīng)的測試服務(wù)器的說明。他想了解一下大家是否有興趣在 Fedora 建立自己的服務(wù)器:
問題是 Fedora 本身并沒有運(yùn)行一個(gè)這樣的服務(wù)器,而我們的測試服務(wù)器只能承載 debuginfo/debugsource rpms 以及 architectures 代碼和符號(hào)表的一個(gè)子集。所以,F(xiàn)edora 的開發(fā)者、用戶無法獲得所有信息,或者說,無法從官方渠道獲得。我想知道現(xiàn)在是否是時(shí)候該建立這樣的一個(gè)服務(wù)器了。如果大家有興趣的話,我可以開始跟 Fedora 的基礎(chǔ)設(shè)施人員討論具體細(xì)節(jié)。
總體反應(yīng)是很積極的,這也引出了在 Fedora 35 版本中設(shè)置 DEBUGINFOD_URLS 環(huán)境變量的提議,以便在需要調(diào)試信息的時(shí)候可以使用新的 Fedora debuginfod 服務(wù)器。正如該功能提案者 Eigler 所指出的,在 debuginfod.stg.fedoraproject.org 有一個(gè)暫存服務(wù)器(staging server),所以 Fedora 用戶已經(jīng)可以開始嘗試了:
[……]大多數(shù)工具已經(jīng)可以支持它了,試試吧。
% export DEBUGINFOD_URLShttps://debuginfod.stg.fedoraproject.org/
不久之后,所有的 F32+軟件包/版本/架構(gòu)都可以通過這種方式進(jìn)行調(diào)試。
一旦這個(gè)暫存版本的服務(wù)器確實(shí)流行起來,那么就會(huì)把數(shù)據(jù)轉(zhuǎn)移到正式的生產(chǎn)環(huán)境服務(wù)器 debuginfod.fedoraproject.org 上去,這也是 DEBUGINFOD_URLS 在 Fedora 35 中的缺省設(shè)置??偟膩碚f,使用暫存服務(wù)器的效果很好,盡管 Michael Catanzaro 對(duì)它的性能有點(diǎn)擔(dān)心:
我昨天開始測試暫存服務(wù)器。它看起來有點(diǎn)慢——我擔(dān)心有人調(diào)試關(guān)于 WebKit 的東西會(huì)怎么樣,在桌面版上這個(gè)可能會(huì)很常見——但除此之外它工作得非常好。印象很深。非常棒。
Owen Taylor 指出,該功能也適用于 Flatpak 的應(yīng)用程序。Eigler 解釋說,Catanzaro 看到的一些性能問題可能是因?yàn)闀捍娣?wù)器在從 Fedora Koji 構(gòu)建系統(tǒng)中來 pull RPM 文件引起的。在這個(gè)過程中確實(shí)有一些無法避免的延遲,當(dāng)然使用緩存可能有幫助:
在從一些大 rpm 中尋找新文件的情況下,在解壓(CPU 密集型的操作)、將選出的文件保存到臨時(shí)磁盤(RAM/storage 密集型的操作),然后將文件發(fā)送給你(網(wǎng)絡(luò)密集型的操作),這些方面確實(shí)會(huì)有一些延遲。
在服務(wù)器上,有一些預(yù)取/緩存配置選項(xiàng),可以利用 fedora-infra 提供的功能強(qiáng)大的服務(wù)器。
在客戶端也會(huì)積極進(jìn)行緩存,對(duì)文件有為期一周的保留時(shí)間。
David Malcolm 有點(diǎn)擔(dān)心 debuginfo 的 python 代碼中用到的一些 Python 程序。早在 2010 年,在 Fedora 13 版本中,他就已經(jīng)添加了這些程序,是用來協(xié)助在 GDB 對(duì) Python 調(diào)試。但他對(duì)自動(dòng)安裝這些程序感到擔(dān)心:
我對(duì)通過這種服務(wù)來提供 python 腳本感到緊張,因?yàn)楸绕?DWARF 格式來說,壞人利用 python 腳本做壞事的門檻要低得多,所以也許如果人們想要.py 文件,他們必須以傳統(tǒng)的方式安裝調(diào)試信息包?(在 rpm 文件中實(shí)際上也是.py 文件,但與手動(dòng)安裝 debuginfo rpms 相比,如果自動(dòng)下載這些 py 文件而不給用戶參與的機(jī)會(huì),似乎可能會(huì)導(dǎo)致麻煩)。
Eigler 說,debuginfod 沒有辦法為.py 程序單獨(dú)做什么,但如果大家認(rèn)為重要的話,可以后面增加一個(gè)處理。他指出,數(shù)據(jù)的出處本身是為了提供安全保證的:
[……]我不確定被破壞的 DWARF 在本質(zhì)上是否比被破壞的 Python 代碼更安全。但所有這些都是基于這樣一個(gè)前提的:文件來自一個(gè)普遍受信任的構(gòu)建系統(tǒng)、提供了受信任的產(chǎn)物、由受信任的人維護(hù)。如果有惡意的文件進(jìn)來,那么這個(gè)服務(wù)質(zhì)量就會(huì)被降低,并且(或者)客戶會(huì)受到影響。
類似地,Bj?rn Persson 指出,該提案缺乏對(duì)各種安全和隱私問題的處理。該提案確實(shí)提到了在 2 月份宣布為 Debian 提供 debuginfod 服務(wù)后,Debian 用戶提出的一些隱私問題,但也指出 openSUSE Tumbleweed 默認(rèn)啟用了該功能(2020 年 2 月),"我們沒有聽到說有什么爭議"。如果本地系統(tǒng)缺乏適當(dāng)?shù)奈募?,那么?dāng)前在調(diào)試的文件的 Build.ID 和源文件名就會(huì)被泄露給服務(wù)器。Debian 在安裝時(shí)增加了一個(gè)提問,來決定是否啟用該功能。
除了隱私問題外,Persson 還希望該提案能解決服務(wù)器的安全問題:可能會(huì)有什么樣的攻擊、如何驗(yàn)證從服務(wù)器收到的文件,以及對(duì)文件做什么樣的簽名和認(rèn)證。Eigler 感謝他的問題,并在提案的在線版本中增加了一個(gè) "安全常見問題(Security FAQ)" 部分,對(duì) Persson 的問題進(jìn)行了初步解答。
正如大家也想到的一樣,攻擊范圍在很大程度上取決于使用這些數(shù)據(jù)的工具、工具具有什么權(quán)限、穩(wěn)健性、以及被調(diào)試程序有些什么權(quán)限。對(duì)于從服務(wù)器上提供的信息并沒有增加特別的驗(yàn)證。正如 Eigler 對(duì) Python 的回應(yīng)所指出的,這一切都?xì)w結(jié)為對(duì)發(fā)行版的信任,以及對(duì) HTTPS 的信任。正如 FAQ 中所說:
Debuginfod 服務(wù)器對(duì)原版發(fā)行版中的數(shù)據(jù)原樣提供出來,并通過 HTTPS 安全地傳輸。在 Fedora 中沒有每個(gè)文件的簽名的底層機(jī)制,那么 debuginfod 也沒有必要添加一個(gè)。因此,除了浪費(fèi)帶寬再下載相應(yīng)的簽名后的檔案并進(jìn)行比較外,沒有任何其他機(jī)制可以手動(dòng)驗(yàn)證這些文件??蛻舳舜a將對(duì)文件權(quán)限采取一些基本措施,以減少發(fā)生意外改動(dòng)的風(fēng)險(xiǎn)。原則上,如果收到的文件被篡改,那么同樣的篡改者也可以擾亂用戶的調(diào)試工具,甚至接管賬戶。
這個(gè)功能有許多好處,比如可以讓那些無法使用 DNF 來安裝調(diào)試符號(hào)表 package 的用戶更方便,以及與通常相當(dāng)大的調(diào)試信息包相比,可以大大減少需要發(fā)送和存儲(chǔ)的數(shù)據(jù)量。debuginfod 服務(wù)器只發(fā)送用戶當(dāng)前調(diào)試任務(wù)所需的部分內(nèi)容,而不會(huì)發(fā)送整個(gè) package 的所有相關(guān)源代碼和調(diào)試信息。
雖然可能需要為管理員增加一個(gè)明確的選項(xiàng)來禁用(或選擇不使用)debuginfod 服務(wù)器,但 Fedora 35 似乎極有可能默認(rèn)使用它們。同時(shí),用戶現(xiàn)在已經(jīng)可以通過適當(dāng)?shù)卦O(shè)置 DEBUGINFOD_URLS 環(huán)境變量來開始查詢服務(wù)器。
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~
