最近需要修復cve漏洞,研究了如何在源碼上修復漏洞,在這里記錄一下。
目錄
I. 介紹
漏洞和補丁
CVE漏洞
普通漏洞和CVE漏洞的區(qū)別
II. 獲取補丁
III. 應用補丁
常見的打補丁工具
打補丁的步驟
patch的用法
I. 介紹
首先介紹一下相關的概念
漏洞和補丁
漏洞是計算機軟件中存在的錯誤或者缺陷。
攻擊者可以利用漏洞在未經(jīng)授權(quán)的情況下訪問和修改文件,以此破壞系統(tǒng)或收集敏感數(shù)據(jù)。
嚴重的漏洞可能導致數(shù)據(jù)泄露,系統(tǒng)崩潰或者系統(tǒng)被控制。
為了解決漏洞帶來的問題,軟件開發(fā)商會發(fā)布一個或多個“補丁”來修復漏洞。
?一旦補丁安裝成功,相應的漏洞將被消除,系統(tǒng)將變得更加安全和穩(wěn)定。
CVE漏洞
CVE(Common Vulnerabilities and Exposures)漏洞是指由于軟件或硬件產(chǎn)品中存在的安全漏洞所引發(fā)的安全問題。
漏洞編號格式為“CVE-年份-序號”,例如“CVE-2022-1234”,每個漏洞都會被分配一個唯一的CVE編號。
普通漏洞和CVE漏洞的區(qū)別
CVE漏洞和普通漏洞的區(qū)別在于是否有CVE編號。
CVE編號由MITRE公司負責分配,MITRE公司是一家非盈利性的研究機構(gòu)。
MITRE公司根據(jù)一定的標準來選擇哪些漏洞應該被分配CVE編號。這個標準主要包括漏洞的嚴重性、漏洞的公開情況、漏洞的重要性和影響范圍等方面。一般來說,只有那些被認為有嚴重影響和公開的漏洞才會被分配CVE編號。
需要注意的是,CVE漏洞并不一定是最嚴重的漏洞。
II. 獲取補丁
要獲取補丁之前首先要確定改漏洞是否被修復(有些漏洞沒有被修復),在以下網(wǎng)站查詢。
Enterprise Open Source and Linux | Ubuntu
舉個例子,假如我要在ubuntu2004上修復CVE-2020-14928,先在網(wǎng)站上查一下。
?2004對應的名稱是focal,對應的狀態(tài)是Released。
說明這個問題在2004上已經(jīng)修復了,修復的版本是3.36.3-0ubuntu1.1。
為了簡單,你可以直接將軟件升級到這個版本。
出于項目需要,要使用舊版本的軟件,就需要把對應的補丁應用在舊版本上。
在對應漏洞的網(wǎng)頁上會附上使用的patch的網(wǎng)址,像是修復這個漏洞的有兩個patch。
我們進入gitlab,選擇Plain Diff將改動(patch)下載下來,改個名字。
??
III. 應用補丁
常見的打補丁工具
patch
一般使用patch指令來打patch。(好像是廢話)
patch指令是Linux系統(tǒng)中最基本的打補丁工具。
quilt
quilt是一個比patch更高級的打補丁工具,可以用來管理多個補丁,并對其進行排序、組合和卸載等操作。
這種方法沒學明白,先不詳細寫
diff和patch組合
這是一種手動打補丁的方法,需要手動使用diff命令生成補丁文件,然后使用patch命令應用補丁。
打補丁的步驟
這里以patch指令為例,介紹打補丁的步驟。
將剛剛的兩個diff文件改名,效果如下:
?我們將項目的源碼下載到本地,效果如下:
?
patch --verbose --dry-run --ignore-whitespace --fuzz 3 -p1 < patch的相對路徑
用這條指令來打補丁,在解釋為什么可以這樣打補丁之前先插播一下patch的用法
patch的用法
patch的作用則是將diff記錄的結(jié)果(即補?。玫较鄳募▕A)上。最常見的用法為:
patch -pNUM <patchfile>
-p Num
忽略幾層文件夾,隨后詳解。
-E
選項說明如果發(fā)現(xiàn)了空文件,那么就刪除它
-R
取消打過的補丁。
-l or --ignore-whitespace
忽略修補數(shù)據(jù)與輸入數(shù)據(jù)的跳格,空格字符
--verbose
詳細顯示指令的執(zhí)行過程
--dry-run
嘗試patch軟件,并不真正改動軟件
-F<行數(shù)> or -fuzz<行數(shù)>
非精確匹配的行數(shù)目
為了解釋?-p?參數(shù),需要看看如下patch文件片段:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999 +++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用參數(shù)?-p0,那就表示從當前目錄找一個叫做old的文件夾,再在它下面尋找?modules/pcitable?文件來執(zhí)行patch操作。
而如果使用參數(shù)?-p1,那就表示忽略第一層目錄(即不管old),從當前目錄尋找?modules?的文件夾,再在它下面找pcitable。
理解了patch的用法再來看我們的指令。
打開diff文件,默認找a/src/camel/camel-stream-buffer.c文件(對應---那行的文件)
我們解壓源碼之后發(fā)現(xiàn)沒有a目錄,只有src目錄(源碼下載到本地效果圖里有),所以p對應的num數(shù)為1。
所以切換到src上一級所在的目錄,執(zhí)行patch --verbose --dry-run --ignore-whitespace --fuzz 3 -p1 < patch的相對路徑 即可。
當然,當前使用了--dry-run參數(shù),如果patch成功應用,就可以把這個參數(shù)去掉了。
出現(xiàn)succeed即為成功。
為了深入理解patch的p參數(shù),我們來換個目錄試一下。
p參數(shù)代表忽略的目錄層數(shù),我們之前是忽略了一層,我們能不能忽略兩層呢?
當然是可以的!
光看文字可能有點亂,我在這里加了個表格。
忽略層數(shù) | 對應目錄 |
0層 | a/src/camel/camel-stream-buffer.c |
1層 | src/camel/camel-stream-buffer.c |
2層 | camel/camel-stream-buffer.c |
忽略兩層的話,就要找camel目錄了。文章來源:http://www.zghlxwxcb.cn/news/detail-675029.html
camel目錄在哪里呢?src目錄下,所以我們進入src目錄下,執(zhí)行atch --verbose --dry-run --ignore-whitespace --fuzz 3 -p2?< patch,即可成功應用補??!文章來源地址http://www.zghlxwxcb.cn/news/detail-675029.html
到了這里,關于Ubuntu下漏洞的修復流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!