Android安全开发之 Provider 组件安全

news2024/11/14 14:39:14

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"

<provider
    android: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 10196
	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.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",这个时候我们需要添加鉴权校验或包名过滤。

 <provider
     android: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.coloradmin.cn/o/1808540.html

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

相关文章

深入理解C语言:main函数的奥秘

在C语言中&#xff0c;main函数是每个程序的入口点&#xff0c;起着至关重要的作用。本文将深入探讨main函数的工作原理&#xff0c;包括其参数、返回值、以及如何从main启动程序的执行。通过实际代码示例&#xff0c;读者将更深入地理解main函数在C语言编程中的核心地位。 第一…

SQL自动发送邮件的方法有哪些?如何配置?

SQL自动发送邮件设置时的注意事项&#xff1f;邮件群发如何操作&#xff1f; 在现代企业中&#xff0c;自动化流程越来越普遍&#xff0c;SQL自动发送邮件作为其中一项重要功能&#xff0c;能够大大提高工作效率并简化数据管理流程。AokSend将介绍几种实现SQL自动发送邮件的方…

MySQL限制登陆失败次数配置

目录 一、限制登陆策略 1、Windows 2、Linux 一、限制登陆策略 1、Windows 1&#xff09;安装插件 登录MySQL数据库 mysql -u root -p 执行命令安装插件 #限制登陆失败次数插件 install plugin CONNECTION_CONTROL soname connection_control.dll;install plugin CO…

探索软件工程师在新能源汽车研发中的角色与贡献

随着全球对可持续发展的关注不断增加&#xff0c;新能源汽车的研发与应用成为了汽车行业的一个重要方向。作为软件工程师&#xff0c;参与新能源汽车研发不仅能够推动科技创新&#xff0c;还能为环保事业贡献力量。本文将深入探讨软件工程师在新能源汽车研发中的具体贡献、所需…

VISIO安装教程+安装包

文章目录 01、什么是VISIO&#xff1f;02、安装教程03、常见安装问题解析 01、什么是VISIO&#xff1f; Visio是由微软开发的流程图和图表绘制软件&#xff0c;它是Microsoft Office套件的一部分。Visio提供了各种模板和工具&#xff0c;使用户能够轻松创建和编辑各种类型的图…

佳能5DMARK IV mov视频覆盖的恢复方法

5DMARK IV算是佳能比较经典的一款摄像机&#xff0c;是佳能早期使用MOV的摄像机之一&#xff0c;MOV是当初佳能高端机的象征&#xff0c;当然现在佳能已经不在通过MOV和MP4来区分硬件级别了。下边这个案例是文件拍摄时断电&#xff0c;结果变成0字节&#xff0c;然后覆盖了部分…

C语言最终讲:预处理详解

C语言最终讲&#xff1a;预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…

超详细 | 使用Nexus搭建私服 (带代码演示)

为什么需要搭建私有仓库&#xff1f; 在企业开发的过程中&#xff0c;不是所有公司都能直接访问外网。在这种情况下&#xff0c;就需要在局域网内找一台有外网访问权限的服务器&#xff0c;搭建Nexus私服仓库&#xff0c;开发人员连接到这台私服上&#xff0c;通过搭建的Nexus…

【学习笔记】finalshell上传文件夹、上传文件失败或速度为0

出现标题所述的情况&#xff0c;大概率是finalshell上传文件的过程中的权限不够。 可参照&#xff1a;Finalshell上传文件失败或者进度总为百分之零解决方法 如果不成功&#xff0c;建议关闭客户端重试。 同时建议在设置finalshell的ssh连接时根据不同用户设置多个连接&#xf…

RAG vs Fine-Tuning 微调哪种大模型(LLM)技术更好?

数据科学和机器学习的研究人员和从业者都在不断探索创新策略来增强语言模型的能力。在众多方法中&#xff0c;出现了两种突出的技术&#xff0c;即检索增强生成 (RAG)和微调。本文旨在探讨模型性能的重要性以及 RAG 和微调策略的比较分析。 模型性能在 NLP 中的重要性 增强用…

LinkedList详解(含数据结构动画演示)

目录 LinkedList详解1、LinkedList的继承体系2、LinkedList的构造函数3、LinkedList的add(E e)方法4、LinkedList的Node节点5、双向链表的概念和Node节点的详细解释6、LinkedList的add(E e)方法梳理7、LinkedList的getXXX方法8、LinkedList的removeXXX方法①、removeFirst()方法…

vue中插槽的本质

定义slotCompoent.vue 组件 <template><slot></slot><slot nameslot1></slot><slot name"slot2" msg"hello"></slot> </template>使用组件&#xff1a; <slotComponent><p>默认的</p>…

电脑上的瑞士军刀

一、简介 1、一款专为 Windows 操作系统设计的桌面管理工具&#xff0c;它具备保存和恢复桌面图标位置的功能&#xff0c;使用户能够在各种情况下&#xff0c;如分辨率变动、系统更新或其他原因导致的图标位置混乱后&#xff0c;快速恢复到熟悉的工作环境。它还拥有诸多实用功能…

1.nginx介绍

介绍 是一个高性能的http和反向代理服务器。 特点 占用内存少&#xff0c;并发能力强。 nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xff0c;实现上非常注重效率&#xff0c;能经受高负载的考验&#xff0c;有报告表明能支持高达50,000个并发连接数。 基…

李廉洋:6.10黄金原油非农之后,今日行情走势分析策略。

黄金消息面分析&#xff1a;即美联储不会在短期内以降息的方式出手纾困。该报告确实将首次降息的可能性推迟到了12月&#xff0c;但股市的反应不像多数交易商预期的那样。股市非但没有崩盘&#xff0c;反而随着交易员逢低买入而大幅反弹。很明显&#xff0c;市场完全专注于盈利…

基于STM32F030设计的多点温度采集系统(BC26+OneNet)

一、项目背景 随着物联网技术的迅猛发展&#xff0c;越来越多的智能设备应运而生&#xff0c;而温度采集系统是其中重要的一类。在现代工业和家庭生活中&#xff0c;温度对于生产、居住和储存等过程的控制有着非常重要的作用。因此&#xff0c;准确地采集环境温度数据并进行处…

网络安全领域六大顶级会议介绍:含会议介绍、会议地址及会议时间和截稿日期

引言&#xff1a; 从事网络安全工作&#xff0c;以下六个顶会必须要知道&#xff0c;很多安全的前沿技术都会在如下会议中产生与公开&#xff0c;如下会议发表论文大部分可以公开下载。这些会议不仅是学术研究人员展示最新研究成果的平台&#xff0c;也是行业专家进行面对面交流…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

SpringCloud-面试篇(二十四)

&#xff08;1&#xff09;Nacos如何支撑数十万服务注册的压力 小型企业来讲nacos压力没有那么大&#xff0c;但是想阿里&#xff0c;服务的数量可能会达到数万&#xff0c;那麽多的服务。当服务原来越多时&#xff0c;除了服务注册以外&#xff0c;还有服务的定时更新&#x…

【数据分享】《中国投资领域统计年鉴》1950-2022(中国固定资产投资统计年鉴)

​最近老有同学过来询问《中国投资领域统计年鉴》、《中国固定资产投资统计年鉴》这两本年年鉴的关系以及怎么获取这两本本年鉴。今天就在这里给大家分享一下这两本年鉴的具体情况。 《中国投资领域统计年鉴》是一部全面反映中国固定资产投资情况的权威资料。本书收集了全国、…