看个电子书都会被黑客攻击,这是上面情况?
自2007年以來,亞馬遜已售出數千萬臺Kindle,但這也意味著數以千萬計的人可能會因為這些 Kindle 中的軟件漏洞而被黑客攻擊。他們的設備可能會變成木馬,或者他們的私人本地網絡會受到攻擊,甚至他們的賬單帳戶中的信息也可能會被盜。
遠程訪問用戶 Kindle 的最簡單方法就是對電子書發起攻擊。含有惡意程序的電子書可以通過“自助出版”服務發布并在任何虛擬圖書館(包括 Kindle 商店)中免費訪問,或通過亞馬遜“發送到 Kindle”服務直接發送到最終用戶設備。
為了驗證這種攻擊,研究人員成功制作了一本含有惡意程序的書。如果你在 Kindle 設備上打開這本書,它可能會導致一段隱藏的代碼以 root 權限執行。此時,用戶就已經失去了對電子閱讀器的控制。
該問題已于 2021 年 2 月報告給亞馬遜,并于 2021 年 4 月在 5.13.5 版本的 Kindle 固件中修復,修補后的固件將自動安裝在連接到互聯網的設備上。
Kindle Touch 架構
基本上,Kindle OS 是一個 Linux 內核,其中包含主要由 busybox 提供的一組本機程序、用于進程間通信的 LIPC 子系統以及用于用戶界面 (UI) 和服務的 Java 和 Webkit 子系統。
Touch 架構
LIPC 是一個基于 D-Bus 的 IPC 庫及其將所有 Kindle 組件鏈接在一起的環境。 Kindle 進程可以使用此庫來啟動應用程序、公開應用程序屬性/設置、監聽或觸發事件。例如,用 HTML 和 Javascript 編寫的 Webkit 應用程序可以使用 LIPC 與 Java 服務或本機應用程序交互。
大多數 UI 是用 Java 編寫的,Java 子系統(框架)為服務和 UI(所謂的Booklets)提供 LIPC 處理程序。比如 Kindle 主頁 UI 窗口就是框架管理的 com.lab126.booklet.home Booklets。
Webkit 子系統(HTML5 和 Javascript)是另一種創建 UI 元素的方法。內置的實驗瀏覽器是 Webkit 子系統的一部分。 Pillow 是一個允許從 Javascript 訪問 LIPC 的庫。
Kindle組件的解析
Kindle 電子閱讀器固件的最新版本(5.13.4)已在亞馬遜官方網站公開下載,源代碼也部分可用。但是源代碼對研究人員的研究沒有幫助,因為它主要由第三方開源項目組成,包括 Linux 內核,并在亞馬遜上進行了小幅調整,負責解析和呈現沒有源代碼的電子書組件。
研究人員的第一個目標是發現電子書解析框架中的漏洞,研究人員有足夠的固件文件,不需要真正的 Kindle 設備。
當你在Kindle設備上下載一本新書時,/mnt/us/documents是常規的電子書目錄,誰先處理文件?/usr/bin/scanner 服務會定期掃描文檔目錄中的新文件,并根據文件擴展名使用“提取器”庫之一從電子書中提取元數據。所有提取器都列在 /var/local/appreg.db sqlite 數據庫中。每種支持的 Kindle 電子書格式都有一個處理程序:
如果掃描程序與文件擴展名不匹配或出現解析錯誤,則不會向用戶顯示電子書。
研究人員沒有深入研究掃描過程,因為提取元數據的操作過于簡單,無法提示解析錯誤。
掃描程序完成工作后,主屏幕上會顯示新書的縮略圖。此時,Java 框架負責在用戶點擊時打開這本書。可以在 /opt/amazon/ebook/lib 固件目錄中找到實現打開和呈現電子書邏輯的 Java 存檔 (JAR) 文件。主要是 MobiReader-impl.jar、YJReader-impl.jar、PDFReader-impl.jar、HTMLReader-impl.jar 和 TopazReader-impl.jar 文件。
為了進一步研究,研究人員決定將注意力集中在 PDF 文件格式上,因為它是最常見但同時也是復雜的格式之一。
讓我們看看PDFReader-impl.jar(com.amazon.ebook.booklet.pdfreader.impl.PDFModel類)中PDF書籍打開函數的實現:
此函數只是 nativeOpenPDFDocument 本機函數的包裝程序,其主體位于 /usr/java/lib/libPDFClientJNI.so 庫中。
nativeOpenPDFDocument函數啟動PDF服務器/usr/bin/pdfreader,分叉(forking)進程,并通過開源HTTP客戶端/服務器庫/usr/lib/libsoup-2.4.so同步向其發送“openBook”消息。實際上,它會向 https://127.0.0.1:7667/command/openBook 發送 GET 請求。
pdfreader 服務器是研究人員研究的主要目標,最后,研究人員將在此過程的上下文中運行有效載荷。
在啟動時,pdfreader 服務器通過 setuid 調用將自身降低到“framework”用戶(uid 9000)的權限。然后它啟動一個監聽端口 7667 的soup服務器,為高級 PDF 操作定義了數十個處理程序,包括研究人員感興趣的“openBook”和“startRendering”處理程序。
由 Amazon 編寫的 /usr/lib/libFoxitWrapper.so 庫提供了一個用于處理 PDF 文件的 API。 pdfreader 在它的soup處理程序中使用這個庫。例如,“openBook”處理程序如下所示:
請注意 libFoxitWrapper.so 庫的以下重要函數:
openPDFDocumentFromLibrary(char file, char password, uint32_t* handle) ——打開 PDF 文檔。
getCurrentPage(uint32_t handle, uint32_t page, uint32_t flag)——將 PDF 頁面解析為內部結構。
renderPageFromLibrary(uint32_t handle, uint32_t page, uint32_t width, uint32_t height, float scale, uint8_t Landscape, uint8_t* out) ——渲染 PDF 頁面并將其轉換為圖像,當被調用時, stream filter開始被解析。
這些函數是對 PDF 樹結構進行模糊測試的良好切入點。
顧名思義,libFoxitWrapper.so 是由 /usr/lib/libfpdfemb.so 庫在 Kindle 設備上提供的流行 Foxit PDF SDK 的包裝程序。 libfpdfemb.so 是 Foxit Software Inc. 專有的閉源庫。 Foxit Embedded PDF SDK 手冊可以在網上找到。
模糊 PDF 過濾器
研究人員試圖從 libFoxitWrapper.so 庫中對上述函數進行模糊測試,但這種方法沒有帶來任何結果,除了一組空指針異常。一種更有前景的 PDF 格式方法是選擇一個特定對象或 stream filter作為測試目標。因此,研究人員決定對 libfpdfemb.so 庫進行模糊測試。
但首先,讓研究人員來看看經典的模糊測試模型。
模糊任何閉源庫的最簡單方法是編寫一個可執行文件,將庫加載到內存中并調用目標函數。這個加載程序將一個帶有排列數據的文件作為命令行參數,將其讀入,并將數據傳遞給測試中的函數。接下來,加載程序被檢測或在模擬器上運行,以收集每個測試用例的代碼覆蓋矩陣,一個第三方的fuzzers/permutors被用來基于覆蓋矩陣生成新的測試用例。
為了對 libfpdfemb.so 庫進行模糊測試,研究人員選擇了 American Fuzzy Lop (AFL) 和 Quick emulator (Qemu) 的組合,主機是Ubuntu。
模糊測試方案
研究人員還需要注意一件事,Kindle 設備基于 ARM 處理器。因此,研究人員的加載程序是使用 arm-linux-gnueabi-g++ 編譯的,Qemu 很容易在 x86 上模擬 ARM。
在 libfpdfemb.so 庫中對單詞“CPDF”和“Codec”的簡單搜索使研究人員能夠找到所有可能的 stream filter/編解碼器:Predictor、Decrypt、Flate、Fax、Lzw、AsciiHex、RunLen、Ascii85、Jpeg、Jbig2和Jpx。讓我們看看其中一個例子。
帶有 jbig2 過濾器的 PDF 頁面片段
聲明了帶有 jbig2 過濾器的圖像 Im1,Jbig2 是一種用于雙層圖像的圖像壓縮標準。 jbig2 編碼器將輸入頁面分割為多個區域:文本、半色調圖像、細化等。這些區域保存在 JBIG2Globals 流中。渲染 PDF 頁面時,libfpdfemb.so 會解析 JBIG2Globals 流并重建圖像。
在 libfpdfemb.so 庫中定義的 Jbig2Module 對象負責解碼 jbig2 壓縮圖像。
Jbig2Module 對象
其 StartDecode 方法聲明如下:
在其他過濾器中,研究人員使用 StartDecode 函數作為入口點對 jbig2 解碼算法進行了模糊測試,并排列了圖像大小(寬度和高度參數)、圖像流(src_buf、src_size)和 JBIG2Globals 流(global_data、global_size)。可以在下方看到研究人員用來調用 StartDecode 的工具。基變量是 libfpdfemb.so 庫在內存中的地址。
結果,研究人員在 JBIG2Globals 解碼算法中發現了一個有價值的堆溢出漏洞。
CVE-2021-30354產生的堆溢出
看看以下 JBIG2Globals 流:
格式錯誤的JBIG2Globals流
這里定義了兩個頁面區域:
圖像信息區域(前 0x23 字節),圖像寬度為 0x80,高度為 1,步幅為 0x10。步幅計算為 ((width + 31) >> 5)< < 2。
“細化”區域(從 0x23 到 0x4D 字節),該區域包含 jbig2 編碼信息以優化圖像。由于只能細化圖像的一部分,它還包含細化矩形的坐標。在研究人員的例子中,提供的矩形參數是:width – 0,height – 0x10,x – 0,y – 0x40000000。
這是一個格式錯誤的流,在細化區域中定義了一個超大的矩形。
在這種情況下會發生什么?該算法嘗試將基礎圖像擴展到新的維度。新圖像的高度重新計算為高度 + y,并為調整大小的圖像分配 (height + y) * stride 堆內存。但是擴展函數中有一個錯誤導致堆溢出:計算新圖像在內存中的大小時錯過了對 INT_MAX 的檢查。 32 位寄存器溢出,為圖像分配 0x100 字節而不是 0x400000100。
擴展函數
這意味著通過使用細化區域,研究人員可以“細化”圖像之外的數據,并獲得任意寫入原語。在以下示例中,第二個細化區域從堆中的圖像開始處以 0x1234 * 0x10 字節的偏移量覆蓋 0x10(跨步)字節。數據塊(0x71到0x79字節)由jbig2算法解壓縮,然后使用異或處理堆內容。
受控堆溢出
研究人員可以創建任意數量的細化區域,并覆蓋彼此相距一定距離的部分內存。此外,寫入是通過異或處理操作完成的這一事實允許研究人員僅修復內存的特定位,而不是整個字,并在需要時繞過 ASLR 保護。
如前所述,libfpdfemb.so 庫是 pdfreader 進程的一部分。這個進程的數據段和堆段是讀/寫/執行的。 ASLR 內置于 Linux 內核中,由參數 /proc/sys/kernel/randomize_va_space 控制。它在 Kindle 設備上的默認值為 1,這意味著數據段的基地址緊跟在可執行代碼段的末尾之后。換句話說,數據段和堆沒有隨機化。這兩個事實使得利用發現的 jbig2 漏洞變得微不足道。
CVE-2021-30355會造成權限管理不當
研究人員現在在 pdfreader 進程的上下文中存在 RCE 漏洞,用戶可以將PDF格式的書下載到他的Kindle設備上。當這本書被打開時,一個惡意的有效載荷就被啟動了。
pdfreader 進程具有框架用戶權限:uid=9000(framework) gid=150(javausers) groups=150(javausers)。它可以發送 LIPC 消息,訪問特殊的內部文件,但它仍然是有限的。研究人員想成為 root 來重置所有限制。
因此,研究的第二階段是找到一個允許框架用戶在root用戶下運行代碼的LPE漏洞。
首先,研究人員越獄了研究人員的一個 Kindle,因為僅僅從固件中獲取文件來搜索邏輯 LPE 是不夠的。研究人員需要查看正在運行的進程和打開的端口,并能夠調試 Kindle 服務。
你可以在網上找到Kindle某些版本固件的軟件越獄,但最常用的方法是通過串口越獄。雖然這需要拆卸設備,但研究人員做到了。
通過串口越獄 Kindle
研究人員得到了一個越獄的設備,然后分析了擁有root權限的服務,以及它們訪問的資源。最終,研究人員發現了一個邏輯錯誤,或者更準確地說,在Kindle的一個服務中,發現了一個不恰當的權限管理。太好了,這就無需對設備驅動程序進行模糊測試。
框架用戶對 /var/tmp/framework 目錄具有完全訪問權限,他可以在其中創建任何可執行文件。實際上,這是用戶的工作目錄。例如,研究人員可以創建一個記錄用戶權限的 bash 腳本文件 payload.sh:
框架用戶對 /var/local/appreg.db sqlite 數據庫具有讀/寫訪問權限,該數據庫本質上是一個應用程序注冊表。這意味著研究人員可以使用 /usr/lib/libsqlite3.so 庫或簡單地編輯文件來修復數據庫條目,研究人員希望對屬性表中的一個“命令”項進行修補。
appreg.db 中的屬性表
例如,研究人員可以修補條目 com.lab126.browser:將值字段設置為 /var/tmp/framework/payload.sh 而不是 /usr/bin/mesquite。以下 SQL 請求完成工作:
該框架可以請求由 appmgrd 服務代表的應用程序管理器啟動任意應用程序,研究人員可以使用 /usr/lib/liblipc.so 庫發送 LIPC 消息以打開瀏覽器應用程序。此 shell 命令執行相同的操作:
應用程序管理器負責啟動內置應用程序,為此,它會監聽適當的 LIPC 事件。要啟動瀏覽器應用程序,它會從 appreg.db 讀取條目 com.lab126.browser,并執行值字段中指定的命令。當研究人員修補這個數據庫條目時,研究人員的 payload.sh 腳本被啟動。
appmgrd 服務具有 root 權限, “root: uid=0(root) gid=0(root)”字符串由payload.sh記錄。
可以從研究人員擁有的 pdfreader 進程中輕松利用所描述的 LPE 漏洞,libsqlite3.so 和 liblipc.so 庫已經加載到進程內存中。通過結合發現的兩個漏洞,任何惡意載荷都可以以 root 身份運行。
總結
由于惡意軟件代碼是以 root 用戶權限執行的,打開這樣的惡意書可能會導致無法彌補的損失。攻擊者可能會刪除你的電子書,可能獲得對你的亞馬遜帳戶的完全訪問權限,可能將你的 Kindle 轉換為木馬,攻擊本地網絡中的其他設備,等等。
我這有整理了網安的學習資料!!!有需要的可以點擊如下
【獲取學習資料】
總結
以上是生活随笔為你收集整理的看个电子书都会被黑客攻击,这是上面情况?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 都21世纪20年代了,还有人问我学网络安
- 下一篇: 网安面试只要掌握这十点技巧,轻轻松松吊打