修補的方式可以參考這篇文章,主要以兩個方法(保險一點建議兩個方法都實作),第一個方法比較簡單就是修改 ImageMagick Policy File,標準安裝的位置在 /etc/ImageMagick/policy.xml 這裡,修補請加入以下 XML (GitHub):
sudo vim /etc/ImageMagick/policy.xml
<policymap> <policy domain="coder" rights="none" pattern="EPHEMERAL" /> <policy domain="coder" rights="none" pattern="URL" /> <policy domain="coder" rights="none" pattern="HTTPS" /> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern="MSL" /> </policymap>
另一個方法比較麻煩,就是要判斷要轉檔的檔案內容是否為正確的圖片檔,不單靠著附檔名來判斷。你想的沒錯!要改 Code 才能自行讀取檔頭幾個 Bytes 進行比對,判斷的方法可以參考 List of file signatures 這個列表。
為了確認漏洞是否被修補,那我們來 Hack 一下自己的應用程式好了,參考這裡先建立以下內容的檔案 (GitHub),並儲存為 exploit.png 檔。
push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/image.jpg"|cat /etc/passwd > /tmp/hack.txt")' pop graphic-context
修補漏洞之前可以先用 convert 命令轉換看看,執行如果中標的話就會出現 /tmp/hack.txt 檔案,執行方式如下:
convert exploit.png out.png
要測試自己的系統可以將這個檔案上傳到 Web 應用程式中,一樣如果主機出現 /tmp/hack.txt 就是中標囉。心存善念,施主請服用.......