跳到主要内容

拒绝服务

拒绝服务漏洞利用的是服务对异常输入或高并发请求的处理边界失效:攻击者通过发送精心构造的畸形数据或超量请求,使目标进程崩溃、资源耗尽或永久无法启动,达到中断服务的目的。 与其他漏洞类型不同,DoS 本身不以数据窃取或代码执行为目标——危害就是"停服"。

成立前提

服务在解析用户输入时未做长度/格式/边界校验;或存在可消耗大量资源(CPU/内存/连接数/锁)的接口且没有速率限制;移动端 Android/iOS 组件暴露时无需任何权限即可触发崩溃。

漏洞类型

移动端组件暴露导致 App 崩溃(高频)

Android Activity/Service/Receiver 设置 exported=true 且对接收的 Intent 数据不做校验,第三方 App 发送畸形 Intent 导致目标 App 崩溃:

adb shell am start -n com.target.app/.VulnerableActivity \
--es "url" "hack://evil" --ei "body" 0
# 或发送畸形广播:
adb shell am broadcast -a android.intent.action.RECEIVE \
-n com.target.app/.VulnerableReceiver

常见触发点:getIntent().getParcelableExtra() 未处理类型转换异常、getIntent().getStringExtra()null 上调用方法。影响范围从 App 闪退到进程无法重启。

客户端软件解析畸形文件

媒体播放器、浏览器插件、安全软件在解析用户提供的媒体文件(WAV/MOV/MP3/皮肤文件)时,存在整数溢出、除零异常、缓冲区溢出:

wav 文件 Format Chunk 中 BlockAlign = 0
→ 解析时执行 size / BlockAlign → 除零异常 → 进程崩溃

攻击者将畸形文件发送给目标用户(邮件附件、群内分享),用户打开时触发崩溃。

iOS 特殊字符/内容崩溃

特定 Unicode 字符序列、畸形表情图片、恶意 CSS 样式可触发 iOS 系统级崩溃(Safari、通讯 App、Spring Board 崩溃/重启)。这类漏洞一旦公开,攻击者通过社群/私信传播链接即可批量触发他人手机崩溃。

SQL 注入 + SLEEP 导致数据库 DoS

注入点可执行 SLEEP(9999999)WAITFOR DELAY

  • MyISAM 引擎INSERT/UPDATE/DELETE 执行 SLEEP 会锁表,阻塞该表的所有读写
  • 主从复制:SLEEP 语句传播到从库阻塞同步,依赖主从同步的读业务全部受影响
  • 连接数耗尽:大量慢查询占满数据库 max_connections,新连接被拒绝

安全软件内核驱动崩溃

安全软件(杀毒、防火墙、EDR)的内核态驱动在处理 IOCTL 请求或畸形文件时,若未验证用户传入的输出缓冲区地址合法性,触发内核写访问违规,导致系统蓝屏(BSOD)。攻击目标不是普通应用而是安全软件本身,造成保护失效。

历史样本

Android 第三方 SDK DoS:友盟、百度 Push 等第三方 SDK 的 BroadcastReceiver 暴露,发送特定格式的广播可使所有集成该 SDK 的 App 崩溃,批量影响数千款 App。

iOS 特殊表情崩溃:特定 Unicode 字符组合或特殊图片导致 iOS 系统级崩溃,通过微信群、短信传播一条消息即可让对方手机重启,不需要任何漏洞利用能力。

SQL SLEEP 注入 DoS:注入接口在 MyISAM 表的 INSERT 语句中执行 SLEEP(999999),锁表后整个站点所有依赖该表的请求均返回超时,等效于服务中断。

安全软件驱动 BSOD:360/瑞星/百度卫士等安全产品的内核驱动在处理畸形 IOCTL 请求时内核地址写访问违规,触发 Windows BSOD,可被本地攻击者利用绕过安全软件保护。

推送 SDK 通用 DoS:极光推送(JPush)等第三方推送 SDK 集成于大量商业 App,SDK 内的 Service/Receiver 组件 exported=true 且处理 Intent 时无异常保护,发送特定格式广播可触发所有集成该 SDK 的 App 进程崩溃。一个 SDK 漏洞的影响面覆盖数千款 App,是移动端 DoS 影响范围最广的模式之一。

系统共享 DLL/解析库 DoS:Windows quartz.dll(媒体基础库)在解析畸形 MIDI/媒体文件时发生除零异常,导致调用该库的所有媒体播放器同时崩溃。由于系统 DLL 被大量应用共享,单一漏洞可通过发送特定格式文件(邮件附件、下载链接)批量触发受害者机器上的多款软件崩溃,无需任何权限。

路径穿越删除关键目录:CMS 后台的数据库管理或文件清理接口对路径参数未做白名单校验,攻击者通过 name=../../../app 删除应用根目录或核心配置目录,导致整个应用无法启动,形成持久性 DoS。此类漏洞需要后台访问权限,通常配合弱口令或 CSRF 触发,危害不可逆——文件删除后需运维介入才能恢复服务。

GBK 字符集处理 DoS:部分 PHP 应用的 JSON 解析模块在处理 GBK 编码的宽字节字符时,字符串遍历逻辑错误导致无限循环,请求处理线程被永久占用直到超时,大量此类请求可耗尽 Web 服务器线程池,使服务对正常用户不可用。此类漏洞无需任何认证,一个请求即可锁定一个工作进程。

慢速 HTTP 连接耗尽:嵌入式 Web 服务器(IoT 设备、网络打印机、智能电视)通常只能维持极少量并发连接,且没有请求超时保护。攻击者向目标发送一个合法的 HTTP GET 请求后故意不发送结束标志,保持连接长期存活;重复建立数条此类"永不完成"的连接即可耗尽服务器的连接槽,使所有后续请求被拒绝。与传统大流量 DDoS 不同,这类攻击流量极低,单台设备即可触发。

畸形文件写入启动路径导致持久 DoS:部分桌面应用(电子书阅读器、媒体软件)在首次打开用户提供的文件时,会将其复制到本地用户目录并在每次启动时自动解析其元数据。若文件格式存在解析缺陷,程序在初始化阶段即崩溃,且由于问题文件已持久化到本地,每次重启后崩溃重现——直到用户手动找到并删除隐藏在用户目录中的缓存文件。这类漏洞的危害是持久性的,普通用户难以自行恢复。

IM 消息超长字符串 DoS:即时通讯服务端若未对消息长度设置上限,客户端在渲染超长字符串时可能因 UI 布局计算失控或内存分配失败而卡死乃至崩溃。攻击者发送一条包含数万字符的消息,所有接收并尝试展示该消息的客户端同时受影响;若该消息出现在群组聊天或朋友圈中,每次有新用户打开聊天界面都会再次触发,形成持续性影响。

Intent 携带不可序列化对象触发 ClassCast DoS:Android 应用的 exported Activity 接收 Intent 时,若直接取出 Extra 并强制转型为预期类,而未捕获类型转换异常,攻击者可构造一个包含任意可序列化类对象的 Intent 发送给目标组件,触发 ClassCastException 导致进程崩溃。该模式不依赖空指针,绕过了部分仅针对空值的防护,且第三方支付 SDK(如 UnionPay PayActivity)集成于大量宿主 App,一个 SDK 漏洞即可跨 App 批量触发。

浏览器 JavaScript 字符串扩增内存耗尽:浏览器在执行 JavaScript 时若不限制单次内存分配,攻击者可通过循环拼接字符串构造超大字符串(数十 MB 至数百 MB),传入 window.open() 等接口引发缓冲区越界写入或内存耗尽,导致浏览器进程崩溃。攻击者将含有此类脚本的页面托管在公开 URL 或以二维码传播,受害者访问即触发,无需任何交互。

Android 竞态 fork 炸弹 DoS:恶意 APK 无需 root 权限,通过暴力 fork 子进程并持续占用设备文件描述符,触发多个系统级共享库在资源申请失败时的异常处理缺陷,导致系统进程以雪崩方式批量崩溃,整个 Android 系统陷入 DoS 状态。此类攻击不依赖任何已知漏洞,仅利用系统正常调用接口,且不申请任何敏感权限,普通应用商店检测难以识别。

Linux 内核 isofs 死循环:Linux 内核处理带 Rock Ridge 扩展的 ISO 镜像文件时,若将 CE 类型 Entry 的扩展偏移量指向其自身,内核 parse_rock_ridge_inode_internal 函数会陷入无限循环,导致内核线程永久占用 CPU 直至系统无响应。攻击者只需构造一个特殊 ISO 文件并诱使目标系统挂载(如通过自动挂载策略或共享存储),即可触发内核级 DoS,无需任何用户态权限。

MITM 配置文件污染导致持久性 DoS:客户端软件通过明文 HTTP 请求远程配置文件时,中间人可劫持响应,向本地配置文件持续写入大量无效数据使其膨胀至数百 MB;由于程序每次启动时都会先读取该配置文件,文件过大导致初始化超时或内存耗尽,程序永远无法正常打开。与一次性崩溃不同,此类攻击效果在配置文件被手动删除前持续存在,且用户不会看到任何报错提示,仅感知到"打不开"。

WAF 组件超长参数 ReDoS:安全软件或 WAF 在对请求参数执行正则检测时,若规则存在回溯放大路径,攻击者可构造包含特定重复字符序列的超长参数(如数百个相同字符后接一个不匹配字符),触发正则引擎指数级回溯,使 WAF 工作进程 CPU 长期跑满,导致被保护站点返回 503。此攻击流量极低、单请求即可触发,且绕过了基于流量阈值的 DDoS 防护。

安全软件自身成为 DoS 入口:WAF 或安全防护软件在处理特定畸形请求时自身进程崩溃,不仅使被保护站点失去防护,还导致站点对外返回错误状态。安全设备的处理逻辑缺陷被反向利用,防护层本身变成攻击面。

PHP 框架模板渲染崩溃:PHP Web 框架在渲染模板时对特殊字符处理存在缺陷,发送包含特定字符组合的请求触发框架进程崩溃。由于缺陷存在于框架核心渲染路径,所有使用该框架特定版本的站点均受批量影响。

Android Service 无实现暴露崩溃:Android 应用将 Service 组件配置为 exported=true,但 Service 内部没有具体业务实现,第三方应用通过发送 Intent 调用该组件时触发未处理异常,导致宿主 App 进程崩溃。已声明但无实现的暴露组件是 Android DoS 的常见根因之一。

桌面软件恶意任务 URL 崩溃:桌面媒体软件在解析特定格式的下载任务地址时触发内部异常,攻击者将构造好的恶意任务 URL 通过私信或群组发送给目标用户,用户在软件中打开该任务即触发崩溃,无需任何额外权限。

系统桌面(Launcher)持久崩溃:普通应用无需任何敏感权限,通过触发系统 Launcher 组件的未保护路径,使系统桌面持续崩溃且无法正常重启。危害是持久性的——每次设备重启后桌面仍继续触发崩溃,用户无法通过重启恢复正常使用。

框架补丁引入批量 DoS:通用 Web 框架或系统组件在版本更新后,新增的配置项或 Filter 逻辑引入了可被触发的 DoS 路径。由于大量部署站点统一使用相同版本,单一漏洞通过批量扫描可同时影响使用该版本的全部站点,补丁发布本身成为批量漏洞的分发机制。

跨浏览器通杀 URL 崩溃:特定链接在某一移动平台上触发系统级解析异常,导致该平台上所有主流浏览器(包括系统自带及第三方浏览器)在访问时同时崩溃。原本用于安全测试的链接,其副作用成为跨浏览器 DoS 载体,传播成本极低。

IoT 设备超长 HTTP 请求崩溃:消费类智能设备(智能电视、家用网关)内置的轻量 Web 服务在处理超长 HTTP GET 请求时服务崩溃,且缺乏自动重启机制。攻击者在局域网内即可触发,消费类 IoT 设备普遍缺乏请求长度校验是此类漏洞的共性根因。

金融安全驱动内核 DoS:银行客户端为保护输入法安全而安装的内核态驱动,在挂钩处理过程中未校验用户态传入地址的合法性,触发内核写访问违规导致系统蓝屏。拥有普通用户权限即可触发,且多家银行客户端使用同类驱动实现,模式高度一致。

媒体文件格式缺陷社工 DoS:媒体播放器解析特定容器格式文件时,因关键元数据表缺失或字段异常触发未处理异常导致进程崩溃。攻击者将精心构造的媒体文件通过即时通讯工具或邮件发送给目标,用户打开文件即触发崩溃,不依赖网络接口,属于纯客户端攻击面。

AV 云防御断网 + 系统 DLL 重命名失效:通过 ipconfig /release 断开网络使安全软件云防御失效,同时将系统关键 DLL 重命名使其在重启后无法加载,安全软件主防进程因缺少依赖而无法启动。将这两步操作打包为自解压可执行文件,单次运行即完成攻击前置条件,后续恶意程序在无防护状态下执行。此模式对多款主流安全软件均有效,共用同一系统级依赖是漏洞的根源。

磁盘强制卸载杀死安全软件主防:对安全软件所在磁盘分区执行 chkdsk /x 强制卸载该分区,安全软件的托盘进程因所在分区被卸载而异常退出,主防完全失效。无需任何提权或内核操作,单条命令即可复现,且适用于将自身安装在非系统盘的多款安全软件。

安全软件防护模块导出函数直接调用停止:安全软件的核心防护模块以 DLL 形式存在,且对外导出了 Stop 等控制接口。普通进程直接 LoadLibrary 加载该模块并调用导出函数,即可停止安全软件的所有防护功能,无需注入或提权。防护模块设计上将控制接口以公开导出函数形式暴露,使得任何本地进程均可调用。

安全软件守护进程被 API 注入绕过:通过 VirtualAllocEx 在安全软件守护进程空间分配可执行内存并写入 Shellcode,再以 CreateThread 触发执行,使守护进程自行关闭保护。攻击者不需要强行终止受保护进程,而是借助系统 API 让守护进程"自杀",绕过了进程保护对外部 TerminateProcess 调用的拦截。

Android 暴露 Receiver 广播注入空指针崩溃:Android 应用的 BroadcastReceiveronReceive 中直接对 Intent 传入的数据调用字符串或对象方法,未处理 null 值场景。通过 adb shell am broadcast 发送不携带必要字段的广播,组件在取值后立即触发空指针异常,导致应用进程崩溃。此类组件往往在开发测试阶段遗留,正式发布时未移除 exported 属性。

drozer 工具触发暴露 Activity 崩溃:使用 drozer 安全评估框架对目标 Android 应用进行攻击面枚举,识别出 exported=true 的 Activity/Service/Receiver 组件后,直接启动这些组件并传入畸形参数,触发未处理的类型转换或空指针异常。通过一条 drozer 命令即可批量验证所有暴露组件的崩溃路径,工具化使得 Android DoS 漏洞的发现和利用门槛极低。

特殊 Unicode 字符序列触发多 App 通杀崩溃:特定阿拉伯语字符与组合变音符号的序列触发 iOS 系统文本渲染引擎异常,所有在界面上展示该字符串的 App(短信、邮件、即时通讯等)均会立即闪退。受害者收到含有该字符串的短信后,短信列表界面本身也持续崩溃,直到通过特定恢复步骤删除对话才能解除。单条消息可同时影响系统中所有文本渲染路径,是 iOS 端影响范围最广的 DoS 模式之一。

Android WebView 渲染 CSS expression 导致客户端崩溃:Android 应用内嵌的 WebView 在渲染含有 IE 私有 expression() CSS 语法的页面时,JavaScript 引擎反复执行表达式求值逻辑,引发内存异常导致 WebView 进程崩溃,宿主 App 随之退出。论坛、社区类应用允许用户发布富文本内容,若未对 HTML/CSS 进行过滤,攻击者发布一条帖子即可使所有浏览该帖子的用户 App 崩溃。

媒体解码库符号扩展绕过长度校验导致栈破坏:媒体播放器解码库从文件读取单字节数据后,通过符号扩展将其转换为 32 位有符号整数,产生类似 0xFFFFFFFF 的负值。后续将该值作为数组索引进行写操作时,边界检查因值为负数而被绕过,导致栈上指针数据被覆写。攻击者构造含有特定字节值的媒体文件即可触发,本质是符号位处理遗漏导致有符号/无符号转换缺陷。

内核驱动写无效内存地址引发蓝屏:安全工具的内核态驱动(.sys 文件)在处理 IOCTL 请求时,将用户态传入的指针直接用于内核内存写操作,未通过 ProbeForWrite 验证地址合法性,导致对无效内核地址的写操作触发 PAGE_FAULT_IN_NONPAGED_AREA 蓝屏。本地普通用户通过构造特定 IOCTL 调用序列即可复现,且崩溃点精确指向驱动写操作指令,无缓解措施时可进一步发展为提权利用。

App 未实现废弃 Service 暴露崩溃:Android 应用的 AndroidManifest.xml 中声明了某些 Service 并设置了 Intent Filter,但这些 Service 在代码中实际已不存在对应实现。外部应用发送匹配 Action 的 Intent 启动这些 Service 时,系统找不到对应类,触发 ClassNotFoundException 导致应用进程崩溃。此类"僵尸组件"是版本迭代过程中遗留的,仅需清理 Manifest 即可消除。

皮肤/主题文件堆溢出 DoS:桌面媒体播放器加载用户提供的皮肤文件(ZIP 格式内含 XML 配置)时,对 XML 字段值长度不做校验,直接复制到固定大小的堆缓冲区,触发堆溢出导致进程崩溃。攻击者只需修改皮肤压缩包中的 XML 字段为超长字符串再重新压缩,诱使用户执行换肤操作即可触发,与媒体文件 DoS 的区别在于攻击载体是皮肤/主题文件而非音视频内容本身。

视频播放器 MP4 Box 字段篡改 DoS:MP4 文件由嵌套的 Box 结构组成,播放器在解析 stsz Box(sample 大小表)时未校验字段合理性,将篡改后的极大 sample size 值直接传入堆分配函数,触发"extreme size request"验证终止,进程崩溃。构造畸形 MP4 文件仅需修改少量字节,结合媒体分享或下载即可触发客户端 DoS,不需要任何权限。

下载客户端 HTTP 重连风暴 DoS:下载软件在 HTTP CONNECT 请求被代理或防火墙拒绝后,以极短间隔(毫秒级)无限重新发起连接,导致本地网络出口连接数被快速耗尽,其他应用的网络请求全部受阻。此类漏洞无需攻击者主动操作,仅需使下载软件遭遇连接拒绝场景即可触发;根本原因是客户端未实现退避重试机制(指数回退或最大重试次数限制)。

浏览器插件 ActiveX 属性无长度校验 DoS:浏览器安全插件以 ActiveX 控件形式提供,控件属性(如字体名、颜色等)在内部声明了固定长度的字符数组,但赋值时未调用长度校验,通过 VBScript/JavaScript 将超长字符串赋给属性即可触发缓冲区溢出导致浏览器进程崩溃。受影响的属性通常不止一个,攻击者构造含有 ActiveX 实例化和超长属性赋值的网页,受害者访问即触发,且因控件安装于用户本地,修复依赖用户主动更新插件。

安全软件傀儡进程借壳绕过自保护 DoS:安全软件的进程保护对外部进程发出的终止/修改请求进行拦截,但对自身模块运行的同名进程信任度更高。攻击者以安全软件自身的某个二进制文件为载体创建傀儡进程,向目标主进程传递特殊参数(如禁用自我保护标志),主进程信任同源调用并弹出关闭确认界面,后台程序再模拟鼠标点击确认按钮,最终调用系统 taskkill 终止所有防护进程。整个过程绕过了基于进程来源的拦截机制,因为执行终止操作的是安全软件自己的进程。

输入法 exported Activity 空指针崩溃 DoS:系统输入法将词典设置页面(DictionarySettingsActivity)声明为 exported,但该 Activity 在初始化时依赖未经绑定的客户端连接 ID(mClientId),直接启动时该字段为 null,后续代码在 null 上调用方法触发空指针异常,导致输入法进程崩溃。受影响期间系统所有文本输入框均不可用,对需要键盘输入的操作形成 DoS;该漏洞通过一条 adb am start 命令即可复现,也可通过网页 intent 链接远程触发。

移动系统 UI 悬浮窗触发持久重启 DoS:特定厂商 ROM 对系统悬浮窗类型的处理存在缺陷,普通应用申请添加特定参数组合的悬浮窗视图时触发系统 UI 进程崩溃,进而引发整机重启。若攻击应用同时注册为开机自启,每次重启后自动重新触发崩溃,设备陷入无限重启循环;用户无法通过正常操作恢复,需要借助 ADB 或刷机才能解除,危害持久且难自救。

论坛/社区 App WebView UGC 内容触发 CSS 崩溃:游戏盒、论坛类 App 内嵌 WebView 展示用户发布的帖子内容,若 UGC 过滤不严,攻击者在帖子中插入含有旧版 IE 私有 CSS 语法(如 expression())的 img 标签,所有使用该 App 浏览该帖的用户均触发 WebView 崩溃并退出 App,无需任何账号权限,一条帖子即可批量影响所有查看者,帖子删除前持续触发。

应用线程强制终止竞态空指针崩溃:桌面 IM/客户端软件在自动更新或后台校验流程中使用多线程,若外层逻辑在线程完成共享数据初始化前调用 TerminateThreadSuspendThread 强制停止工作线程,导致共享对象处于半初始化状态,后续访问该对象的代码触发空指针崩溃。此类漏洞在正常使用中偶发,但特定网络条件或操作时序下可稳定复现;根本原因是线程生命周期管理未使用同步对象协商退出,而是依赖外部强制终止。

Intent Scheme 远程触发暴露组件 DoS:Android 应用的 exported Activity 除了可被本地其他 App 启动外,还可通过浏览器中的 intent:// 链接远程触发——攻击者在网页中放置一个构造好的 intent:// 超链接,用户点击后浏览器直接解析并启动目标 App 的指定 Activity,若该 Activity 对传入数据不做校验则立即崩溃。与本地 drozer 利用不同,此方式无需攻击者接触目标设备,只需诱导受害者访问一个网页即可远程触发 DoS。

测试调试接口遗留生产版本 DoS:App 在开发阶段为方便测试支付流程或初始化逻辑,会在代码中保留若干测试用的 Activity,这些 Activity 未做任何前置状态检查,直接启动会因必要数据未初始化而崩溃。发布版本未清理这些组件,且保留了 exported=true 设置,攻击者枚举组件名称后直接启动即可触发崩溃。一个 App 中此类"测试残留组件"往往不止一处,逐一枚举可发现多个独立的 DoS 路径。

第三方 SDK 缺少布局资源文件崩溃:宿主 App 集成第三方支付或功能 SDK 时,若 SDK 引用的布局文件未被完整打包进 APK,SDK 内部的 Activity 在 setContentView() 时触发 NotFoundException 导致进程崩溃。此类问题由集成不完整引起,与代码逻辑无关,攻击者直接启动该 SDK Activity 即可触发;由于许多 App 集成同一 SDK 版本,单一 SDK 的打包缺陷可批量影响所有集成方。

视频解码器 API 返回值未校验堆破坏 DoS:媒体播放器在解析特定格式视频时,调用系统 API 分配图像对象,若文件中的宽度参数异常导致 API 执行失败并返回 NULL,后续代码未检查返回值而直接对 NULL 句柄调用 GetObject 获取结构体。由于结构体本身也未初始化,成员值来自上一个栈帧的残留数据,后续以这些不可预测的值为参数传入堆分配函数,产生超大内存请求导致堆破坏崩溃。攻击者只需在视频文件中设置一个异常的帧尺寸字段即可触发,根本原因是解码器对 API 失败路径没有防御性编程。

IM 语音消息特殊格式触发客户端崩溃:即时通讯软件在解析包含媒体标签(如语音播放按钮)的特殊格式消息时,消息渲染逻辑对标签内嵌的 URL 或参数不做合法性校验,直接传入内部媒体处理模块触发异常,导致客户端崩溃。攻击者在对话框中发送构造好的消息,接收方查看消息列表或点击播放按钮时触发崩溃;若多个版本共享同一渲染路径,影响面覆盖所有使用该版本的用户。

浏览器重复打开同一文件触发崩溃:浏览器在同一窗口中通过拖放方式多次加载同一本地文件(如 XML)时,若解析器对已加载文档的状态管理存在缺陷,第二次拖放会触发对已释放或未完全清理的内部对象的访问,导致浏览器进程崩溃。此类漏洞在正常使用中偶发,但操作步骤极为简单,攻击者无需构造特殊文件,仅凭两次拖放操作即可稳定复现。

Web 应用默认安装后无限 fork DoS:部分 Wiki、CMS 类 Web 应用在默认安装状态下,未对请求触发的服务器端进程创建行为设置任何限制,攻击者通过发送批量请求触发大量 fork 子进程,在短时间内耗尽服务器进程表和内存,导致宿主机宕机或无法响应任何请求。与针对应用层的 DoS 不同,此类攻击直接作用于操作系统层面的进程资源,影响该服务器上运行的所有应用;默认安装未启用速率限制或进程沙箱是此类漏洞的共性根因。

系统广播 Action 监听路径无空值校验崩溃:Android 应用的 exported Receiver 注册监听系统级广播 Action(如应用安装完成通知),在回调中直接调用 getDataString()getIntExtra() 而不做空值判断。任何 App 或系统本身广播该 Action 时都会触发这条代码路径;攻击者无需伪造数据,只需发送一条匹配 Action 的空广播即可触发空指针崩溃。与直接发送畸形 Extra 不同,此类漏洞依托系统正常广播机制触发,触发条件更自然,普通手机用户在正常使用过程中也可能意外激活。

支付 SDK 广播自定义类强转崩溃:支付类 SDK 的 exported Receiver 在 onReceive 中直接将 Intent 的 Extra 字段强制转型为 SDK 内部自定义类(如推送消息对象),未添加任何异常捕获。外部应用发送一条不携带该字段的广播,强转操作因类型不符而抛出 ClassCastException,宿主 App 进程崩溃。此类 SDK 被大量电商、票务、出行类 App 集成,单一 SDK 漏洞批量影响所有宿主。

安全软件注册表防护遗漏"开始菜单启动文件夹":安全软件对注册表 Run 键进行监控以阻止恶意开机启动项,却未覆盖"开始"菜单中的"启动"文件夹。攻击者将批处理文件复制到该文件夹,系统重启后自动执行,在无防护状态下完成后续操作。此绕过方式无需任何注册表操作,系统原生支持,且批处理可在重启后执行 taskkill 终止安全软件进程,实现防护完全失效。

安全软件禁止启动项持久 DoS:通过系统服务管理器或策略将安全软件的服务启动类型设置为"已禁用",安全软件在每次系统启动时均无法自启,主防进程永远不会运行。此攻击不终止已运行的进程,也不修改任何软件文件,仅操作系统级服务配置,对多款安全软件均有效,且普通用户极难察觉——任务管理器中看不到被终止的进程,只是安全软件"从不出现"。

动态插件代理 Activity 初始化崩溃:采用动态加载框架的 App 存在一类代理 Activity(DLProxyActivity),用于在运行时加载插件并调用其 onCreate()。若该代理 Activity 被配置为 exported,直接从外部启动时宿主环境未完成插件上下文初始化,代理调用插件生命周期方法时访问未初始化的上下文对象触发崩溃。大型电商或工具类 App 中多个动态加载组件共享同一代理实现,攻击者枚举不同代理名称可发现多条独立崩溃路径。

内核驱动 ProbeForWrite 未置于 try/except 致系统崩溃:安全软件内核驱动从用户态 IOCTL 输入缓冲区取出一个 DWORD 并将其作为地址传入 ProbeForWrite 进行可写性验证,但该调用未包裹在 try/except 块中。当用户态传入的地址不合法时,ProbeForWrite 抛出未对齐或访问违规异常,因缺乏异常处理直接向上传递至系统,触发 PAGE_FAULT 蓝屏。与"直接写无效地址"不同,此处问题在于验证函数本身的调用缺少防护,即使意图正确也因使用姿势错误引发崩溃。

覆盖安装重置安全软件管控密码:安全软件企业版设置了退出密码和卸载密码以防止终端用户绕过管控,但密码存储于本地客户端且在覆盖安装时以安装包默认值为准。攻击者使用不携带服务器地址的单机版客户端覆盖安装企业版,安装完成后密码自动重置为默认值,随后用默认密码即可正常卸载或退出主防。此攻击不需要任何代码注入或内核操作,完全基于正常安装流程,危害是彻底移除终端安全防护。

业务逻辑 Receiver 遗漏权限收紧:应用自身的业务功能组件(健康数据同步、久坐提醒、消息推送回调等 BroadcastReceiver)在开发阶段为方便测试而设置了 exported=true,发布时未清理。这些组件在 onReceive 中直接调用业务逻辑,未对 Intent 携带的数据做空值保护,第三方应用发送不带任何 Extra 的空广播即可触发空指针崩溃。与 SDK 组件不同,此类组件属于应用自身业务代码,影响仅限单一 App,但暴露的 Receiver 往往不止一个,逐一枚举可发现多条独立崩溃路径。

开机广播监听 SDK 组件空值崩溃:第三方统计或推送 SDK 注册了 BOOT_COMPLETED 广播监听器以实现开机自启或数据上报,组件同时标记为 exported。由于 SDK 在 onReceive 中直接取用广播附带的数据而未判空,攻击者手动发送匹配 Action 的广播可在任意时刻触发崩溃,无需等待设备重启。系统开机广播与攻击者手动广播对组件而言完全等价,开机触发场景只是触发时机之一。

WebView 容器 Activity 直接暴露崩溃:移动应用通常用一个通用 WebView 容器 Activity(命名如 WebBaseActivityWebViewActivity)承载所有内嵌网页,并将其声明为 exported=true 以支持应用内跳转。该 Activity 在 onCreate 中立即读取 Intent 传入的目标 URL 或会话 Token,未做空值保护;外部直接启动时这些字段为空,后续代码在空对象上调用方法触发崩溃。WebView 容器作为全应用的页面入口复用率极高,且一旦崩溃路径确认,相同模式在同类应用中普遍存在。

安全软件驱动 IOCTL 借助进程注入触达内核蓝屏:安全软件的内核驱动将设备接口访问权限限制在自身守护进程,普通进程直接发送 IOCTL 请求会被拒绝。攻击者先通过 VirtualAllocEx 和远程线程将代码注入安全软件的可信进程,再在该进程上下文中向驱动发送特定 IOCTL,绕过访问控制触达未加防护的驱动代码路径。驱动在处理该 IOCTL 时将用户传入的指针直接用于内核写操作,触发 PAGE_FAULT 蓝屏。此模式将进程注入与内核驱动漏洞链式组合,单独的访问控制不足以构成完整防御。

记账/电商 App 残留测试支付 Activity 崩溃:金融和电商类 App 在开发测试阶段保留了模拟支付初始化流程的 Activity,该 Activity 直接调用支付 SDK 的初始化链路,假设所有必要参数已由前序页面填充。正式发布时该组件未被移除且保留 exported=true,直接启动时因无前序初始化上下文,支付流程在取用空引用时崩溃。此类测试遗留组件在大型应用中往往同时存在多处,且每处对应支付流程中的不同节点,可逐一触发形成多个独立崩溃路径。

推送 SDK exported Activity 直接启动崩溃:第三方推送 SDK 除暴露 BroadcastReceiver 外,还将推送落地页(如 PushActivity)声明为 exported=true 的 Activity,该 Activity 启动时立即读取 Intent 附带的推送消息数据,直接启动时因无消息上下文触发空引用崩溃。与 Receiver 模式不同,攻击者可通过 adb am start 或网页 intent:// 链接远程触发,且大量集成同一 SDK 的 App 共享同一崩溃路径,单一 SDK 暴露的 Activity 与 Receiver 共同构成更完整的攻击面。

安全软件退出密码依赖开机启动配置:安全软件的退出密码验证逻辑与"是否开机启动"的配置项耦合——取消勾选开机启动选项会导致服务启动类型变更,进而绕过密码保护直接退出主防。该缺陷不需要任何代码执行,仅通过软件自身的 UI 选项即可触发;攻击者随后可进一步通过服务管理器将安全软件标记为"禁用",使其在每次系统启动后永不运行,实现持久性防护失效。

单一 App 多路径 DoS 共存:大型商业 App 在同一版本中往往同时存在多种独立的 DoS 路径——测试遗留的支付 Activity、第三方 SDK 的 Activity 布局缺失、监听系统广播的 Receiver 空值未校验、动态加载代理组件初始化崩溃。各路径的根因各不相同,修复任意一处不影响其他路径的可利用性。安全评估时对同一 App 进行全面攻击面枚举,可在单次测试中发现数条彼此独立的崩溃路径,每条路径都能单独触发 DoS。

内核驱动从输入缓冲区偏移提取指针未验证:安全驱动处理 IOCTL 请求时,不直接将 InputBuffer 地址本身视为用户指针,而是从 InputBuffer 内部特定偏移处读取一个 DWORD 并将其作为内存地址传入 ProbeForWrite。由于该偏移处的值完全由用户态控制,且 ProbeForWrite 调用未置于 try/except 中,传入任意非法地址即可触发数据对齐异常(ExRaiseDatatypeMisalignment)导致蓝屏。此模式与"直接用 InputBuffer 地址写内存"不同,漏洞根因在于对缓冲区内嵌指针的间接提取缺乏验证,代码审计时容易遗漏。

防御控制点

  • Android 组件最小化暴露:无跨 App 通信需求的组件设置 exported=false;接收 Intent 数据时做类型检查和异常处理
  • 媒体文件解析健壮性:使用系统级安全沙箱处理用户提供的媒体文件;对长度字段做边界校验,防止整数运算异常
  • SQL 注入防御:参数化查询从根本上消除注入路径;同时在应用层限制查询超时时间
  • 连接数/速率限制:数据库设置单用户最大连接数;接口层限制单 IP/单账号的请求频率
  • 内核驱动安全审计:IOCTL 处理前验证用户态缓冲区地址合法性;使用 ProbeForRead/ProbeForWrite