【Android】组件安全之Activity

news2024/11/15 16:02:42

前言

前文系统的总结了组件会有什么安全问题,本文详细的从不同的组件切入,深入的解析组件的实现方式。组件安全https://blog.csdn.net/xiru9972/article/details/123537641?ops_request_misc=&request_id=7a89a72fdd464cee90c20b2b88549c11&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-1-123537641-null-null.268%5Ev1%5Econtrol&utm_term=%E7%BB%84%E4%BB%B6&spm=1018.2226.3001.4450

相关知识

1. 生命周期

"Activity"是指在Android应用程序中执行的一个单独的用户界面组件,它通常是一个屏幕,用户可以与之交互。Activity有一个生命周期,其中包括多个不同的状态和回调方法。以下是Activity的生命周期:

  1. onCreate():当Activity第一次创建时,此方法被调用。在此方法中,可以进行初始化,例如设置布局文件,绑定视图元素等。
  2. onStart():当Activity变为用户可见时,此方法被调用。在此方法中,可以开始执行一些动画或其他用户体验效果。
  3. onResume():当Activity进入前台并开始与用户交互时,此方法被调用。在此方法中,可以启动一些后台任务,例如启动服务或注册广播接收器。
  4. onPause():当Activity失去前台焦点,但仍然可见时,此方法被调用。在此方法中,可以停止所有的动画或其他用户体验效果,以节省系统资源。
  5. onStop():当Activity被完全遮盖或者不再可见时,此方法被调用。在此方法中,可以停止所有后台任务,例如停止服务或注销广播接收器。
  6. onRestart():当用户返回到Activity时,此方法被调用。在此方法中,可以重新初始化一些数据或者重新绑定一些视图元素。
  7. onDestroy():当Activity被销毁时,此方法被调用。在此方法中,可以释放所有资源,例如取消注册广播接收器或释放绑定的服务。

2. 启动方式

分为显式启动隐式启动

  • 显式启动:显式启动是通过指定要启动的Activity的类名来启动Activity的方式。例如:
Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);

在这种情况下,启动的Activity是明确指定的,因此称为显式启动。

  • 隐式启动:隐式启动是通过指定一组Intent过滤器来启动Activity的方式。Intent过滤器是在Activity的清单文件中定义的,用于描述Activity可以响应哪些Intent。在隐式启动中,Intent不指定要启动的Activity的类名,而是指定Intent的一些属性(例如Action、Category、Data等),然后系统会查找与这些属性匹配的Activity来启动。例如:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);

在这种情况下,Intent指定了Action为ACTION_VIEW,Data为"http://www.example.com",系统会查找响应这种类型Intent的Activity来启动。

3. Intent Filter

Intent过滤器(Intent Filter)用于描述一个组件(例如Activity、Service、Broadcast Receiver)可以响应哪些Intent。Intent过滤器包含一组Intent属性,例如Action、Category、Data等,用于描述组件可以处理的Intent类型。

在组件的清单文件中,可以使用<intent-filter>元素来定义Intent过滤器。例如,以下是一个Activity的清单文件示例,其中定义了一个响应ACTION_VIEW Action和http和https数据类型的Intent过滤器:

<activity android:name=".MyActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>

在这个例子中,MyActivity可以响应ACTION_VIEW Action和http和https数据类型的Intent。当用户点击一个http或https链接时,系统会查找可以处理这种类型Intent的Activity,并启动MyActivity。

4. 加载模式-Launch mode

Activity 有四种加载模式:

  1. Standard(标准模式):默认的加载模式。每次启动Activity都会创建一个新的实例,无论该Activity是否已经存在。如果Activity已经存在,则该Activity会被放置在任务栈的顶部。
  2. SingleTop(单顶模式):如果要启动的Activity已经在任务栈的顶部,则不会创建新的实例,而是直接使用已经存在的Activity。如果Activity不在栈顶,则会创建一个新的实例,并将其放置在栈顶。
  3. SingleTask(单任务模式):启动该Activity时,系统会检查任务栈中是否已经存在该Activity的实例。如果已经存在,则会将该Activity及其之上的所有Activity全部出栈,并将该Activity移动到栈顶。如果不存在,则会创建一个新的实例,并将其放置在栈顶。
  4. SingleInstance(单实例模式):该模式下,系统会为该Activity创建一个新的任务栈,并且该任务栈只会包含该Activity的实例。如果要启动该Activity,则会将该任务栈调至前台,并将该Activity置于栈顶。

AndroidManifest.xml配置方式

activity android:name=".MainActivity" android:launchMode="singleTop"/>

5. 任务栈

在Android系统中,任务栈(Task Stack)是一种用于存储应用程序中活动(Activity)的栈结构。任务栈可以用来管理应用程序中的Activity,包括它们的启动顺序、顺序调整和恢复状态等。每个应用程序都有自己的任务栈,其中包含所有由该应用程序启动的Activity。

当一个Activity被启动时,它会被放置在任务栈的顶部。当用户按下返回键时,该Activity会被出栈,同时上一个Activity会被恢复并显示在任务栈的顶部。如果用户按下Home键或者切换到其他应用程序,该应用程序的任务栈会保留在后台,等待用户再次回到该应用程序。

任务栈的实现方式是先进先出(FIFO),即最先进入任务栈的Activity会被放在栈底,最后进入的Activity会被放在栈顶。如果某个Activity的启动模式为SingleTask或SingleInstance,它将会被放在任务栈的顶部并形成一个新的任务栈。

关于任务栈的一些配置也可以再AndroidManifest.xml中进行配置。

  1. android:launchMode:用于指定Activity的启动模式,包括Standard、SingleTop、SingleTask和SingleInstance四种模式。这些启动模式可以影响Activity在任务栈中的位置和行为。
  2. android:taskAffinity:用于指定Activity所属的任务栈的名称。默认情况下,所有Activity都属于应用程序的默认任务栈。如果Activity的taskAffinity属性与默认值不同,则该Activity将会被放置在指定的任务栈中。
  3. android:allowTaskReparenting:用于指定是否允许Activity在重新启动时从一个任务栈移动到另一个任务栈。如果该属性设置为true,则系统可以在需要时将Activity从一个任务栈移动到另一个任务栈,以便实现更好的用户体验。
  4. android:clearTaskOnLaunch:用于指定在启动该Activity时是否清除任务栈中的所有Activity。如果该属性设置为true,则启动该Activity时会清除任务栈中的所有Activity,并将该Activity放置在栈底。
  5. android:finishOnTaskLaunch:用于指定在启动该Activity时是否关闭任务栈中的所有Activity。如果该属性设置为true,则启动该Activity时会关闭任务栈中的所有Activity,并将该Activity放置在栈顶。

6. 可导出 

这也是之前提到的组件安全比较重要的一点,如果组件的属性是可导出的,那么其风险性是比较高的。

具体来说,Activity的导出性依赖于以下两个因素:

  1. AndroidManifest.xml文件中的android:exported属性。该属性决定了Activity是否可以被其他应用程序启动。如果该属性设置为true,表示Activity可以被其他应用程序启动;如果该属性设置为false,表示Activity只能被同一应用程序内的其他组件启动。默认情况下,android:exported属性的值为true。
  2. IntentFilter的配置。IntentFilter可以指定Activity可以响应哪些Intent。如果IntentFilter没有指定任何Intent,则该Activity不能被其他应用程序启动。如果IntentFilter指定了某些Intent,则只有匹配的Intent才能启动该Activity。同时,IntentFilter还可以指定Intent的URI的scheme、authority、path等信息,以进一步限制Activity的启动

7. 常见方法 

在Activity中,常见的方法包括:

  1. onCreate():当Activity第一次创建时调用,用于进行一些初始化操作,如设置布局、初始化界面控件等。
  2. onStart():当Activity由不可见状态变为可见状态时调用,用于准备界面数据。
  3. onResume():当Activity进入前台时调用,用于启动一些动画效果、注册广播接收器等操作。
  4. onPause():当Activity失去焦点时调用,用于暂停一些不必要的操作,如动画效果、注册广播接收器等。
  5. onStop():当Activity完全不可见时调用,用于释放一些资源、停止一些服务等操作
  6. onRestart():当Activity从停止状态重新启动时调用,用于恢复界面数据和状态。
  7. onDestroy():当Activity被销毁时调用,用于释放一些资源、取消注册广播接收器等操作。
  8. startActivityForResult():启动另一个Activity,并等待返回结果。
  9. setResult():设置Activity的返回结果。
  10. finish():结束当前Activity。
  11. getIntent():获取启动当前Activity的Intent。
  12. getWindow():获取当前Activity的窗口对象。
  13. setContentView():设置Activity的布局。
  14. onCreateOptionsMenu()和onOptionsItemSelected():创建和响应菜单项。
  15. setTitle()和getSupportActionBar().setTitle():设置Activity的标题。

Activity相关安全问题

Activity在Android应用程序中扮演着重要的角色,但如果不正确地使用它,可能会导致一些安全问题。下面是一些常见的Activity安全问题及其举例:

  • 拒绝服务攻击:攻击者可以利用Activity的launchMode属性,让Activity在任务栈中重复创建,占用系统资源,从而导致系统崩溃或无法正常工作。
  • 逻辑绕过攻击:攻击者可以通过Intent传递特定的参数,欺骗Activity执行意外的操作,从而绕过应用程序的逻辑检查,造成安全漏洞。
    • 例如,一个需要登录才能访问的Activity,如果没有正确检查登录状态,就可以被攻击者绕过登录验证,直接访问敏感数据或操作。
    • 再例如某二次密码验证可以通过直接打开可导出组件绕过。
  • 任意组件执行攻击:攻击者可以通过Intent传递特定的参数,让Activity执行意外的操作,如启动其他应用程序、调用系统服务等,从而造成安全漏洞。例如,一个需要用户授权才能执行的操作,如果没有正确检查Intent的来源和参数,就可以被攻击者利用Intent欺骗执行,从而执行未授权的操作:
    • 例如LaunchAnywhere
  • 意图劫持攻击:攻击者可以通过恶意软件或社工手段让用户点击链接或下载应用程序,从而欺骗用户启动恶意Activity,执行非法操作,如窃取用户信息、发送短信等。
    • 通常需要阅读Activity接受了intent之后做了一些什么事情,然后构造特定的POC进行攻击

后话 

 本文详细介绍了activity相关知识以及可能存在的安全问题,具体的antivity造成的问题可能要结合具体的场景进行进一步分析了。

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

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

相关文章

这么菜还敢要20K?我还不如直接招个应届生

公司今年要招人&#xff0c;面倒是面了很多测试&#xff0c;但没有一个合适的。一开始想要的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;当然来了更好&#xff0c;提供的薪资在10-20k,来面试的人有很多&#xff0c;但平均水准真的是让人失望。 看简历时很多都写着3…

两数相加(java)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

[github-100天机器学习]day1 data preprocessing

https://github.com/LiuChuang0059/100days-ML-code/blob/master/Day1_Data_preprocessing/README.md#step-6-feature-scaling—特征缩放 数据预处理 数据帧(Data Frame) 二维的表格形式&#xff0c;类似于电子表格或关系型数据库中的表。数据帧通常被用来存储和操作结构化数据…

移动信号灯通信协议-CWAVE-MTFBWY-TSLI 移动式智能路侧系统

1 产品概览 CWAVE-MTFBWY-TSLⅠ型移动式智能路侧系统 &#xff0c;可通过 LTE-V实现与 实现与 车 载设备 及其他路侧设备 进行信息 交互 。该移动式智能路侧系统可根据实际需求 选配 智能交通信号灯 与/或感知检测设备 &#xff0c;其中 可选配 的感知 检测 设备包括 微波 雷达…

随机森林算法介绍及多分类预测的R实现

随机森林&#xff08;Random Forest&#xff09;是一种经典的机器学习算法&#xff0c;是数据科学家中最受欢迎和常用的算法之一&#xff0c;最早由Leo Breiman和Adele Cutler于2001年提出。它是基于集成学习&#xff08;Ensemble Learning&#xff09;的一种方法&#xff0c;通…

数据库选型sql和nosql

一、数据库选型sql和nosql&#xff1a; 1.1关系型数据库sql和非关系型数据库nosql 1.2关系型数据库特点&#xff1a; 数据结构化存储在二维表中 支持事务的原子性A,一致性C,隔离性I持久性D 特性 支持使用SQL语言对存储在其中的数据进行操作 1.3关系型数据库的适用场景&…

pwn(7.3)

Nc 通过nc&#xff0c;我们可以链接到对方的服务器 再用过Linux的命令可以查找到我们想要的信息 Ret2txt 先查壳 没开任何保护&#xff0c;拿IDA看看 很明显的栈溢出&#xff0c;看到/bin/sh地址 解释&#xff0c;通过汇编语言我们知道调用函数使用call命名&#xff0c;c…

HNU-小学期工训-STC-B案例测试作业

对于一些案例&#xff0c;这里列举一些 流水灯 八位数码管动态扫描 八位数码管流水灯(有BSP版本) 八位数码管滚动显示(有BSP版本) 可变亮度的数码管显示(有BSP版本) 扫描频率可改变的电子钟 按键消抖计数(有BSP版本) 三按键测试(有BSP版本) 霍尔磁场检测(有BSP版本) 数…

精通ES+ES大数据查询常见的疑难杂症的解决与实现

目录 什么是BoolQueryBuilder&#xff1f; 简单的复合查询 RestHighLevelClient中的matchQuery与matchPhraseQuery与termQuery的在实际使用中的不同 ES是否能在类型为text的字段的内部使用keyword&#xff0c;如果能这样做的含义是什么&#xff1f; 什么是ES多字段&#xf…

BES 的BLE MTU设置

1 BES BLE MTU 一个默认的MTU大小&#xff0c;通常为23字节&#xff0c;通过协商&#xff0c;可以使用更大的MTU&#xff0c;最高可达512字节&#xff0c; 2 协商方法

leetcode146.手撸 LRU 算法(java)

LRU 缓存 LRU 缓存题目描述LRU 介绍LRU 算法设计代码实现 单调栈算法 LRU 缓存 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/lru-cache 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实…

HNU-小学期工训-STC-B测试记录表

说明1“分类I”为检测电路板硬件测试案例&#xff0c;“分类ⅡI、Ⅲ、IV”为不同层次综合应用案例。"分类1、Ⅱ、Ⅲ”必做&#xff0c;“分类TV”选做。 说明2:“测试/故障现象记录”栏:记录实际测量效果并与案例说明对比&#xff0c;并记录;有故障时&#xff0c;记录所见…

《AutoSar实战》读写DID之一:CDD准备

文章目录 前言一、1.新建DID1&#xff0c;使用 **CANdelaStudio** 软件打开工程中的CDD文件并创建DID1) 创建DID2) 详细配置DID3&#xff09;配置读写服务权限 二、同步更新工具链配置1 更新文件并检查1&#xff09; 更新CDD文件2&#xff09;检查更新结果 总结 前言 本章节主…

大型语言模型与知识图谱协同研究综述:两大技术优势互补

机器之心报道 编辑&#xff1a;杜伟 多图综述理清当前研究现状&#xff0c;这篇 29 页的论文值得一读。 大型语言模型&#xff08;LLM&#xff09;已经很强了&#xff0c;但还可以更强。通过结合知识图谱&#xff0c;LLM 有望解决缺乏事实知识、幻觉和可解释性等诸多问题&am…

记录一下kibana启动连接报错问题(kibana server is not ready yet)

记录一下kibana启动连接报错问题(kibana server is not ready yet) 今天启动kibana出现该问题 先去看了看是否是elasticsearch连接出错 启动了容器 docker start elasticsearch docker start kibana进入了kibana容器 docker exec -it kibana bash进行了下面的操作&#xf…

注册微信小程序平台安装微信小程序开发工具(详细教程)

首先我们先去微信小程序平台注册账号&#xff0c;下面是网址 首页 | 微信开放社区 进入后&#xff0c;使用手机扫描登录&#xff0c;然后&#xff0c;选择小程序&#xff0c;选择个体——填写个人信息——进入到开发者平台&#xff08;相信这里对一个开发者很简单了吧&#xff…

API安全测试检查项小结

现如今开发基本上都是前后端分离&#xff0c;相比前端&#xff0c;后端的测试是最容易发现一些底层bug, 修复成本也低。今天主要聊聊接口的安全测试&#xff0c;以及常见的漏洞。 一、逻辑越权类 可以分为两类&#xff1a;平行越权&#xff1a;权限类型不变&#xff0c;权限对…

单线程JavaScript为何如此高效

什么是js执行机制 JavaScript 的执行机制指的是 JavaScript 代码在运行时的工作方式和顺序。它涉及以下几个关键概念&#xff1a; 单线程&#xff1a;JavaScript 是一门单线程的编程语言&#xff0c;意味着它只有一个主线程用于执行代码。这意味着 JavaScript 中的代码是按顺序…

编程(43)----------ConcurrentHashMap

在多线程中使用哈希表, 首先是不能使用HashMap的. 因为其本身并非线程安全. 与其相反HashTable则是安全的. 其原因在于本身给关键的方法加了锁. 但即便如此, 与HashTable相比, 更推荐使用ConcurrentHashMap. 其原因在于, 它在HashTable的基础上做了较多的优化: 上述提到, Hash…

自从前端用上了低代码,开发速度直接起飞

作为前端工作人员&#xff0c;我们都深知在这个快速发展的时代里&#xff0c;不断学习和掌握前沿技术是至关重要的。随着互联网的不断革新和新兴技术的崛起&#xff0c;我们需要保持敏锐的触角&#xff0c;紧跟潮流&#xff0c;才能在竞争激烈的市场中保持领先地位。 一直以来&…