Android安全開發之ZIP文件目錄遍歷

来源:http://www.cnblogs.com/alisecurity/archive/2016/06/23/5610654.html
-Advertisement-
Play Games

ZIP壓縮包文件中允許存在“../”的字元串,攻擊者可通過精心構造ZIP文件,利用多個“../”從而改變ZIP包中某個文件的存放位置,覆蓋替換掉應用原有的文件。 ...


1、ZIP文件目錄遍歷簡介

因為ZIP壓縮包文件中允許存在“../”的字元串,攻擊者可以利用多個“../”在解壓時改變ZIP包中某個文件的存放位置,覆蓋掉應用原有的文件。如果被覆蓋掉的文件是動態鏈接so、dex或者odex文件,輕則產生本地拒絕服務漏洞,影響應用的可用性,重則可能造成任意代碼執行漏洞,危害用戶的設備安全和信息安全。比如近段時間發現的“寄生獸”漏洞、海豚瀏覽器遠程命令執行漏洞、三星預設輸入法遠程代碼執行漏洞等都與ZIP文件目錄遍歷有關。

阿裡聚安全的應用漏洞掃描服務,可以檢測出應用的ZIP文件目錄遍歷風險。另外我們發現日本電腦應急響應小組(JPCERT)給出的修複方案存在缺陷。如果使用不當(它提供的示例文檔就使用錯誤),可能起不到防止ZIP文件目錄遍歷的作用,並且國內有修複方案參考了此方案。

 

2、漏洞原理和風險示例

2.1 漏洞原理

在Linux/Unix系統中“../”代表的是向上級目錄跳轉,有些程式在當前工作目錄中處理到諸如用“../../../../../../../../../../../etc/hosts”表示的文件,會跳轉出當前工作目錄,跳轉到到其他目錄中。 
Java代碼在解壓ZIP文件時,會使用到ZipEntry類的getName()方法,如果ZIP文件中包含“../”的字元串,該方法返回值裡面原樣返回,如果沒有過濾掉getName()返回值中的“../”字元串,繼續解壓縮操作,就會在其他目錄中創建解壓的文件。

如我們構造的ZIP文件中有如下文件:

進行解壓的代碼如下,沒有對getName進行過濾:

 

解壓操作時的日誌:

 

此ZIP文件存放在SD卡中,想讓解壓出來的所有文件也存在SD卡中,但是a_poc.txt文件卻存在了應用的數據目錄中:

 

2.2 風險示例

以海豚瀏覽器遠程代碼執行漏洞為例。 
海豚瀏覽器的主題設置中允許用戶通過網路下載新的主題進行更換,主題文件其實是一個ZIP壓縮文件。通過中間人攻擊的方法可以替換掉這個ZIP文件。替換後的ZIP文件中有重新編譯過的libdolphin.so。此so文件重寫了JNI_OnLoad()函數:

 

此so文件以“../../../../../../../../../../data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so”的形式存在惡意ZIP文件中。海豚瀏覽器解壓惡意ZIP文件後,重新的libdolphin.so就會覆蓋掉原有的so文件,重新運行海豚瀏覽器會彈出Toast提示框:

 

 

能彈出Toast說明也就可以執行其他代碼。

這裡分析下此漏洞產生的原因是: 
1、主題文件其實是一個ZIP壓縮包,從伺服器下載後進行解壓,但是解壓時沒有過濾getName()返回的字元串中是否有“../”

 

2、動態鏈接庫文件libdolphin.so,並沒有放在應用數據的lib目錄下,而是放在了files目錄中:

 

載入使用的地方是com.dolphin.browser.search.redirect包中的SearchRedirector:

應用使用的是System.load()來載入libdolphin.so而非System.loadLibrary(),在Android中,System.loadLibrary()是從應用的lib目錄中載入.so文件,而System.load()是用某個.so文件的絕對路徑載入,這個.so文件可以不在應用的lib目錄中,可以在SD卡中,或者在應用的files目錄中,只要應用有讀的許可權目錄中即可。

在files目錄中,應用具有寫入許可權,通過網路中間人攻擊,同時利用ZIP文件目錄遍歷漏洞,替換掉文件libdolphin.so,達到遠程命令執行的目的。

應用的lib目錄是軟鏈接到了/data/app-lib/應用目錄,如果libdolphin.so文件在lib目錄下就不會被覆蓋了,第三方應用在執行時沒有寫入/data/app-lib目錄的許可權:

 

3、JPCERT修複方案的研究

在研究中我們發現JPCERT提供的修複方案存在缺陷。它是利用Java的File類提供的getCanonicalPath()方法過濾掉zipEntry.getName()返回的字元串中所包含的“../”,然後檢查這個字元串是否是以要解壓到的目標目錄字元串為開頭,如果是,返回getCanonicalPath()獲取到的字元串,如果不是,則拋出異常:

 

但是在JPCERT給出的示例代碼中,對validateFilename()的調用對於APP來說不會達到防止任意目錄遍歷的目的:

 

其使用“.”,作為要解壓到的目的目錄,“.”表示當前目錄,經測試APP進程的當前工作目錄是根目錄“/”:

 

查看進程狀態,得到的APP進程的當前工作目錄cwd是鏈接到了根目錄:

 

如下的Demo,如果採用JPCERT示例中validateFilename(entry.genName(), “.”)的調用方式,還是會產生目錄遍歷讀到系統配置文件:

 

讀到的hosts文件內容:

正確的調用validateFilename()形式是傳入的要解壓到的目的目錄不要用“.”,而是指定一個絕對路徑。

 

4、阿裡聚安全對開發者建議

1 對重要的ZIP壓縮包文件進行數字簽名校驗,校驗通過才進行解壓。 
2 檢查Zip壓縮包中使用ZipEntry.getName()獲取的文件名中是否包含”../”或者”..”,檢查”../”的時候不必進行URI Decode(以防通過URI編碼”..%2F”來進行繞過),測試發現ZipEntry.getName()對於Zip包中有“..%2F”的文件路徑不會進行處理。 
3 在應用上線前使用阿裡聚安全的安全掃描服務,儘早發現應用的安全風險。

 

阿裡聚安全掃描器建議修複方案: 
在使用java.util.zip包中ZipInputStream類的進行解壓操作時,進行檢查,示例如下:

也可以使用java.util.zip包中的ZipFile類,直接讀取Zip包中的所有entries,然後檢查getName()的返回值是否包含“../”:

 

5、參考

[1] https://www.jpcert.or.jp/present/2014/20140910android-sc.pdf 

[2] 《海豚瀏覽器與水星瀏覽器遠程代碼執行漏洞詳解》http://drops.wooyun.org/mobile/8293 

[3] 《影響數千萬APP的安卓APP“寄生獸”漏洞技術分析》http://drops.wooyun.org/mobile/6910 

[4] 《三星預設輸入法遠程代碼執行》http://drops.wooyun.org/papers/6632 

[5] http://www.oracle.com/technetwork/articles/java/compress-1565076.html 

[6] http://stackoverflow.com/questions/1099300/whats-the-difference-between-getpath-getabsolutepath-and-getcanonicalpath 

[7] http://stackoverflow.com/questions/7016391/difference-between-system-load-and-system-loadlibrary-in-java

 

6、Android安全開發系列

目錄

Android安全開發之Provider組件安全

Android安全開發之淺談密鑰硬編碼

Android安全開發之淺談網頁打開APP

Android應用安全開發之淺談加密演算法的坑

 

作者:伊樵、呆狐、舟海@阿裡聚安全,更多安全技術文章,請訪問阿裡聚安全博客

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備步驟: 1.創建工程(設置版本相容,最低相容版本) 2.導入常用jar包,(處理字元串和加密用的jar文件) Commons Lang,Commons Codec commons-codec.jar主要是用來加密的MD5 3.引入測試框架(類庫和啟動裝置配置) 應用架構: 1.網路通信 (手機客 ...
  • Gradle Project項目、Module模塊導入 最近看到網上很多人在抱怨,Android Studio很難導入github上下載下來的一些項目,主要包括: 1、導入就在下載Gradle2、根本導不進 下麵我分2部分來講解正確的導入姿勢: 1、導入完整的Github Project 我們在gi ...
  • 1、okHttp https://github.com/square/okhttp 2、okhttp-utils https://github.com/hongyangAndroid/okhttp-utils 3、NoHttp https://github.com/yanzhenjie/NoHttp ...
  • 從電腦上徹底刪除HelloWorld項目 回到as歡迎頁面 複製github中項目的地址 點擊clone ...
  • 首先下載安裝git 下載地址:https://git-scm.com/ 打開AS,並設置如下: 到github上面註冊一個帳號 運行--cmd cd C:\Program Files\Git\bin 接著運行 回到AS 點擊VCS按鈕 點擊share 預設情況下選中全部文件 搞定 ...
  • Apple在 WWDC 2016 上針對iOS提供的全新 消息框架(Messages framework) 使得開發者能夠創建與Apple的“信息”應用進行交互的應用擴展。新增的消息API目前支持兩類擴展: 貼紙包(Sticker Pack),提供了一系列可供用戶插入到消息中發佈的圖片。 iMess ...
  • 一、經典的第三方庫 1、MJRefresh 上拉刷新和下拉添加 2、AFNetworking 網路請求,請求回來的是字典 3、MJExtension 將字典與模型之間相互轉換,還有其他的轉化自己摸索使用吧 4、資料庫:FMDB 把系統自帶的資料庫封裝後更好的去使用 二、簡單使用的第三方庫 1、IQK ...
  • 本文的本本win7 64bit 6G android studio2.1 在運行程式的時候Gradle Build Running 特別慢,一個helloworld都快2min了 1、開啟gradle單獨的守護進程 在下麵的目錄下麵創建gradle.properties文件: /home/<user ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...