天天看點

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

作者:橙留香Park

也許每個人出生的時候都以為這世界都是為他一個人而存在的,當他發現自己錯的時候,他便開始長大

少走了彎路,也就錯過了風景,無論如何,感謝經曆

更多關于Android安全的知識,可前往:https://blog.csdn.net/ananasorangey/category11955914.html

0x01 剪貼闆敏感資訊洩露

在 Android 中,由于 Android 作業系統的規範或 Android 作業系統提供的功能,應用程式實作難以保證安全。如果這些功能被惡意第三方濫用或被使用者随意使用,就有導緻資訊洩露等安全問題的風險

複制和粘貼是使用者經常随意使用的功能。例如,許多使用者使用這些功能将郵件或網頁中需要記住的奇怪資訊或重要資訊存儲在記事本中,或者從存儲密碼以防忘記的記事本中複制或粘貼密碼。這些操作看起來非常非常正常,但實際上可能存在使用者處理資訊被盜的潛在風險

此風險與 Android 系統中的複制和粘貼機制有關。使用者或應用程式複制的資訊會存儲在名為剪貼闆的緩沖區中。當使用者或應用程式粘貼時,剪貼闆中存儲的資訊将分發到其他應用程式。是以,此剪貼闆功能存在導緻資訊洩露的風險。這是因為剪貼闆實體在系統中僅有一個,任何應用程式都可以使用 ClipboardManager 随時擷取剪貼闆中存儲的資訊。這意味着使用者複制/剪切的所有資訊都有可能洩露給惡意應用程式

在文本框中經常會使用到複制粘貼的功能,這個時候資料是儲存在剪切闆中的。而剪切闆是安卓系統提供的功能,所有的應用都可以通路,并且無需特殊權限申請。如果在剪切闆中存儲了敏感資訊,就存在洩漏的風險。比如以下的應用通過監控剪切闆内容,成功擷取了身份證号碼

在Android 4.0 中底層引入了TextLayoutCache,當每個測量過的文字都被添加到緩存中,下次需要相同的文字時,可以從緩存中擷取,不用在測量。

打開預測文本的Android 裝置會自動記錄使用者輸入的記錄緩存。Android 預測文本功能,将通過記住使用者之前輸入的單詞作為未來輸入建議的一部分,使鍵盤上的輸入更容易,如下所示。但是,一旦單詞已經寫入,則禁用預測文本并在将來啟用它。被記住的消息還在

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

如果您不使用Android鍵盤,則這些步驟可能會有所不同。不同手機版本開啟預測文本的步驟也是不太相同的

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

示範如下:

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

代碼如下:

package com.example.testpoc4;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 擷取控件id
        Button button = findViewById(R.id.button);
        // 監聽點選事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override// 擷取剪貼闆内容并在列印出來
            public void onClick(View v) {
                ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                ClipData data = cm.getPrimaryClip();
                ClipData.Item item = data.getItemAt(0);
                String content = item.getText().toString();

                Toast.makeText(MainActivity.this,content,Toast.LENGTH_SHORT).show();
            }
        });
    }
}
           
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

緩解措施

可以采用以下方法來禁用剪切闆相關功能:

  • 通過禁用長按視圖也可禁止複制/剪切,可在 xml 布局檔案中指定禁用長按視圖在 EditText 中加入屬性 android:longClickable="false"

如果視圖在應用程式中顯示敏感資訊,并且允許在視圖(例如 EditText)中複制/剪切資訊,則資訊可能通過剪貼闆洩露。是以,必須在顯示敏感資訊的視圖中禁用複制/剪切

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
  • 重寫 EditText 的回調方法,從 EditText 字元串選擇的菜單中删除複制/剪切項目(從字元串選擇菜單中删除 android.R.id.copy和android.R.id.cut)

通過 TextView.setCustomSelectionActionMODECallback() 方法,可以自定義選擇字元串時的菜單。通過使用此功能,如果在選擇字元串時可以從菜單中删除複制/剪切項目,使用者将無法再複制/剪切字元串。

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

0x02 檢查鍵盤緩存是否存在敏感資訊洩露

當使用者在輸入資訊時,一般情況下軟體預設會自動儲存資料,這個特性功能對于消息傳遞類的應用程式非常有用。但是,當使用者選擇此類應用程式的輸入框來輸入資訊時,鍵盤緩存就可能暴露敏感資訊給攻擊者收集使用者個人資訊的提供了途徑

大部分中文應用彈出的預設鍵盤是簡體中文輸入法鍵盤,在輸入使用者名和密碼的時候,如果使用簡體中文輸入法鍵盤,輸入英文字元和數字字元的使用者名和密碼時,會自動啟動系統輸入法自動更正提示,然後使用者的輸入記錄會被緩存下來

系統鍵盤緩存最友善拿到的就是利用系統輸入法自動更正的字元串輸入記錄。 緩存檔案的位址應該是下面的這個路徑:

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

導出該緩存檔案,檢視内容,一切輸入記錄都是明文存儲的。因為系統不會把所有的使用者輸入記錄都當作密碼等敏感資訊來處理。 一般情況下,一個正常使用者高頻率出現的字元串就是使用者名和密碼

是以,一般銀行用戶端app輸入密碼時都不使用系統鍵盤,而使用自己定制的鍵盤,主要原因如下:

  • 避免第三方讀取系統鍵盤緩存
  • 防止螢幕錄制 (自己定制的鍵盤按鍵不加按下效果)

在一個activity的布局定義中,可以定義有XML屬性的TextViews。如果XML屬性android:inputType給了值textNoSuggestions,可以将文本框的輸入類型設定為android:inputType="textNoSuggestions"此時就不會再顯示鍵盤緩存建議。使用者就必須手工輸入内容,不會再自動有緩存資訊,下面一個是有源碼的情況下的靜态檢視方式和沒有源碼的情況下的檢視是否禁用鍵盤緩存

<EditText
        android:id="@+id/passwordText"
        android:inputType="textNoSuggestions" />
           
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

無源碼的情況下,反編譯APK并檢視\res\layout 路徑下的xml檔案是否有配置android:inputType="textNoSuggestions"

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

然後打開APP運作,輸入相關之前輸入過的内容,看看是否會自動提示補齊輸入的資訊

注:并不是說文本框不設定android:inputType="textNoSuggestions"就是有問題的,而是該文本框是否在使用過程中有輸入敏感資訊。如果有,則就有可能被攻擊者竊取這些敏感資訊,是以該EditText就需要配置android:inputType="textNoSuggestions"

  • 緩解措施

在文本框輸入的内容,有時候會被輸入法緩存,以提升使用者體驗。但是在涉及到敏感資訊輸入框的時候,就可能會造成資訊洩漏。可以指定 android:inputType 為 textNoSuggestions 來緩解該風險,如下:

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

注:上述涉及到的風險點通常需要根據應用的類型進行判斷,例如如銀行類 APP可能需要規避本文中的風險,而工具類 APP 則無需考慮大部分本文的風險點

0x03 UI界面敏感資料洩露

大多數APK應用程式會建議使用者輸入一些敏感資料,比如在注冊新賬号或付款時輸入的敏感資訊以明文顯示資料,沒有用*(型号)或圓點代替輸入的來屏蔽敏感資料,則可能導緻敏感資料洩露

如何檢測此類敏感資訊洩露?隻需要我們在檢查裝置上所有顯示此類資訊或将其作為輸入的 UI 元件,并搜尋敏感資訊的任何痕迹并根據自身經驗來來評估确認是否需要将其屏蔽或完全删除

3.1 靜态分析

  • 文本字段

反編譯APK并檢視AndroidManifest.xml,檢查檔案中 EditText 的定義是否有以下屬性(因為配置該設定,文本框中的文字将顯示點(而不是輸入字元)将顯示在文本字段,防止應用程式洩漏密碼或 PIN (例如鎖住手機時,要求輸入密碼)到使用者界面):

android:inputType="textPassword"
           
  • 程式通知

UI界面這裡的程式通知導緻的敏感資訊洩露【靜态分析】,跟第三方導緻的敏感資料靜态分析操作差不多,自行翻看對應的内容檢視

3.2 動态分析

動态運作APK應用程式并識别顯示此類資訊或将其作為輸入的元件,來判斷APK應用程式是否向UI界面洩露敏感資訊

  • 文本字段

如果使用者輸入的資訊被屏蔽,例如:用星号或圓點代替輸入的資訊,則APK應用程式不會将資料洩漏到使用者界面

  • 程式通知

UI界面這裡的程式通知導緻的敏感資訊洩露【動态分析】,跟第三方導緻的敏感資料靜态分析操作差不多,自行翻看對應的内容檢視

0x04 自動截屏洩露敏感資訊

Android 系統廠商或制造商,在設計系統時為了考慮使用者體驗性,通常會在應用程式啟動和退出時為裝置使用者提供美觀的體驗考慮,此特性就使用了螢幕截圖儲存功能,以便在應用程式目前狀态是在背景的使用。可能使用該功能會存在安全風險,比如使用者在顯示敏感資訊時故意對應用程式進行截屏,如果敏感資訊沒有做星号/圓點處理,那麼就存在被其它惡意APK應用程式持續捕獲螢幕截屏内容的導緻敏感資訊洩露,需要注意螢幕截圖是存儲在本地的,就有可能存在被竊取的可可能性

正題開始之前,我們先說一下就算我們在 EditText 标簽中指定android:inputType 為 textPassword,來讓密碼進行掩碼顯示并不能抵禦截屏擷取敏感資訊。在 Android 5.0之前,要實作截屏需要有 root 權限,但Android 5.0 之後,Google 開放了錄屏 API,無需 root 權限就能夠截屏了。比如說以下圖檔中依然可以看到輸入的密碼明文,隻是輸入後變成了掩碼,但隻要能錄屏,一樣存在風險,如下圖:

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

可以在承載的 Activity 中,加入以下代碼來防止截屏擷取敏感資訊,如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE);
        setContentView(R.layout.activity_sp);

        etUsername = findViewById(R.id.et_sp_username);
        etPassword = findViewById(R.id.et_sp_password);
}
           
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

為了驗證效果,我們做以下實驗來驗證:

  • 在以下界面(未做防護),執行指令adb shell screencap -p /sdcard/1.png 進行截屏。
adb shell screencap -p /sdcard/1.png
           
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
  • 在以下界面(做了防護),執行指令adb shell screencap -p /sdcard/2.png 進行截屏
adb shell screencap -p /sdcard/2.png
           
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

看一下截圖檔案,發現 1.png 大小正常而 2.png 大小為 0 位元組,說明成功阻止了螢幕截圖的攻擊,如下圖:

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘
「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

4.1 靜态分析

在APK應用程式進入背景時Android裝置會自動截取目前活動的螢幕截圖(這一點大家經常使用手機的人,應該都曉得),當我們再次傳回APK應用程式前台時,為了好看,會在一個輪播圖中顯示出來,此設計特性就存在可能洩露沒有做過處理的文本框導緻的敏感資訊洩露

檢查是否可以使用應用切換器暴露敏感資訊,隻需檢視有麼有設定FLAG_SECURE選項,如果未配置該選項,則該APK應用程式容易被惡意APK應用程式持續螢幕捕獲,如下代碼示例:

Java 中的示例:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE);

setContentView(R.layout.activity_main);
           

Kotlin 中的示例:

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE)

setContentView(R.layout.activity_main)
           

4.2 動态分析

打開應用程式進入到背景導航切換欄,可以切換到任何含有敏感資訊的螢幕,檢視快照。如果FLAG_SECURE設定了,則快照為空;如果未設定标志将顯示活動資訊。如下(點選按鈕,切換到背景界面,隻要檢視是否出現快照能顯示截圖的内容):

「幹貨」剪貼闆+鍵盤緩存+UI界面+自動截屏敏感資訊挖掘

解決方案:

  • 在支援基于檔案的加密 (FBE)的裝置上,快照存儲在/data/system_ce/<USER_ID>/<IMAGE_FOLDER_NAME>檔案夾中。<IMAGE_FOLDER_NAME>取決于供應商,但最常見的名稱是snapshots和recent_images。如果裝置不支援 FBE,/data/system/<IMAGE_FOLDER_NAME>則使用該檔案夾。需要注意通路這些檔案夾和快照需要root權限哦

上面有些内容細節,可以前往:[車聯網安全自學篇] 三十七. Android安全之資料存儲與資料安全【大集合】

參考連結:

https://android-developers.googleblog.com/2017/09/keystore-key-attestation.html

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05d-Testing-Data-Storage.md

https://mp.weixin.qq.com/s/j5BIcOAeXyNG8MsAHIsKzw

https://blog.csdn.net/qq_38436214/article/details/119424903

https://wizardforcel.gitbooks.io/android-app-sec-guidebook/content/4.10.html

https://blog.csdn.net/xuanwenchao/article/details/103783224

https://github.com/JinxKing/android_app_security_checklist

https://orangey.blog.csdn.net/article/details/124431951

你以為你有很多路可以選擇,其實你隻有一條路可以走

繼續閱讀