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

eUPS0505斷電續(xù)航模塊,為嵌入式系統(tǒng)保駕護航

充電樁安全用電消防系統(tǒng):為電動自行車保駕護航
Arm為汽車技術(shù)的未來保駕護航
充電樁“耐力大考驗”:老化負載研究,為持久續(xù)航保駕護航
安科瑞蓄電池在線監(jiān)控系統(tǒng)為鐵塔基站的穩(wěn)定運行保駕護航

評論