iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 29
0
Security

看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!系列 第 29

Day 29. 手機螢幕截圖安全性問題,小心被看光光

今天來講講手機app截圖安全性問題

IOS 截圖是系統層級因此安全問題不大,但還是需要適時提醒使用者

在Android 上可就要小心了,若是下載到惡意 App 也可以使用者截圖盜走

因此在包含個人資訊,付款資訊上的頁面就要慎重的處理

image-20201014100559938

資安檢測-安全敏感性資料保護複習

我們在 Day 07. 資安檢測 (II) 4.1.2 安全敏感性資料保護

裡面有一點 4.1.2.3.9 行動應用程式畫面擷取警示

其中行動應用程式於非使用者主動進行的畫面擷取時應主動警示使用者

主要針對 Android 系統,系統被背景命令觸發時發動的截圖

但在Android 系統命令觸發時,App內並無手段可以偵測 adb shell screencap

adb shell screencap - p /sdcard/Download/1.png

上行程式碼為在debug模式並執行程式碼, 若可以正常被截圖,此項目就會視為不符合

由於這條很靠北特別,只能在有帳密個資等全部頁面加上 FLAG_SECURE,才能通過檢驗『Android 禁止截圖』

iOS 需做到截圖時通知使用者『iOS截圖偵測』即可通過此項目

IOS 截圖偵測

偵測 userDidTakeScreenshotNotification

let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
    print("擷取圖片")
}

iOS 無法做到,禁止截圖,只能通知使用者螢幕已經截圖

Android 偵測截圖

由於 Android 不像iOS 有系統級的方法可以偵測

因此只能土砲自行偵測,目前有兩種方式偵測截圖,另外一種是偵測鍵,但是因為廠商太多每支手機都不同因此可靠度太低

  • 利用FileObserver監聽某個目錄中資源變化情況

    • 所需權限:READ_EXTERNAL_STORAGE
  • 利用ContentObserver監聽全部資源的變化

    • 所需權限:INTERNAL_CONTENT_URIEXTERNAL_CONTENT_URI

這邊說明用 FileObserver 為例

權限設定

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

程式碼

public class ScreenshotActivity extends AppCompatActivity {
  private final String TAG = "Screenshot";
  private static final String PATH = Environment.getExternalStorageDirectory()   File.separator 
  Environment.DIRECTORY_PICTURES   File.separator   "Screenshots"   File.separator;
  
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screenshot);
    mFileObserver = new CustomFileObserver(PATH);
  }
  @Override
  protected void onResume() {
    super.onResume();
    mFileObserver.startWatching();
    Log.d(TAG, PATH);
  }
  @Override
    protected void onStop() {
    super.onStop();
    mFileObserver.stopWatching();
  }
  /**
  * 目錄監聽器
  */
  private class CustomFileObserver extends FileObserver {
    private String mPath;
    public CustomFileObserver(String path) {
    super(path);
    this.mPath = path;
  }
  public CustomFileObserver(String path, int mask) {
    super(path, mask);
    this.mPath = path;
  }
  @Override
  public void onEvent(int event, String path) {
    Log.d(TAG, path   " "   event);
    // 監聽到事件,做一些過濾去重處理操作
    }
  }
}

Android 禁止截圖

FLAG_SECURE Android 官方文件說明

FLAG_SECURE 是 WindowManager.LayoutParams 的一個屬性

它標記當前 window 是安全的,不允許有一些非安全的操作,例如截圖功能。

FLAG_SECURE flag 設定後會有以下功能:

  1. 阻止螢幕截圖

  2. 在Recent apps(任務切換介面)中只顯示應用名字和圖示, 不顯示內容

  3. Google App的Now on tap功能不會去分析你的頁面的內容

程式碼

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

window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);

參考資料

https://developer.android.com/reference/android/view/WindowManager.LayoutParams

https://medium.com/swlh/how-to-make-your-ios-app-secure-from-screen-shot-and-recording-82b6aea26b33

https://www.itread01.com/fxefy.html


上一篇
Day 28. 憑證綁定 Certificate Pinning 綁起來!
下一篇
Day 30. 要別人看不懂,還是讓自己看不懂的 - 混淆 Obfuscation
系列文
看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!31

尚未有邦友留言

立即登入留言