Android安全开发之 Provider 组件安全

Android系统中的Content Provider组件是一种用于在不同应用之间共享数据的机制。它提供了一种安全、可控的方式,允许应用访问其他应用的数据。然而,如果Provider组件的安全措施没有得到妥善实现,则可能会导致严重的安全漏洞,例如数据泄露、隐私侵犯甚至恶意代码执行。

Android安全开发之 Provider 组件安全

  • 一、安全渗透案例
  • 二、解决方案
    • 2.1 无需 exported
    • 2.2 需要 exported
  • 三、正确的定义私有权限
  • 四、Provider 组件的安全风险

一、安全渗透案例

测试步骤:

1.进入应用进行添加新内容,插入数据库

2.使用adb或者编写apk,对指定uri进行查询

1.adb shell content query --uri content://com.xxx.note.data.NoteProvider/note

测试结论:

编辑内容都会通过uri查询出来,泄露用户隐私信息,未鉴权

server@dev-fj-srv:~/Desktop $ adb shell content query --uri content://com.xxx.note.data.NoteProvider/note
Row: 0 _id=1, title=, content=<?xml version="1.0" encoding="UTF-8"?><note><notetxt>地址</notetxt></note>, longdate=1717745973845, iscollect=0, iscontainpic=0, isprivate=0, isdeleted=0, backgroundid=4, parentfolderid=-10, istop=0, topdate=0, iscontainvoice=0, picpath=NULL
Row: 1 _id=2, title=, content=<?xml version="1.0" encoding="UTF-8"?><note><notetxt>账户</notetxt></note>, longdate=1717745961274, iscollect=0, iscontainpic=0, isprivate=0, isdeleted=0, backgroundid=4, parentfolderid=-10, istop=0, topdate=0, iscontainvoice=0, picpath=NULL
Row: 2 _id=3, title=, content=<?xml version="1.0" encoding="UTF-8"?><note><notetxt>密码</notetxt></note>, longdate=1717745951538, iscollect=0, iscontainpic=0, isprivate=0, isdeleted=0, backgroundid=4, parentfolderid=-10, istop=0, topdate=0, iscontainvoice=0, picpath=NULL

漏洞修复建议:

增加鉴权校验

很多人可能会好奇,我的代码进行了混淆处理,如何发现我的provider及其authorities,可以通过APK文件进行逆向或反编译出AndroidManifest.xml,此类声明信息是不会被混淆的,可以直接获取的。

甚至可以直接通过adb获取:adb dumpsys package com.xxx.note 直接获取得到 ContentProvider Authorities

ContentProvider Authorities:[com.xxx.note.data.SearchProvider]:Provider{fc33540 com.xxx.note/.data.SearchProvider}applicationInfo=ApplicationInfo{5ba67a5 com.xxx.note}[com.xxx.note.provider]:Provider{19d68c3 com.xxx.note/androidx.core.content.FileProvider}applicationInfo=ApplicationInfo{a90977a com.xxx.note}[com.xxx.note.data.NoteProvider]:Provider{da7fc72 com.xxx.note/.data.NoteProvider}applicationInfo=ApplicationInfo{13db2b com.xxx.note}

二、解决方案

2.1 无需 exported

当 ContentProvider 仅应用自身使用,无需 exported 供其他应用调用,即可直接设置 exported="false"

<providerandroid:name=".data.NoteProvider"android:authorities="com.xxx.note.data.NoteProvider"android:exported="false" />

此时再通过 adb 命令查询就会出现 SecurityException 报错无法查询

server@dev-fj-srv:~/Desktop$ adb shell content query --uri content://com.xxx.note.data.NoteProvider/note
Error while accessing provider:com.xxx.note.data.NoteProvider
java.lang.SecurityException: Permission Denial: opening provider com.xxx.note.data.NoteProvider from (null) (pid=10781, uid=2000) that is not exported from UID 10196at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)at android.os.Parcel.createException(Parcel.java:3041)at android.os.Parcel.readException(Parcel.java:3024)at android.os.Parcel.readException(Parcel.java:2966)at android.app.IActivityManager$Stub$Proxy.getContentProviderExternal(IActivityManager.java:7803)at com.android.commands.content.Content$Command.execute(Content.java:516)at com.android.commands.content.Content.main(Content.java:735)at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:447)
Caused by: android.os.RemoteException: Remote stack trace:at com.android.server.am.ContentProviderHelper.checkAssociationAndPermissionLocked(ContentProviderHelper.java:756)at com.android.server.am.ContentProviderHelper.getContentProviderImpl(ContentProviderHelper.java:411)at com.android.server.am.ContentProviderHelper.getContentProviderExternalUnchecked(ContentProviderHelper.java:182)at com.android.server.am.ContentProviderHelper.getContentProviderExternal(ContentProviderHelper.java:176)at com.android.server.am.ActivityManagerService.getContentProviderExternal(ActivityManagerService.java:6889)

2.2 需要 exported

当 ContentProvider 需要通过数据接口供其他应用使用时,就只能设置exported="true",这个时候我们需要添加鉴权校验或包名过滤。

 <providerandroid:name=".data.SearchProvider"android:authorities="com.xxx.note.data.SearchProvider"android:exported="true"/>

在重写 ContentProvider query 方法时先进行校验,验证成功后再返回查询数据。

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {if (!isAuthorized()) {throw new SecurityException("Access denied. Unauthorized.");}// 返回数据查询
}private boolean isAuthorized() {return AUTHORIZE_ACCESS_PACKAGE.equals(getCallingPackage());
}

AUTHORIZE_ACCESS_PACKAGE 即为允许访问此 ContentProvider 的应用包名。

此时再通过 adb 命令访问此 ContentProvider 就会返回 java.lang.SecurityException: Access denied. Unauthorized. 报错。通过 adb 访问时候可以查询到 getCallingPackage() 为 com.android.shell,不在我们运行访问的包名名单内。

server@dev-fj-srv:~/Desktop$ adb shell content query --uri content://com.xxx.note.data.SearchProvider
Error while accessing provider:com.xxx.note.data.SearchProvider
java.lang.SecurityException: Access denied. Unauthorized.at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)at android.os.Parcel.createException(Parcel.java:3041)at android.os.Parcel.readException(Parcel.java:3024)at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)at android.content.ContentProviderProxy.query(ContentProviderNative.java:495)at com.android.commands.content.Content$QueryCommand.onExecute(Content.java:661)at com.android.commands.content.Content$Command.execute(Content.java:522)at com.android.commands.content.Content.main(Content.java:735)at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:447)

三、正确的定义私有权限

在AndroidManifest中定义私有权限的语法为:
img

其中android:protectionLevel的可选值分别表示:

  • normal:默认值,低风险权限,在安装的时候,系统会自动授予权限给 application。
  • dangerous:高风险权限,如发短信,打电话,读写通讯录。使用此protectionLevel来标识用户可能关注的一些权限。Android将会在安装程序时,警示用户关于这些权限的需求,具体的行为可能依据Android版本或者所安装的移动设备而有所变化。
  • signature: 签名权限,在其他 app 引用声明的权限的时候,需要保证两个 app 的签名一致。这样系统就会自动授予权限给第三方 app,而不提示给用户。
  • signatureOrSystem:除了具有相同签名的APP可以访问外,Android系统中的程序有权限访问。

大部分开放的Provider,是提供给本公司的其他应用使用的,一般的话一个公司打包签名APP的签名证书都应该是一致的,这种情况下,Provider的android:protectionLevel应为设为“signature”。

四、Provider 组件的安全风险

  1. 权限控制不当:如果Provider组件没有正确配置权限,则可能会允许未经授权的应用访问敏感数据。
  2. 数据泄露:Provider组件可能会被恶意应用利用来窃取敏感数据,例如联系人信息、通话记录、短信内容等。
  3. 隐私侵犯:Provider组件可能会被恶意应用利用来跟踪用户行为,例如位置信息、浏览历史等。
  4. 恶意代码执行:Provider组件可能会被恶意应用利用来执行恶意代码,例如植入病毒、木马等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比利时海外媒体宣发,发稿促进媒体通稿发布新形势-大舍传媒

引言 随着全球化的推进&#xff0c;海外媒体的影响力也日益增强。在这一背景下&#xff0c;比利时海外媒体的宣发工作成为了媒体通稿发布的新形势。大舍传媒作为一家专注于宣传推广的公司&#xff0c;一直致力于与比利时博伊克邮报&#xff08;boicpost&#xff09;合作&#…

用数据说话,效果好上一万倍,不是空口说白话的“好很多”

作为一名大数据开发者&#xff0c;我深知数据的有很大的魔力&#xff08;我这句话就没用数据&#xff0c;听上去很无力&#xff09;。数据不仅仅是数字和图表&#xff0c;它还能赋予我们强大的说服力和权威感。让我给你详细讲讲数据如何让理论插上翅膀。 目录 数据的“靠谱”…

文字悬停效果

文字悬停效果 效果展示 CSS 知识点 CSS 变量使用回顾-webkit-text-stroke 属性的运用与回顾 页面整体结构实现 <ul><li style"--clr: #e6444f"><a href"#" class"text">First</a></li><li style"--cl…

如何看待有企业使用AI写代码,6个月研发提效超20%,未来AI对程序员会有多大影响?

AIGC对程序员来说&#xff0c;有远虑&#xff0c;无近忧。 目前看来&#xff0c;AI是程序员编写代码很好的助手&#xff0c;尤其在代码补全、照样子写代码、生成注释及文档等方面效果非常好&#xff0c;还有能省去很多查api的时间。 但即便如此&#xff0c;它也仅仅能解决造轮子…

ripro主题如何使用memcached来加速

ripro主题是个很不错的资源付费下载主题。主题自带了缓存加速开关&#xff0c;只要开启了缓存加速功能&#xff0c;正常情况下能让网站访问的速度提升很大。 但好多人这么做了却发现没啥加速效果&#xff0c;原因就在于wordpress里缺少了memcache文件。只需要把object-cache.ph…

CATIA软件 输入无参格式还原成为有参模型教程

上图为零件设计中特征辨识的命令栏&#xff0c;此次分享是对手动/自动特征辨识的命令应用&#xff0c;作个简单操作的分享了解。在CATIA软件中把输入的无参模型通过特征化后转化为有参模型的过程。其实CATIA软件早有这个功能提供给用户使用了&#xff0c;可能大家很少用。有了手…

java:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89433361 # 项目代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

设计模式-享元模式(结构型)

享元模式 享元模式是一种结构型模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;减少内存占用。通过重用现有对象的方式&#xff0c;如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。 图解 角色 享元工厂&#xf…

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前&#xff0c;我们要知道linux是一个操作系统。 那操作系统是什么呢&#xff1f;&#xff08;这里只做大概了解&#xff09; 操作系统就是一个管理软硬件的软件。 它对上提供良好&#xff08;稳定、高效、安…

做材料科学领域研究热点:高通量多尺度材料计算和机器学习

研究背景 材料科学是一个重要领域&#xff0c;涉及物质的研究和利用。随着科技进步&#xff0c;材料学已成为多学科交叉的前沿领域之一&#xff0c;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

长亭Nginx入门

在学习Nginx时我们先学习下防火墙原理】 将流量代理给防火墙 这样WAF 会分析流量 防火墙安装网络拓扑图 流量给防火墙 再给负载均衡 反向代理这个网络拓扑图是 防火墙充当了反向代理角色 所以我们就知道了我们为了要学习Nginx 因为这个服务器支持很多功能模块 自己本身就能…

开源项目-Docker部署学之思管理系统

开源-Docker部署学之思管理系统 文章目录 开源-Docker部署学之思管理系统资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、Git获取源码五、编辑SQL脚本六、访问管理系统如果访问或者登录的时候出现内部服务错误&#xff0c;评论或私信&#xff0c;我给你解…

Cisco Packet Tracer实验(三)

续实验二 问题一&#xff1a;使用二层交换机连接的网络需要配置网关吗&#xff1f;为什么&#xff1f; 二层交换机作为网络设备中的一种&#xff0c;主要用于在局域网&#xff08;LAN&#xff09;内部进行数据包的转发。它工作在OSI模型的第二层&#xff08;数据链路层&#xf…

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则 Spring Security 中默认所有的 http 请求都需要先认证通过后&#xff0c;才能访问。那么&#xff0c; 如何指定不需要认证就可以直接访问的资源呢&#xff1f;比如 用户的登录页面和注册页面&#xff0c;都是不需要…

【面试干货】深入理解Java中的final关键字

【面试干货】深入理解Java中的final关键字 一、被 final 修饰的类二、被 final 修饰的方法三、被 final 修饰的变量四、被 final 修饰的常量 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;final关键字有多种用途&…

RV32F\RV32D指令集

RV32F\RV32D指令集 F扩展1、浮点控制状态寄存器2、指令类型F扩展 F扩展增加了32个浮点寄存器f0-f31,每个32位宽,以及一个浮点控制和状态寄存器fcsr,其中包含浮点单元的工作模式和异常状态。FLEN=32表示F单精度浮点扩展,大多数浮点指令对浮点寄存器中的值进行操作。浮点加载…

基于JSP技术的电子商城系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长码农猫哥。如果你对电子商城系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示 首页 管理…