天天看點

LibcarePlus 使用者态熱更新檔技術那些事

LibcarePlus 使用者态熱更新檔技術那些事

LibcarePlus 使用者态熱更新檔作為 openEuler 社群關鍵技術,受到了廣大開發者的關注和讨論。openEuler 社群與天翼雲基礎架構技術團隊通力合作,共同打造了全面支援 aarch64 及 x86 平台的 LibcarePlus 熱更新檔功能,可以應用于 CVE 漏洞修複,也可應用于不中斷應用服務的緊急 bug 修複。下面我們就來聊聊什麼是熱更新檔技術。

熱更新檔技術背景

當運作的程式存在漏洞的時候,我們一般有以下幾種解決辦法:

  1. 替換最新的包含修複更新檔的 OS 版本,在有主備倒換能力的組網環境上,可以先将目前運作的程式遷移到備區,待主區更新完後,再将程式遷移到主區;
  2. 替換程式的 rpm 包,然後重新運作程式(注意此時需要考慮依賴包的相容性),對于具備熱替換能力的程式,則可以利用熱替換能力,實作程式運作内容的替換;
  3. 直接給運作的程式内容打更新檔,替換有問題的代碼,實作程式漏洞的修複;

從更新檔粒度上來說,上述技術漏洞修複粒度是從大到小變化的:第一個是系統級的,主要涉及的技術有熱遷移技術;第二個是 rpm 包級的,主要涉及的技術有熱替換;第三個是運作程式級的,主要涉及的技術有熱更新檔。從業務中斷時長來說,上述技術的業務中斷時長也是從大到小變化的:第一種技術業務中斷時間一般在分鐘級,且一般涉及整個系統業務的主備倒換,更新周期最長,一般需要幾個月的更新視窗;第二種技術業務中斷時間一般在百毫秒級,且該技術一般不通用,需要侵入式修改和适配大量業務代碼,更新周期相對比較短,一般僅需要一個月的更新視窗;第三種技術業務中斷時間則一般在毫秒級,該技術比較通用,不需要侵入式修改和适配業務代碼,僅需要适配一些通用代碼,适配工作量較小,更新周期相對比較短,一般僅需要一個月的更新視窗。

通過上述分析,我們大概能總結出熱更新檔的如下幾個優點:一是熱更新檔能夠在不影響現網業務的情況下,完成程式漏洞的修複;二是熱更新檔适用于需要快速響應的市場環境,将驗證工作從版本驗證簡化為更新檔驗證。總結一句話:熱更新檔短小精悍,适合使用在需要快速響應的場景中。

今天,我們就來簡單介紹一下,集萬千寵愛于一身的 LibcarePlus 熱更新檔技術。

LibcarePlus 熱更新檔技術的基本原理

LibcarePlus 熱更新檔技術是基于上遊社群 libcare 獨立發展的分支,目前由 openEuler 社群進行自主孵化。相比于上遊社群的 libcare,LibcarePlus 支援主流的 x86_64 架構和 aarch64 架構,全面支援 openEuler Qemu 元件,支援函數級過濾,支援增量更新檔,支援更新檔檔案解析等。

我們以 LibcarePlus Qemu 熱更新檔技術為例,進行相關介紹。熱更新檔的整體架構如下:

LibcarePlus 使用者态熱更新檔技術那些事

LibcarePlus 熱更新檔技術主要包括:熱更新檔制作、更新檔管理和更新檔加/解除安裝。

熱更新檔制作

LibcarePlus 制作熱更新檔的基本原理是基于彙編級指令比較技術。LibcarePlus 通過比較基線代碼生成的彙編中間檔案和打了更新檔的基線代碼生成的彙編中間檔案,找到兩者之間的差異部分;再基于差異部分,去除備援段和修複重定位資訊,最終得到熱更新檔 kpatch 檔案。在分析彙編差異的前,LibcarePlus 會基于一些關鍵資訊将彙編内容分成函數塊和變量塊,然後通過比較函數塊和變量塊之間的差異,找到差異的函數和變量。更新檔制作的大概流程如下圖所示:

LibcarePlus 使用者态熱更新檔技術那些事

Qemu 熱更新檔管理

依托于 libvirt 元件對 Qemu 的管理,openEuler 同樣将 Qemu 熱更新檔的管理內建到 libvirt 中。通過與虛拟機的生命周期互動,libvirt 能夠更完美地尋找到 Qemu 更新檔加載的最佳時機,完成對 Qemu 元件熱更新檔的管理。

熱更新檔加載/解除安裝

熱更新檔加/解除安裝的基本原理如下圖所示:

LibcarePlus 使用者态熱更新檔技術那些事

LibcarePlus 熱更新檔加/解除安裝基于核心提供的 ptrace 能力。通過 ptrace 目标程序,将目标程序短暫當機,随後進行更新檔加載環境的安全校驗,在確定更新檔加載環境安全的情況下,以 mmap 映射的方式,将适配好的更新檔檔案插入到目标程序的記憶體空洞中。在執行完上述步驟後,通過修改缺陷函數的前面五個位元組的代碼,讓缺陷函數在被調用時跳轉到新函數的位址中,進而使熱更新檔生效。最後,解凍目标程序,完成熱更新檔的加載。

在熱更新檔加載過程中,缺陷函數被替換的前五個位元組代碼會儲存在目标程序的熱更新檔的管理結構中,将這五個位元組代碼重新寫回原位址處,可使熱更新檔復原到原來狀态,進而實作了熱更新檔解除安裝。