標籤:des android style blog http io color ar 使用
研究人員發現了Android上又一個嚴重的安全性漏洞:將Android惡意程式碼後置在圖片中(Hide Android Applications in Images)。
在該漏洞向外界公開之前,Google已經發布了補丁。不過,仍然有大量Android手機使用者沒有選擇升級。
惡意程式研究人員Axelle Apvrille和逆向工程師Ange Albertin開發了一種定製的工具AngeCryption(Python指令碼)加密惡意程式的APK檔案(Android application package),使惡意的APK看起來像一個有效PNG影像檔(其它映像格式也可以),他們之後又建立了另一個APK檔案,能解密和安裝加密的影像檔。
AngeCrypt使惡意軟體包看起來像一個正常的圖片
惡意程式因為加了密,所以殺毒和安全工具無法檢測出。在測試中,他們的合法牆紙應用在試圖安裝惡意應用時會彈出許可權請求。
研究人員聲稱可以通過使用DexClassLoader防止許可權請求視窗出現。
相關知識點介紹
密碼學中,塊密碼的工作模式允許使用同一個塊密碼金鑰組多於一塊的資料進行加密,並保證其安全性。塊密碼自身只能加密長度等於密碼塊長度的單塊資料,若要加密變長資料,則資料必須先被劃分為一些單獨的密碼塊。通常而言,最後一塊資料也需要使用合適填充方式將資料擴充到符合密碼塊大小的長度。一種工作模式描述了加密每一資料區塊的過程,並常常使用基於一個通常稱為初始化向量(IV,Initialization Vector)的附加輸入值以進行隨機化,以保證安全。
初始化向量(IV,Initialization Vector)是許多工作模式中用於隨機化加密的一塊資料,因此可以由相同的明文,相同的密鑰產生不同的密文,而無需重新產生密鑰,避免了通常相當複雜的這一過程。
密碼塊連結(CBC,Cipher-block chaining)模式。在CBC模式中,每個明文塊先與前一個密文塊進行異或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊。同時,為了保證每條訊息的唯一性,在第一個塊中需要使用初始化向量。
若第一個塊的下標為1,則CBC模式的加密過程為
-
Ci=EK(Pi⊕Ci−1),C0=IV
而其解密過程則為
-
Pi=DK(Ci)⊕Ci−1,C0=IV
沒有一點小竅門,我們是不能將一個給定的檔案加密成圖片檔案的。AngeCryption是如何工作的呢?
一個PNG檔案的格式如下:
PNG檔案格式
我們要得到一個PNG檔案,檔案格式必須包括以下幾個部分:
檔案頭. PNG以固定的8位元組‘signature‘標識開頭:0x89 PNG 0x0d 0x0a 0x1a 0xa.為了識別為一個有效PNG檔案,這8位元組必須是正確無誤的。
垃圾資料區塊:我們把代碼插入到這裡,工具會把它忽略而將檔案識別為圖片。
每個資料區塊由4個部分組成,如下:
| 名稱 |
位元組數 |
說明 |
| Length (長度) |
4位元組 |
指定資料區塊中資料域的長度,其長度不超過(231-1)位元組 |
| Chunk Type Code (資料區塊類型碼) |
4位元組 |
資料區塊類型碼由ASCII字母(A-Z和a-z)組成 我們使用一個虛假的類型使工具忽略這個資料區塊 |
| Chunk Data (資料區塊資料) |
可變長度 |
儲存按照Chunk Type Code指定的資料 |
| CRC (迴圈冗餘檢測) |
4位元組 |
儲存用來檢測是否有錯誤的迴圈冗餘碼 |
檔案頭資料區塊IHDR(header chunk):它包含有PNG檔案中儲存的映像資料的基本資料,並要作為第一個資料區塊出現在PNG資料流中,而且一個PNG資料流中只能有一個檔案頭資料區塊。但是事實片識別工具在這方面並沒有做出嚴格的限制。
映像資料區塊IDAT(image data chunk):它儲存實際的資料,在資料流中可包含多個連續順序的映像資料區塊。IDAT存放著映像真正的資料資訊,因此,如果能夠瞭解IDAT的結構,我們就可以很方便的產生PNG映像。
映像結束資料IEND(image trailer chunk):它用來標記PNG檔案或者資料流已經結束,並且必須要放在檔案的尾部。
為了得到這樣的一個檔案,我們需要這樣做:
(1)選擇一個合適的IV. 我們希望我們的第一個加密塊C1與PNG檔案的“檔案頭 (8 bytes) + 資料區塊長度(4 bytes) + 資料區塊類型碼(4 bytes)”相等,碰巧這也與AES塊大小相同(16位元組長)。另外,我們知道P0為輸入檔案(被隱藏檔案)的第一個區塊,我們也知道K的值。所以, 我們可以以下面的方式選擇IV:
換句話說,要選擇合適的IV,必須擷取我們需要的第一個加密塊。注意在真實的案例中,IV是隨機播放的。
(2)產生一個修改了的輸入檔案,在檔案末尾附加了一些資料,這些資料是解密的“CRC32檢驗碼+ 靶心圖表片檔案塊+ 結尾資料區塊”。為什麼要這樣做呢?因為當我們加密這些解密的資料就能擷取到原始的資料,也就是說如果我們加密這些解密的映像資料區塊,我們就獲得了原始的映像資料區塊。
注意,AngeCryption獨立於AES,CBC和PNG。它只是要求:
- 第一個密碼塊是可控的;
- 源檔案格式是可以容忍附加資料的;
- 檔案頭和資料區塊的資料大小與塊大小相吻合。
AngeCryption工具的:http://corkami.googlecode.com/svn/trunk/src/angecryption/angecrypt.py
使用方法:python angecrypt.py inputfile targetimage modifiedinput key algorithm
- inputfile:欲加密的檔案
- targetimage:加密後的目標格式,如PDF, PNG, JPG, FLV等
- modifiedinput:被angecrypt.py修改後的輸入檔案
- key:加密key
- algorithm:當前為AES128-CBC或3DES-EDE2-CBC, 無填充。
另外還有一種隱藏代碼到圖片的原理在文章《一種在圖片裡隱藏你的程式碼的技術》有介紹。
相關資料:https://www.blackhat.com/docs/eu-14/materials/eu-14-Apvrille-Hide-Android-Applications-In-Images.pdf
Android漏洞——將Android惡意程式碼後置在圖片中