標籤:
脫殼時寫patch補丁時Native代碼並沒有太高的許可權,以至於如檔案IO、網路IO等基本的C函數都無法使用,提示許可權不足。在網上搜尋了資料大致進行以下幾種嘗試:
1、APK在安裝時會在/data/system/packages.xml記錄當前app需要申請的許可權,如下:
<package name="com.example.unpacker" codePath="/data/app/com.example.unpacker-1.apk" nativeLibraryPath="/data/app-lib/com.example.unpacker-1" flags="572998" ft="1504bc58f90" it="1504bad7c65" ut="1504bc5913e" version="1" userId="10078"> <sigs count="1"> <cert index="9" key="xxx" /> </sigs> <perms> <item name="android.permission.ACCESS_WIFI_STATE" /> <item name="android.permission.CHANGE_NETWORK_STATE" /> <item name="android.permission.ACCESS_NETWORK_STATE" /> <item name="android.permission.INTERNET" /> <item name="android.permission.CHANGE_WIFI_STATE" /> </perms> <signing-keyset identifier="1" /> </package>
嘗試將所有許可權添加到此packages.xml裡沒有作用,測試失敗,具體原因以後再看
2、直接繞過permission驗證修改framework代碼,相關參考http://www.cnblogs.com/GnagWang/archive/2011/03/21/1990507.html
ActivityManagerService.java (frameworks\base\services\java\com\android\server\am)中將checkPermission、checkCallingPermission、enforceCallingPermission函數傳回值修改為PERMISSION_GRANTED,修改後編譯framework.jar、framework2.jar、services.jar然後刷入機器測試發現此修改容易造成系統起不來,不穩定,具體原因以後再看;
3、修改zygote fork後的進程的許可權,zygote fork進程最終會調用forkAndSpecializeCommon函數,在forkAndSpecializeCommon中會判斷是不是啟動systemserver進程還是其它app進程,其它進程的話permittedCapabilities和effectiveCapabilities將設定成0
if (isSystemServer) { /* * Don‘t use GET_ARG_LONG here for now. gcc is generating code * that uses register d8 as a temporary, and that‘s coming out * scrambled in the child process. b/3138621 */ //permittedCapabilities = GET_ARG_LONG(args, 5); //effectiveCapabilities = GET_ARG_LONG(args, 7); permittedCapabilities = args[5] | (int64_t) args[6] << 32; effectiveCapabilities = args[7] | (int64_t) args[8] << 32;} else { mountMode = args[5]; permittedCapabilities = effectiveCapabilities = 0; //其它app進程則允許許可權和有將許可權清o //將上一行修改為 permittedCapabilities = effectiveCapabilities = 125910048; StringObject* seInfoObj = (StringObject*)args[6]; if (seInfoObj) { seInfo = dvmCreateCstrFromString(seInfoObj); if (!seInfo) { ALOGE("seInfo dvmCreateCstrFromString failed"); dvmAbort(); } } StringObject* niceNameObj = (StringObject*)args[7]; if (niceNameObj) { niceName = dvmCreateCstrFromString(niceNameObj); if (!niceName) { ALOGE("niceName dvmCreateCstrFromString failed"); dvmAbort(); } } }
因此直接強制將app啟動進程時的允許許可權和有效許可權全設定成固定的就可以實現許可權繞過:
編譯Libdvm.so拷貝到手機發現現在進程許可權已經和system_server許可權一樣了。
android繞過permission驗證及fork進程許可權提升