可重復構建( Reproducible Builds)是證明軟件供應鏈安全的必要手段,2022已被納入SupplyChainSecurityCon的topics以及微軟的S2C2F(Secure Supply Chain Consumption Framework)當中,并受到了Google開源安全團隊的支持贊助。OpenSSF/SLSA在軟件供應鏈完整性與包管理最佳實踐中也對可重復構建有所要求。
2022年openEuler已初步建設可重復構建能力。
什么是可重復構建
對于可重復的構建,給定相同的源代碼、構建環(huán)境和構建指令,任何人均可重建出Bit to Bit完全相同的指定制品。
可重復構建的目的與意義
可重復構建可以驗證二進制是否被植入后門,避免潛在安全風險,從而保障二進制的質量。構建環(huán)境和構建工程能夠被還原,使依賴變化范圍最小化、測試最小化,方便問題定位、提高開發(fā)效率。
通過可重復構建可以創(chuàng)建從代碼到制品的可獨立驗證路徑,結合已有的代碼發(fā)布簽名、軟件倉庫簽名、安全啟動等技術,使開源代碼從生產(chǎn)到使用的全過程可追溯成為可能。
構建差異產(chǎn)生的原因
在代碼構建期間,從源代碼到產(chǎn)品發(fā)布的二進制包,中間每一個步驟、每一個構建工具都有可能引入二進制差異,而這些差異經(jīng)過逐步放大,導致最終發(fā)布的二進制包每次編譯都不相同,而且差異非常巨大。
二進制差異案例(差異放大)
導致構建差異的因素有很多,包含環(huán)境、時間戳、隨機數(shù)、文件亂序等等,這些差異都是在構建過程中生成的。數(shù)字簽名可以證明源碼和二進制的唯一性,但是無法證明源碼與二進制之間對應關系的一致性。證明源碼與二進制一致性的工作量非常大、技術難度高。例如下圖在各編譯過程中可能會產(chǎn)生差異的因素:
openEuler可重復構建方案
openEuler當前的可重復構建是將rpm包構建兩次,再進行對比。在構建過程中利用開源工具libfaketime進行差異消除,構建結束后將兩次構建出的rpm包進行對比,若rpm不一致,則進行解壓繼續(xù)對比,將差異粒度精確到文件,并輸出差異報告。
為了達到構建可重復的目的,通常要滿足兩個條件:
1、構建系統(tǒng)的完全確定性,保證兩次構建的日期、時間完全相同(或者去除掉時間信息),文件順序一致;
2、是用的構建工具集及構建工具需要一致或被記錄。
主要措施有以下三步:
1、 openEuler的可重復構建使用了libfaketime工具消除差異。此工具主要是利用LD_PRELOAD環(huán)境變量進行差異消除。LD_PRELOAD 是 Linux 系統(tǒng)的一個環(huán)境變量,它可以影響程序的運行時的鏈接(Runtime linker),通過此變量將 Linux 系統(tǒng)自帶的動態(tài)庫.so 替換我們自己動態(tài)庫中自定義的函數(shù),例如:time()、gethostname()、random()、rand()等函數(shù),確保編譯過程中獲取的時間、主機名、隨機數(shù)能夠保持一致。
差異消除工具原理
通過使用此工具,產(chǎn)品源代碼不需要修改,從而減少了產(chǎn)品在代碼糾正方面的投資,商業(yè)和開放源代碼工具所產(chǎn)生的差異也將得到消除,也無需進行任何代碼修改,而且時間戳的語義被最大程度地保存。并且可以通過“ unset LD_PRELOAD”格式的命令禁用該工具。
除了libfaketime原有的功能以外,我們在此基礎上進行擴展,增加了精準黑白名單的機制可以有效解決因使用libfaketime而導致的構建失敗問題;并完善了消除隨機數(shù)差異功能,增加了對random()、rand()、/dev/random、/dev/urandom獲取隨機數(shù)方法的替換。
2、 openEuler的可重復構建還用到了unpacker自動化解包對比工具,可以精準分析文件級差異,輸出可視化差異報告。對比兩次構建出rpm的校驗值,若校驗值一致則認為構建可重復;若校驗值不一致,則進行解包對比,若兩個rpm包解壓后所有文件的校驗值均一致,同樣認為構建可重復,若出現(xiàn)不一致文件則使用diffoscope進行對比并輸出差異報告。此外,工具會將RSA、PGP簽名文件從rpm包中拆分出來,不會將簽名文件差異當作是rpm差異。
解包對比工具原理
差異報告樣例
3、將rpm包對比結束后,我們會將對比結果以及差異報告歸檔,并在openEuler的可重復構建網(wǎng)站展示并進行治理。
2022年我們已經(jīng)對openEuler核心1800+個代碼倉分別在arm及x86環(huán)境下進行了可重復構建的比對,涉及軟件包6000+,可重復率達到了98%。今年我們把可重復構建范圍擴大到了openEuler 22.09的Everything版本,構建成功了4130個代碼倉,涉及軟件包14000+,可重復率達到94%左右。經(jīng)過初步的分析,當前大部分不可重復代碼倉是因為構建出的rpm包存在html文件差異。
openEuler可重復構建規(guī)劃
1、 針對不可重復代碼倉分析原因、提出解決建議,并回合到上游社區(qū)。
2、 使用EulerMaker替換OBS進行構建,解決由于libfaketime導致的構建失敗問題,并實現(xiàn)通過“元數(shù)據(jù)”隨時復現(xiàn)構建過程的能力。
3、 逐步提高openEuler代碼倉可重復率,達成Everything版本代碼倉可重復率98%以上,領先業(yè)界水平。
4、 復制可重復構建能力,幫助合作伙伴達成可重復構建目標。
審核編輯:劉清
-
freebsd
+關注
關注
0文章
37瀏覽量
10785 -
GNU
+關注
關注
0文章
143瀏覽量
17512 -
openEuler
+關注
關注
2文章
319瀏覽量
5913 -
Debian
+關注
關注
0文章
75瀏覽量
1188
原文標題:可重復構建為軟件供應鏈安全保駕護航
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論