浅析Android如何从不同的层次保证安全性

2023-11-04

Android上的安全机制可以基本都是从两个方面来进行:1.应用沙盒2.权限约束

先了解一下基本知识:

 Android是一个分层操作系统,由个4层组成,分别是:Linux KernelNative UserspaceAndroid FrameworkApplication

 Android的核心安全原则是,应用程序不应该损害操作系统资源、用户和其他应用程序。


1.Linux Kernel层

Linux内核负责配置配置应用沙盒以及规范一些权限。


为每个应用配置应用沙箱,每个应用运行在自己的沙盒中,在安装过程中,每个包都会被分配一个唯一的UID(用户标识符)和GID(组标识符),并且在设备的应用生命周期内部会更改。因此每一个应用都有一个对应的Linux用户。用户名遵循格式app_x,并且该用户的UID等于Process.FIRST_APPLICATION_UID+x。因为每个应用都有自己的UID和GID,Linux内核强制应用在自己的隔离地址空间内执行,并且应用唯一的UID和GID由Linux内核使用,以实现不同应用直接的资源的公平分离,并且每个应用都基于Linux可选访问控制模型(DAC)的验证。除此之外,使用相同证书签名的应用能够在彼此之间共享数据,可以拥有相同的UID或甚至可以在相同的进程中运行。我们可以使用adb命令 adb shell ps 来查看手机中所有进程的一些信息。


通过将Linux用户和组所有者分配给实现该功能的组件,限制应用对某些系统功能的访问。使用文件系统权限访问文件和设备驱动程序,限制进程对设备某些功能的访问。/dev/cam设备驱动程序属于root所有者和摄像机所有者组,这就表示只有以root身份运行或包含在摄像机组中的进程才能使用这个驱动,也就是我们说的拍照功能。如果你同意安装的应用程序使用相机功能,那么就会为这个应用程序分配一个相机的Linux组GID,标识该应用程序可以从/dev/cam设备驱动程序读取信息,这些权限标签和相应组之间的映射在文件框架/base/data/etc/platform.xml中定义。

2. Native Userspace层

构建文件系统结构以及文件权限


Android设备的引导顺序大概可以分以下几步,Boot Rom - Boot Loader - Linux Kernel - Init 

当用户打开手机时,设备的CPU尚未初始化,这种情况下,处理器从硬连线地址开始执行命令,该地址指向Boot ROM所在的CPU的写保护存储器中的一段代码,这些代码主要目的是坚持Boot Loader(引导加载程序)所在的介质。检测完成后,Boot ROM将引导加载程序加载到内存中,并且开始执行Boot Loader的加载代码,Boot Loader负责建立外部RAM,文件系统和网络的支持。之后,Linux开始加载,内核初始化环境来运行C代码,开始做加载驱动和挂载文件系统以及运行用户空间进程等操作。在Android中,第一个用户进程是init,它以root权限启动(UID=0),它是所有进程的祖先。init有一个配置文件init.rc,它之中预定义了一些事件,init运行的时候会按照它预定义的事件执行,主要是负责基本文件结构的创建,设置内核参数以及启动ueventd守护进程,ServiceManager的启动、Zygote进程的启动等。第一个守护进程是ueventd守护进程,主要设置不同设备的所有者和权限,ServiceManager在Android中充当所有服务的索引。Zygote是所有进程的祖先,我们所有的应用都是由Zygote fork出来的。


/system,/data,/cache是Android的文件系统核心目录,都是由init程序安装到预定义的点。/system分区包含了除了Linux内核的整个Android系统,此文件夹包含子目录/system/bin和system/lib,它们相应包含核心本地可执行文件和共享库以及由系统映像预先构建的所有系统应用,并且映像以只读模式安装,所以此分区的内容不能在运行时更改。由于/system被挂载为只读,所以它不能用于存储数据,所以另一个单独的分区/data负责存储随时间改变的用户数据或信息。/cache分区负责存储经常访问的数据和应用程序组件。这些文件夹的默认权限必须在编译时定义。

3. Android Framework层

应用程序框架级别上的安全性由IPC引用监视器实现


由于应用程序都是在相互隔离的沙箱中通过带有不同的Linux身份的不同进程中运行着,因此需要进程间通信(IPC)框架来管理不同进程之间的数据和信号交换。在Android中,进程间的通信主要由Binder来实现,Binder是一个特殊的框架,它在Android中重新开发用来支持进程间通信,它提供了管理Android操作系统中的进程之间的所有类型的通信所需的功能。Binder的详细介绍可以看我的另一篇文章-.-http://blog.csdn.net/qq_33667176/article/details/70768560


在Android中,服务的每个关键功能(服务的方法)被称为权限的特殊标签保护。也就是说,在执行这样的功能之前,会检查刁红进程是否被分配了权限。如果有权限,则允许其调用,否则就会抛出安全检查异常。我们必须把相应的权限写到AndroidManifest.xml中,并且在6.0以后被列为dangerous的权限还需在代码中动态申请。Android中有4个权限级别,分别是normal,dangerous,signature和signatureOrSystem。默认情况下,第三方应用程序开发人员无法访问受signture和signatureOrSystem级别的系统权限保护的功能。因此,需要使用这些级别的权限保护的功能的应用程序必须使用相同的平台证书进行签名。然而,仅有操作系统的构建者才可以访问该证书的私匙。这我们就明白了为什么华为手机的华为应用市场可以静默安装应用,而应用宝只能跳转到应用安装页面了。同时,Android Framework中提供了一个类PackageManagerService负责Android中的应用程序管理,此服务的一个重要作用是权限管理,并且负责应用程序安装和升级中执行检查是否符合权限模型。

4.Application层

四大组件和应用权限在AndroidManifest中声明。


Android应用以Android软件包(.apk)文件的形式分发。一个包由一个Dalvik/ART可执行文件,资源文件,清单文件和本地库组成,并由应用的开发人员使用自签名证书签名。每个应用又四个组件类型的几个组件组成:Activity,Service,Boardcast Reciver,Content Provider,每个组件(除了BoardcastReciver)都需要在AndroidManifest.xml中声明,BoardcastReciver也可以在代码中动态声明,组件间通过Intent通信,Intent是基于Binder框架的特殊通信手段。


应用还可以使用自定义权限来保护对此应用的组件的访问,类似于系统权限之一。也就是说,如果应用1希望保护自己其中的访问A1,需要声明一个权限标签P1,此时如果应用2想要访问C1,就必须在AndroidManfest.xml中声明P1权限。


okgg =。=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析Android如何从不同的层次保证安全性 的相关文章

  • dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper 无法转换为 android.app.Activity

    我正在使用具有一些自定义视图实现的第三方库 在实现中 他们调用Utils showSoftKeyboard context as Activity 这与使用片段作为 AndroidEntryPoint 一起导致以下异常 java lang
  • 我们如何从 Android 通知中提取 bigpicturestyle 图像?

    我有一个通知侦听器服务 可以读取来自其他应用程序的通知 经用户许可 并提取所有数据 能够访问除通知展开视图中显示的图像之外的所有内容 我也在阅读 EXTRA PICTURE 意图值 if extras containsKey Notific
  • Android中如何通过ViewModel类在Activity和Fragment之间共享数据?

    我想知道是否可以传递一个在 Activity 类中声明的字符串数据 并将该字符串数据传递给 ViewModel 类 然后将数据传递给 Fragment 类 视图模型类 class TimeTableViewModel extends Vie
  • 使用 setText 更改文本后如何更新屏幕?

    现在我正在使用以下代码来更新TextView txtMain setText new text 该代码执行后 屏幕不会更新新文本 有没有办法可以强制文本立即更新 该代码执行后 屏幕不会更新新文本 一旦您将控制权归还给 Android 就应该
  • Auto-value-gson出现接口错误,注册一个InstanceCreator?

    我有一个如下所示的接口类 public interface Species String name And a Human实现的类 AutoValue使用类型适配器 AutoValue public abstract class Human
  • 如何实现 ALTER TABLE 的示例[重复]

    这个问题在这里已经有答案了 我已经多次问过这个问题 但尚未得到完整的答案 如何实现 ALTER TABLE 语句以向数据库添加列 有人可以给我举个例子吗 请阅读SQLite ALTER TABLE 参考 http sqlite org la
  • Google 地图位于活动的中间区域

    我正在使用 Android studio 2 1 2 我检查了一下 大多数问题要么使用旧版本的 Android studio 要么使用一些旧的类 这些类不适用于我的情况 从文件 gt 新项目 gt 我使用了选项Google Maps Act
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • 将 android 蓝牙客户端套接字连接到 ubuntu 服务器套接字时出现问题

    我正在编写一个 Android 应用程序 它应该通过蓝牙与服务器交换数据 服务器端位于运行 Ubuntu 的 PC 上 使用 bluez 库 用 C 或 C 编写 当我尝试连接到 PC 上的服务器套接字时 我的 Android 应用程序失败
  • 在 android studio 中找不到 SDK 位置

    我刚刚在 android studio 中导入了我的 eclipse 项目 我一直这么说 Error SDK location not found Define location with sdk dir in the local prop
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 带有 backstack Resume 的嵌套片段

    在我的应用程序中有几个fragments in an activity我正在维护一个backStack对于这些fragment 一切都很好 但其中有一个嵌套的片段 当我把它放入backStack然后再次按后退按钮恢复 该片段看起来与先前的内
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • 如何在android中安装和使用couch db

    我应该如何在 android 中安装和使用 couch Db 我的意思是本地沙发数据库 我可以在平板电脑和模拟器中使用它 为此我必须遵循哪些步骤 我目前正在开发一个使用它的项目 有两种选择 1 couchbase android 是的 co
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • 在线性布局内的 ScrollView 内并排对齐 TextView

    我有一个带有滚动视图的线性布局 我想保留它的当前格式 但只需将 textView2a 和 textView3a 并排放置 而不会破坏我当前的布局格式 我已经包含了我最近的尝试 但它们似乎不正确 提前致谢 Java菜鸟 当前有效的 XML

随机推荐

  • linux创建新用户

    1 添加用户 adduser test 设置密码 passwd test 2 添加root权限 1 chmod 755 etc sudoers vi etc sudoers 文件 找到下面一行 把前面的注释 去掉 Allows people
  • 数据集市项目的总结

    本人毕业就在某银行信用卡中心工作 做了数据集市项目 据说投资3000万 后来在阿里做数据产品经理的工作 想把过去的工作总结一下 不管成功和失败 都是一种经历 于是有了下面的文字
  • 使用二分法实现在一个有序列表中查找指定的元素

    二分法是一种快速查找的方法 时间复杂度低 逻辑简单易懂 总的来说就是不断的除以2除以2 例如需要查找有序数组arr里面的某个关键字key的位置 那么首先确认arr的中位数或者中点center 下面分为三种情况 1假如arr center g
  • es多字段分组去重统计

    es多字段分组去重统计 oracle中sql select a1 b1 from dual group by a1 b1 或 select DISTINCT a1 b1 from dual es分组去重统计 话不多说 直接贴代码 Terms
  • 【云原生之kubernetes】kubernetes集群下ConfigMap使用方法

    云原生之kubernetes kubernetes集群下ConfigMap使用方法 一 ConfigMap介绍 1 ConfigMap介绍 2 ConfigMap特点 二 生成一个ConfigMap示例 1 命令生成 2 configmap
  • uboot学习之Makefile之配置过程

    uboot 1 1 6源码分析 分析配置过程 1 安装交叉编译工具arm linux gcc 否则编译报错 2 执行make canmb config MKCONFIG a canmb ppc mpc5xxx canmb 1 MKCONFI
  • 自动化测试入门

    1 初识自动化测试 如果以前没有做过自动化测试 那么就不了解自动化测试 可能会觉得自动化测试比较神秘 但是 我们在日常的计算机操作中 可能会碰到一些自动化处理的过程 这些过程和自动化测试比较接近 例如 Windows操作系统的控制面板中 有
  • windows 控制台通过密码连接redis

    Redis 访问密码设置 1 修改密码 打开redis conf文件 先使用字符匹配查找到requirepass foobared对应的位置 然后修改foobared成自己想要的密码 并删除当前行前面的 注释 然后保存退出 2 重启redi
  • Vulkan-NCNN 编译

    首先安装一些依赖 sudo install build essentials git cmake libprotobuf dev protobuf compiler libvulkan dev glslang tools vulkan to
  • 第28章 案例开发

    第28章 案例开发 视频讲解 23分钟 对于JavaScript初学者来说 尝试开发小型的难度适中的应用程序或游戏 能够培养学习乐趣 激发开发热情 本章将通过两个相对复杂的案例 帮助读者上机进行JavaScript实战训练 为日后的开发实习
  • Region拆分逻辑

    Table of Contents Region拆分 拆分前提 获取拆分点 执行拆分 回滚操作 Region拆分 Region的拆分逻辑是通过CompactSplitThread线程的requestSplit方法来触发的 每当执行Memst
  • 【论文阅读 - AAAI 2019】Abstractive Summarization: A Survey of the State of the Art

    Abstractive Summarization A Survey of the State of the Art Conference AAAI 2019 Authors Hui Lin Vincent Ng Human Languag
  • overpass-turbo下载铁路线

    overpass turbo This has been generated by the overpass turbo wizard The original search was road out json rel 198494 out
  • 打印 request 参数

    Enumeration parameterNames request getParameterNames while parameterNames hasMoreElements Object param parameterNames ne
  • Linux 命令总结

    目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 dir2 cd 改变当前目录 cd d
  • vue 绘制体温单与三测单组件 实现前端js打印

    更新 代码开源 https github com mydaoyuan my development 有帮助请帮忙点个 start 企鹅 1534815114 新上 麻醉单 和 患者时间轴 在下面地址就可以看到 新的一个版本完全重写了体温单
  • Windows无法与设备或资源(主DNS服务器)通信的解决方法

    前言 这几天 Windows更新后 连接的手机热点似乎出现了一些小问题 网络总是不稳定 而且浏览器等也出现上不了网的问题 解决方法 当电脑出现连接上WLAN后却无法上网的问题时 1 首先可以右键点击桌面右下角处的网络图标 在弹出的菜单中选择
  • java的inputstream_java中inputstream的使用

    java中的inputstream是一个面向字节的流抽象类 其依据详细应用派生出各种详细的类 比方FileInputStream就是继承于InputStream 专门用来读取文件流的对象 其详细继承结构如图 我们发现 是从抽象类InputS
  • 虚拟vpc服务器搭建,在AWS上搭建VPC三层架构的私有网络

    概述 这里使用的是aws的vpc 因为使用aws的该功能 需要账户绑定授权usd的信用卡 没有的话 就操作不了 用aws的好处是 很多功能是有限时间内是免费的 可以很好的拿来做练习 什么是vpc VPC Virtual Private Cl
  • 浅析Android如何从不同的层次保证安全性

    Android上的安全机制可以基本都是从两个方面来进行 1 应用沙盒2 权限约束 先了解一下基本知识 Android是一个分层操作系统 由个4层组成 分别是 Linux Kernel Native Userspace Android Fra