Android权限攻击

目录

  • 权限介绍
  • 攻击介绍
  • 代码实现

目的

  • 了解Android权限分组
  • 掌握Android权限攻击原理
  • 了解Android权限攻击的实现

权限介绍

Android系统其中在6.0之前,当用户进行安装时,系统会根据AndroidManifest.xml文件中的声明,列出一个权限列表,只有当用户同意了这些权限后才能安装,但一般来说,用户不会查看使用了哪些权限,这就容易让app获取到不应该获取的资源,如通讯录。在6.0之后Android系统对权限系统进行了比较彻底的改变,现在Android把权限分成了4种:

  • 正常权限(Normal Permissions)
  • 危险权限(Dangerous Permission)
  • 特殊权限(Special permissions)
  • 其他权限

正常权限(Normal Permissions)

此部分的权限对用户的影响不大,是不需要用书进行授权的,如蓝牙等权限,具体包括如下:

  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_NOTIFICATION_POLICY
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • BROADCAST_STICKY
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • DISABLE_KEYGUARD
  • EXPAND_STATUS_BAR
  • GET_PACKAGE_SIZE
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MANAGE_OWN_CALLS
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_COMPANION_RUN_IN_BACKGROUND
  • REQUEST_COMPANION_USE_DATA_IN_BACKGROUND
  • REQUEST_DELETE_PACKAGES
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

危险权限(Dangerous Permission)

危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。所有危险的 Android 系统权限都属于权限组。

  • 如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。
  • 如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。

表 1.危险权限和权限组

Permission GroupPermissions
CALENDAR READ_CALENDAR
WRITE_CALENDAR
CAMERACAMERA
CONTACTS READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONE READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS
SENSORSBODY_SENSORS
SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

特殊权限(Special permissions)

这里的权限和前面两种权限不一样,很多时候我们不是用它们,如果应用程序需要这些权限之一,它必须在清单中声明权限,并发送请求用户授权的意图。系统通过向用户显示详细的管理屏幕来响应意图。具体包括:

  • SYSTEM_ALERT_WINDOW 设置悬浮窗
  • WRITE_SETTINGS 修改系统设置

攻击介绍

Android因为使用了Linux内核,所以也继承它的进程控制和安全维护,所以Android的攻击多半都是由代码逻辑引发的,也就是程序员在正常的程序中运用Android提供的api,来获取到用户的隐私或强制使用某些恶意功能,如同最近爆发的“寄生推”病毒一样,普通的开发人员使用第三方提供的sdk,然后此公司通过代码分离和动态代码加载技术,完全掌控了代码包的控制权;随后通过云端配置任意下发包含不同功能的代码包,实现恶意代码包和非恶意代码包之间的随时切换;最后在软件后台自动开启恶意功能,包括植入恶意应用到用户设备系统目录,进行恶意广告行为和应用推广等。

这次我们实验的原理没有这个复杂,没有用到代码分离和动态代码加载技术,权限攻击主要包括在APP中植入恶意代码,用户在使用正常的功能时,会给APP提供相应的危险权限,获取得到权限后,恶意代码使用这些权限获取到用户的信息。上一节也提到过,Android6.0以下的权限管理都是在APP安装的时候提醒用户,因为用户安全知识的欠缺,一般不会查看APP使用的权限,所以可以通过这样的方式获取到用户的权限。在APP中定期启动恶意代码这种方式,在Android上架的时候,会检查到,所以一般使用其他的方式,此次实验中我使用的是用Android api中提供的广播机制来让看似正常的代码达到恶意代码的目的。此次我使用了两个apk,第一个为正常APP,拥有正常的功能,但是里面添加了一些危险操作,同时接收外面的广播。第二个APP用来发送广播,启动第一个APP中的代码,以达到我们想要的效果。

代码实现

第一个APP正常的功能是DES密钥生成器,它需要把密钥写入sd卡中,所以需要sd卡的读写权限,我设置targetSdkVersion为19,让系统默认使用以前的权限管理方式。

先是在AndroidManifest.xml中申请sd卡读写权限,同时申请网络连接权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

注册一个自己的BroadcastReceiver

<receiver android:name="com.hp.des_realize.MyBrodcast" >
        <intent-filter>

            <!-- 自定义广播中的action -->
            <action android:name="com.hp.broadcastreceiver" >
            </action>
        </intent-filter>
    </receiver>

编写BroadcastReceiver的处理方法,此次实验我只是实现对广播信息的接受,并打印出来,此处也可以编写上传代码,然后就可以获取一些想要的文件。

public class MyBrodcast extends BroadcastReceiver{

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        if(arg1.getAction().equals("com.hp.broadcastreceiver")){
            String url = arg1.getExtras().getString("url");
            String fileName = arg1.getExtras().getString("fileName");
            
            Log.e("url", url);
            Toast.makeText(arg0, url, Toast.LENGTH_SHORT);
        }
    }

}

第二个APP发送广播信息,这里程序不需要任何权限,通过广播,就可以做到修改sd卡文件信息。

Intent intent = new Intent();
intent.setAction("com.hp.broadcastreceiver");
intent.putExtra("url", "https://img-blog.csdn.net/20180311143753677");
String fileName = "test.png";
intent.putExtra("fileName", "test.png");
sendBroadcast(intent);