2014-10-01 229 views
8

我正在經歷Context類中的checkCallingOrSelfPermission(),並想知道它如何被利用;即某些應用程序觸發了被調用者/您的應用程序的方法,該方法又調用checkCallingOrSelfPermission(),最終向另一個應用程序授予對該權限的訪問權限,或者釋放否則會需要該權限的敏感信息。利用checkCallingOrSelfPermission()進行特權升級攻擊

這是我經歷的Java文檔後明白:

這種方法可以被任何調用應用程序它是被調用應用程序的同一過程中只利用。爲了進入相同的過程,這兩個應用程序需要在清單文件中具有相同的共享用戶標識和進程,並且還要使用相同的證書進行簽名。

所以調用的應用程序需要做以下操作。

  1. 必須知道被調用程序在哪個進程和共享用戶標識下運行。 (我不確定這是多麼可行?)

  2. 必須使用被調用者應用程序簽署的相同證書進行簽名(不太可能假設證書保持安全)。

這是剝削的checkCallingOrSelfPermission()文檔警告反對,還是有它可能被利用其它(更逼真)方式的方法。

我也檢查了this post,但答案並不令人滿意。

+0

「此方法只能被與被調用程序相同進程中的任何調用應用程序利用」 - 在任何人都可以告訴您「exploit」是否可能之前,您需要解釋此「exploit」是什麼。 – CommonsWare 2014-10-01 11:52:04

+1

@CommonsWare對不起,如果我不夠清楚......在頂部添加說明,以解釋剝削.. – saurav 2014-10-01 12:35:28

+0

「如果任何應用程序調用被調用者/你的應用程序的方法,反過來調用checkcallingorselfpermission在最後訪問對其他應用程序的權限「 - 」checkCallingOrSelfPermission()'不會向任何人授予任何東西。 – CommonsWare 2014-10-01 12:51:35

回答

0

一切都在代碼中。

在IPC調用中,checkCallingOrSelfPermission()是安全的。檢查執行checkCallingOrSelfPermission()checkCallingPermission()here。他們都檢查IPC客戶端/調用者的權限。 當來電者來自外部時,他們完全一樣!

如果調用者來自內部(同一進程),那麼,如果某人可以在您的進程中執行代碼,則它已被利用。不需要再次使用checkCallingOrSelfPermission()

+0

根本不回答問題...文檔警告不要使用checkCalling OrSelf權限()。爲什麼?如何利用它呢? – 2016-03-26 06:45:18

+0

@TimRae。回答編輯。就我所知,checkCallingOrSelfPermission()是不可利用的。 – Swing 2016-03-28 07:46:23

+0

仍然沒有真正回答這個問題:「文檔警告不要使用checkCallingOrSelfPermission(),爲什麼?」。除非你說文檔是錯誤的,否則你需要對Binder有非常深刻的理解才能斷言。 – 2016-03-28 23:01:27

2

根據正常情況Binder.callingPid() == Process.myPid()成立。這在處理IPC請求時發生變化,系統修改調用的存儲在Binder中的PID,它將其分配給調用方應用程序的PID。但是,這種改變隻影響執行remotelly調用方法的線程,在其他線程中相等仍然成立。因此,如果在這樣一個不受影響的線程中調用checkCallingOrSelfPermission(),它將返回PERMISSION_GRANTED(假定服務應用程序擁有該權限)並且可能發生泄漏(或其他聖經後果)。

或者,如果在checkCallingOrSelfPermission()之前調用clearCallingIdentity(),則可能會出現同樣的問題,但我相信它不太可能發生。

測試Nexus 6P,Android 6.0.1(MHC19I)。

+1

謝謝,這應該是被接受的答案。 – 2016-03-30 00:23:20