0x00 簡介:
Android App 在本機儲存資料時的四種儲存機制:
1.Shared Preferences:
- 以 XML 格式儲存 key-value 資料
- 檔案路徑:/data/data/<package_name>/shared_prefs 資料夾下
- 資料儲存在內部儲存空間,一般使用者權限無法任意存取該檔案
- 檔案路徑:/data/data/<package_name> 資料夾下
- 資料儲存到外部儲存空間,一般使用者有權限任意存取該檔案
- 檔案路徑:/storage/sdcard0/ 資料夾下
- 資料儲存到 SQLite 資料庫中
- 檔案路徑:/data/data/<package_name>/databases 資料夾下
0x01 常見弱點風險:
1.Shared Preferences:
- 風險位置:getSharedPreferences、getPreferences
- 帳號密碼等敏感性資料以明文方式儲存
- 賦予 SharedPreferences 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險)
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案
2.Internal Storage:
- 風險位置:openFileOutput、getFilesDir、getCacheDir
- 帳號密碼等敏感性資料以明文方式儲存
- 賦予儲存在本機內部儲存空間的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >=17無風險)
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案
3.External Storage:
- 風險位置:getExternalFilesDir、getExternalCacheDir、getExternalFilesDirs、getExternalCacheDirs、getExternalStorageDirectory、getExternalStoragePublicDirectory
- 帳號密碼等敏感性資料以明文方式儲存
4.SQLite Databases:
- 風險位置:openOrCreateDatabase
- 帳號密碼等敏感性資料以明文方式儲存
- 賦予儲存為 SQLite db 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >=17無風險)
0x02 弱點檢測方式:
1.Shared Preferences 弱點檢測方式:
未加殼
- 帳號密碼等敏感性資料以明文方式儲存:
- 賦予 SharedPreferences 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案:
已加殼且脫不掉
- 帳號密碼等敏感性資料以明文方式儲存:
(2)adb shell 進入手機後 su 提權,將 /data/data/<package_name>/shared_prefs/ 下的檔案取出,並檢查該檔案是否以明文儲存敏感性資料。
- 賦予 SharedPreferences 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案:
2.Internal Storage 弱點檢測方式:
未加殼
- 帳號密碼等敏感性資料以明文方式儲存:
- 賦予儲存在本機內部儲存空間的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案:
已加殼且脫不掉
- 帳號密碼等敏感性資料以明文方式儲存:
(2)adb shell 進入手機後 su 提權,將 /data/data/<package_name>/ 下的檔案取出,並檢查所有檔案是否以明文儲存敏感性資料。同時建議搭配 hook 檢查是否未在其他資料夾中儲存檔案。
- 賦予儲存在本機內部儲存空間的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
- AndroidManifest.xml 中宣告「android:sharedUserId」供其他使用相同 sharedUserId 的 App 存取其相關檔案:
3.External Storage 弱點檢測方式:
未加殼
- 帳號密碼等敏感性資料以明文方式儲存:
已加殼且脫不掉
- 帳號密碼等敏感性資料以明文方式儲存:
(2)adb shell echo $EXTERNAL_STORAGE 取得外部儲存空間路徑,並將該路徑下的所有檔案取出,檢查是否以明文儲存敏感性資料。
4.SQLite Databases 弱點檢測方式:
未加殼
- 帳號密碼等敏感性資料以明文方式儲存:
- 賦予儲存為 SQLite db 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
已加殼且脫不掉
- 帳號密碼等敏感性資料以明文方式儲存:
(2)adb shell 進入手機後 su 提權,將 /data/data/<package_name>/databases/下的檔案取出,並檢查該檔案是否以明文儲存敏感性資料。
- 賦予儲存為 SQLite db 的檔案 MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE 權限(API Level >= 17 無風險):
0x03參考資料:
(1)owasp-mstg:0x01a_OMTG-DATAST_Android.md
(2)Android本地數據存儲:Internal Storage安全風險淺析
(3)Android本地數據存儲:Shared Preferences安全風險淺析
(4)Android Database配置模式安全風險淺析
(5)Android sharedUserId研究記錄
沒有留言:
張貼留言