關於 CVE-2019-12415
這是最近 POI 官方公佈出來的一個 XXE 漏洞,可以影響到 4.1.0 版本,官方已在十天前更新了 4.1.1 版本,最新版本修復了這個 XXE漏洞。
In Apache POI up to 4.1.0, when using the tool XSSFExportToXml to convert user-provided Microsoft Excel documents, a specially crafted document can allow an attacker to read files from the local filesystem or from internal network resources via XML External Entity (XXE) Processing.
根據官方介紹,漏洞是在使用XSSFExportToXml類 xlsx 轉 xml 時觸發的。
diff 了一下 4.1.0 和 4.1.1 XSSFExportToXml 類的源碼,發現在 isValid 方法裡多設置了一個 feature,問題就出在 org.apache.poi.xssf.extractor.XSSFExportToXml#isValid 方法裡,如果org.apache.poi.xssf.extractor.XSSFExportToXml#exportToXML(java.io.OutputStream, java.lang.String, boolean)方法的第三個參數為 true 則會進入isValid觸發XXE。
復現
我改了一下官網的測試用例,如果寫成這樣的,就會有漏洞。
<code>XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("CustomXMLMappings.xlsx")));
for (XSSFMap map : wb.getCustomXMLMappings()) {
XSSFExportToXml exporter = new XSSFExportToXml(map); // 使用 XSSFExportToXml 將 xlsx 轉成 xml
exporter.exportToXML(System.out, true);//第一個參數是輸出流無所謂,第二個參數要為 true
}
複製/<code>
然後下載這個 xlsx 文件。
https://github.com/apache/poi/raw/f509d1deae86866ed531f10f2eba7db17e098473/test-data/spreadsheet/CustomXMLMappings.xlsx
把文件改為“CustomXMLMappings.zip”並解壓文件。
編輯 CustomXMLMappings/xl/xmlMaps.xml 文件。
在 <schema> 標籤裡面加上一行代碼。/<schema>
<code><redefine>
複製/<code>
然後把 xlsx 釋放出來的所有文件再用 zip 打包回去,改成 CustomXMLMappings.xlsx。
最後一步監聽本地 8080 端口,運行這段代碼。
<code>XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("CustomXMLMappings.xlsx")));
for (XSSFMap map : wb.getCustomXMLMappings()) {
XSSFExportToXml exporter = new XSSFExportToXml(map); // 使用 XSSFExportToXml 將 xlsx 轉成 xml
exporter.exportToXML(System.out, true);//第一個參數是輸出流無所謂,第二個參數要為 true
}
複製/<code>
修復
- 更新到 4.1.1 及以上版本。
- 不要使用 XSSFExportToXml 類,或者不要讓 exportToXML 方法的第二個參數為 true
閱讀更多 暗影實驗室 的文章