在本次的defcon China上,來自于360 Alpha團隊的向小波與楊文林的“幾種通用的安卓平臺路徑穿越漏洞的挖掘與利用姿勢”議題介紹相關Android通用的幾種路徑穿越漏洞。路徑穿越漏洞輕則文件寫入,文件下載等。重則造成替換關鍵文件造成遠程命令執行等操作議題中有。
首先了解一下ContentProvider組件是Android四大組件之一,其核心功能是提供應用件的統一數據訪問方式類似于C/S架構。其中ContentProvider提供了直接操作文件的方法這里只需重寫ContentProvider中的openFile()方法即可操作文件,如果對文件路徑沒有進行限制就會造成路徑穿越漏洞。
需要在Androidmanifest.xml中聲明provider標簽為true。
<provider
android:name=".SampleContentProvider"
android:authorities="mydownloadcontentprovider"
android:exported="true" />
其中authority是用于通過ContentProvider訪問數據的URI權限,并且將導出為true的設置允許其他應用程序使用該內容提供者。
public class SampleContentProvider extends ContentProvider {
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
File file = new File(Environment.getExternalStorageDirectory()?+"Download/",uri.getPath());
return ParcelFileDescriptor.open(file , ParcelFileDescriptor.READ_ONLY_MODE);
}
}
當使用adb發送如下命令就會造成Poc:adb shell content open content://mydownloadcontentprovider/..%2f..%2f..%2f..%2f..%2fsdcard%2freadme.txt
在一些IM中都提供一些像好友發送文件的功能,但如果處理不當就會造成目錄遍歷。這里以CVE-2018-10067 為例通過HOOK框架修改文件為畸形文件就會只要對方點擊下載即可生成到對應文件夾。
如圖所示:
還有中轉式IRC網絡聊天工具IRCCloud,攻擊者可以強制IRC Cloud應用程序將任意文件復制到任意目錄。
主要代碼如下:
protected void onResume() {
//...
if (getSharedPreferences("prefs", 0).getString("session_key", "").length() > 0) {
//...
this.mUri = (Uri) getIntent().getParcelableExtra("android.intent.extra.STREAM"); // getting attacker provided uri
if (this.mUri != null) {
this.mUri = MainActivity.makeTempCopy(this.mUri, this); // copying file from this uri to /data/data/com.irccloud.android/cache/
}
public static Uri makeTempCopy(Uri fileUri, Context context, String original_filename) { // original_filename = mUri.getLastPathSegment() //...
try {
Uri out = Uri.fromFile(new File(context.getCacheDir(), original_filename)); Log.d("IRCCloud", "Copying file to " + out);
InputStream is = IRCCloudApplication.getInstance().getApplicationContext().getContentResolver().openInputStream(fileUri);
OutputStream os = IRCCloudApplication.getInstance().getApplicationContext().getContentResolver().openOutputStream(out);
byte[] buffer = new byte[8192];
while (true) {
int len = is.read(buffer);
if (len != -1) {
os.write(buffer, 0, len);
//...
通過intent.putExtra("android.intent.extra.STREAM", uri);
調用 IRCCloudApplication.getInstance().getApplicationContext().getContentResolver().openInputStream(fileUri);
會通過openInputStream(…)方法自動解碼指定的uri。所以會訪問我的符號鏈接文件。
這里值得注意的是,
這個漏洞也允許覆蓋任意文件。因此,攻擊者也可以替換您的受保護文件并替代相關的歷史記錄。
在Android一些郵件應用中附件下載中存在目錄遍歷問題。如果對應用程序中的附件文件名沒有路徑清理,就會造成相關的目錄遍歷。
如圖Filename1是Gmail,Filename2是outlook。
相關exp地址:
Gmail:https://www.exploit-db.com/exploits/43189/
Outlook:https://www.exploit-db.com/exploits/43353/
這里作者以CVE-2018-8084 搜狗瀏覽器目錄遍歷為例介紹如果瀏覽器解壓下載文件時如果文件使用惡意文件名,就會存在解壓時生成對于畸形文件,并且擁有重寫文件的權限,如果直接在libvplayer.so文件中寫入shell,就會造成遠程代碼執行效果。
如圖:
以QQEmail的CVE-2018-5722 為例在attachPatchDex(…)方法中使用new File(arg8,"dex").listFiles(new DexFiler())
會查找所有的dex文件進行加載。
在一些應用中一些方法中使用固定路徑,對于這類應用可以進行修改smali文件進行目錄遍歷攻擊。
https://hackerone.com/reports/288955