天天看點

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

關于ImageMagick

ImageMagick是一個功能強大的開源圖形處理軟體,可以用來讀、寫和處理超過90種的圖檔檔案,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以對圖檔進行切割、旋轉、組合等多種特效的處理。

由于其功能強大、性能較好,并且對很多語言都有拓展支援,是以在程式開發中被廣泛使用。許多網站開發者喜愛使用ImageMagick拓展來做web上的圖檔處理工作,比如使用者頭像生成、圖檔編輯等。

更多的拓展支援:

豬隊友之ImageMagick

ImageMagick這次被曝出的漏洞應該算是一個本地的指令執行漏洞,危害不是太大,但是由于大量的web程式都使用了他的拓展,導緻這些本地指令執行漏洞在web的環境裡可以被遠端觸發,變成了危害巨大的遠端指令執行。真的是名副其實的“豬隊友”了。

指令執行漏洞是出在ImageMagick對https形式的檔案處理的過程中。

ImageMagick之是以支援那麼多的檔案格式,是因為他内置了非常多的圖像處理庫,對于這些圖像處理庫,ImageMagick給他起了個名字叫做“Delegate”(委托),每個Delegate對應一種格式的檔案,然後通過系統的system()指令來調用外部的程式對檔案進行處理。

其預設的配置檔案在源碼的config/delegates.xml.in中,一般使用者很少會去修改這個配置檔案。

具體的内容如下:

對于https形式的檔案,他是這樣處理的:

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

command定義了他具體帶入system()執行的指令:"wget" -q -O "%o" "https:%M"。

%M是占位符,在配置檔案中有對占位符的定義:

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

%m被定義為輸入的圖檔格式,也就是我們輸入的url位址。但是由于隻是做了簡單的字元串拼接,是以我們可以将引号閉合後通過管道符帶入其他指令,也就形成了指令注入。

比如url為:https://example.com"|ls "-la

那實際指令就變成了:

"wget" -q -O "%o" " https://example.com"|ls "-la"

ls –la被執行了。

如圖所示:

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

危險更新

讓漏洞危害進一步加大的是,ImageMagick支援通過.svg、.mvg(ImageMagick自定義的一種類似svg的格式)這種類型的檔案來進行圖形繪制,并允許在其中加載其他的delegate(比如存在漏洞的https delegate)。并且在圖形處理的過程中,ImageMagick會自動根據其内容進行處理,也就是說我們可以将檔案随意定義為png、jpg等網站上傳允許的格式,這大大增加了漏洞的可利用場景。

比如我們生成一個exploit.png的檔案,内容為:

push graphic-context

viewbox 0 0 640 480

fill 'url(https://example.com/image.jpg"|ls "-la)'

pop graphic-context

在其中我們使用了fill url()的形式調用存在漏洞的https delegate,當ImageMagick去處理這個檔案時,漏洞就會被觸發。

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

影響範圍

由于大量的web應用采用了ImageMagick做圖檔處理,是以這次漏洞的影響範圍還是非常廣泛的。目前已知PHP、java的ImageMagick擴充都在受影響之列,還有更多的拓展比如python、ruby、C#沒有人去研究,是以我相信這個漏洞還會有更大的影響範圍和利用場景。

在開源軟體裡,wordpress最早被爆出受到漏洞影響,由于其使用了PHP擴充ImageMagick處理圖檔,是以當攻擊者擁有一定的權限(編輯權限即可),就可以通過背景的圖像處理功能觸發遠端指令執行。

詳細分析參考ricter的部落格:

除了php,烏雲社群還有人爆出java拓展一樣受到影響:

還可以利用這個漏洞bypass php disable function,這個利用場景真的很巧妙,和以前利用bash的漏洞通過mail函數bypass有異曲同工之妙。

當然我覺得存在問題的肯定不止這一家。

更多因為豬隊友躺槍的還有衆多使用了ImageMagick做圖檔處理的網際網路廠商,我就不一一列舉了,感興趣的可以關注補天、烏雲等漏洞平台。我們後續也會跟進一些開源程式的受影響情況。

漏洞修複

這個漏洞在4月30日被報告給了ImageMagick官方,官網當天便釋出了一個新版本6.9.3-9修複這個問題,我們看一下官方是如何修複這個漏洞的。

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

将%M變為了%F,其實也就是通過filter過濾了一遍,通過白名單限制了允許傳入的字元串:

那麼在白名單裡的有哪些字元呢:

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

圖中的whitelist也就是白名單裡的字元串,是的,你沒有看錯,單引号、雙引号、反引号、轉義符這些危險字元依然被允許傳入。

在逗我嗎…?

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

随後有人指出其修複方法可被繞過,ImageMagick于是在5月3日又釋出了6.9.3-10版本,更改了允許傳入字元的白名單。

php imagemagick 漏洞,ImageMagick指令執行漏洞分析

是以目前将ImageMagick更新至6.9.3-10版本可修複此安全漏洞,同時官方還建議使用者,如果不需要這些功能,可以通過配置policy.xml的方式來禁止https、mvg這些delegate,或者直接在配置檔案删除相應的delegate。

參考