CVE-2026-49881漏洞复现"

admin 2026-11-04 00:20:36 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

CVE-2026-49881 漏洞复现

太初众测
太初众测

太初众测

2026年11月3日 15:30
山东

去阅读

CVE-2026-49881 漏洞复现

本文基于 LSPosed 团队公开 writeup、上游补丁 commit、公开 PoC 源码与实机复现整理。复现环境为 Android 17 模拟器(AVD lsp37 / google\_apis arm64 / SPL 2026-08-05),复现全程在 SELinux Enforcing 下完成,实测普通 App 代码以 system\_server(uid 1000)身份执行,并通过注入把 Shellcode 送进 networkstack 进程(uid 1073)。

01 漏洞介绍

CVE-2026-49881 是 Android Telecom 组件 InCallController.java 中的一个逻辑错误导致的任意代码执行,由 LSPosed 团队(canyie)于 2026 年 7 月 23 日报告 Android 安全团队(被告知为重复漏洞),随 2026-09-01 安全公告修复。它自身即可让普通 App 获得 system\_server(uid 1000)内的任意 Java 执行;与 3 个月前公开的内核漏洞 CVE-2026-43284(DirtyFrag)组合后,可完成从普通 App 到 root 的完整提权并关闭 SELinux——这正是LSPosed公开的完整提权链 LSPromise 的形态。

针对车联网在采用 Android Automotive OS 的智能座舱、车载娱乐主机、T-BOX 与域控制器中,这构成“应用层立足 → 系统最高权限进程”的关键一跃。

一句话概括:一个为防系统崩溃而加的“类存在性检查”,让一个普通 App 的代码以 Android 系统最高身份进程 system\_server 的名义执行——全程无内存破坏、无竞争条件、成功率 100%。

项目 内容
CVE 编号 CVE-2026-49881(Telecom serviceClassExists ACE,LSPromise 链Stage-1)
漏洞类型 逻辑错误导致任意代码执行(CWE-269)
影响组件 packages/services/Telecomm InCallController.java 的 serviceClassExists()
引入时间 Android 17 新引入,commit478761578b3ccb380410a4f5e82e1d0e388d59cf
披露时间 2026-07-23 报告,2026-09-01 安全公告修复
修复 commit 668eb07260ec(Remove serviceClassExists logic)
危险特性 无内存破坏、无竞争条件、无需用户交互、无需额外权限、SELinux Enforcing 下可用、成功率 100%

它最反常的一点:这是一段“防崩溃”代码——注释白纸黑字写着“防止清单声明了 Service 但类没编进去导致系统崩溃”,结果却用系统最高身份、以忽略安全的方式执行了不可信 App 的代码;上游的修复方式是把整段逻辑直接删掉。

02 影响范围

两个条件同时成立即受影响:

  1. 设备运行 Android 17 初始版本,安全补丁级别(SPL)早于 2026-09-01;

  2. 攻击者能以普通应用形式获得立足点(恶意应用、被污染的分发渠道、产线/调试接口预装)。

• 受影响:Android 17 初始版本全设备(含 Pixel 10 首发镜像,2026 年 9 月补丁前均可触发);运行 QPR beta 的设备当时已修复;

• 不受影响:Android 16 及更早版本(该代码是 Android 17 新引入,无历史包袱)、已升级 2026-09-01 及之后补丁级别的设备。

自检命令(adb):

在车联网场景中:

车载座舱与T-BOX若基于 Android 17 且补丁基线滞后(车载 OTA 周期通常以季度计,远超手机),即处于受影响面内;攻击链前提是攻击者先以某种方式装上恶意应用。对封闭系统(不开放应用安装、只读根文件系统),本漏洞不构成入口。

03 修复建议

唯一可靠手段: 把平台补丁级别升级到 2026-09-01 或更新(Telecom 洞在该公告中修复)。

没有可靠的临时缓解手段:Telecom 是系统核心组件无法禁用,补丁前无任何配置级开关。补丁空窗期内可做的:

• 车端/终端应用安装管控收紧(白名单商店、禁止侧载),直接抽掉攻击前提;

• 审计清单中声明android.telecom.CLASS\_EXISTENCE\_CHECK meta-data 的应用——正常应用没有任何理由设置这个标志,出现即高度可疑;

• 关注 logcat 中 serviceClassExists check(INFO 级)的异常出现,它几乎是该漏洞触发时留下的唯一痕迹。

04 漏洞原理分析

4.1 专业术语背景介绍

术语 解释(在漏洞中的角色)
Telecom / InCallService Android 电话组件与其插件接口;恶意 App 声明一个带特定 meta-data 的 InCallService,即成为本漏洞的入口
serviceClass Exists() Android 17 新增的“类存在性检查”:防止清单声明了 Service、代码里却没编译进去导致崩溃——本漏洞本体
ONTEXT\_INCLUD E\_CODE \ CON TEXT\IGNORE\ SECURITY
AppComponent Factory 应用可在清单中自定义的“组件工厂”类;创建 ClassLoader 时它比一切应用代码都先被实例化——防护判断错了时机
Class.forName (name, false, loader) 第二个参数 false 表示“不初始化类”;但拦不住实例化发生在更早的工厂类里
sharedUserId= \"android.uid. system\" 让 Telecom 包以系统用户(uid 1000)运行——检查代码的“身份来源”
android:process =\"system\" 让Telecom 跑在 system\_server 进程内——代码执行的“宿主”
system\_server Android 系统中权限最高的用户态进程;在这里执行 Java 代码等于“系统身份”

关键背景点:createPackageContextAsUser(...,CONTEXT\INCLUDE\_CODE | CONTEXT\

IGNORE\_SECURITY) 是Android明文标注危险的API组合——它意味着“以我的身份加载并运行对方应用的代码”。这段API出现在任何系统身份组件里,都等于把执行权拱手让人。

4.2 漏洞原理与根因分析

正常流程:系统绑定 InCallService(第三方通话界面/呼叫处理能力)前,要扫描候选服务。Android17的 Telecom 担心“清单里声明了 Service、apk 里却没这个类”导致崩溃,新增了一道“存在性检查”(commit 478761578b3c)声明了特定 meta-data 的服务,先验证类存在,不存在就跳过。

缺陷代码

(android-17.0.0\_r1,InCallController.

java 2603-2627 行,调用方2644-2663 行):

为什么 false拦不住:三行代码三层叠加:①标志组合让系统加载目标 App 的代码并忽略安全检查;②恶意 App 在清单里给 InCallService贴上CLASS\EXISTENCE\

CHECK=true标签,强制 Telecom 走这个检查;③ Telecom 包声明了 sharedUserId=\"android.uid.system\"、process=\"system\"

(AndroidManifest.xml 第 93 行),这段检查代码运行在 system\_

server 里。而 Class.forName(..., false, ...) 的 false 只能阻止“目标类被初始化” 但 getClassLoader() 会实例化 App在清单中声明的 AppCom-ponentFactory,其静态块随即以system\_server身份

执行。防护判断错了时机:要拦的“初始化”发生在它以为的防线之前,等Class.forName被调用时,攻击者代码已经跑完了。

根因一句话: 一个为防崩溃而加的存在性检查,用系统最高身份、以忽略安全的方式加载了不可信代码,且类加载机制保证 AppComponentFactory 的代码必然先于检查执行。

修复(commit 668eb07260ec)的思路正对病根:直接删除整个 serviceClassExists 逻辑——病根就是“不该用 INCLUDE\_CODE 加载不可信包”,无药可救只能摘除。

漏洞原理与利用链

(红框为两个漏洞本体;组合链至 root 的

实测见 4.5 节)

4.3 白话介绍

把 Android 系统想象成一栋管理严格的写字楼,system\_server 是总控室,里面的人可以调度全楼。CVE-2026-49881是前台新装的一道“来访确认”工序:前台姑娘担心有人登记了公司名字、人却根本没入职,会让大楼出洋相,于是规定——凡是贴了一种特殊标签的访客登记表,她要亲自核实公司是否真实。核实方式倒也直接:把访客的档案册翻开,对照看一眼。

坏就坏在两点。第一,她翻档案册时,用的不是楼道里的公共复印机,而是总控室自己的印鉴——按楼规,这套流程跑在总控室里。第二,访客早料到她会翻:登记表里夹着一张“公司简介”,而这份简介的封皮是特制工艺的——前台的档案册一碰到它,封皮里的机关就自动弹开,里面的指令单立刻以总控室的名义生效。更妙的是,指令单生效的时机在“对照看一眼”之前:等姑娘真正开始核对名字时,该办的事早就办完了。事后问她做了什么,她只会说“我确认了一下这家公司存不存在”。

结果就是: 一个连门禁卡都没有的访客,贴一张标签、递一份档案,就让总控室替他按了手印——没砸锁、没翻墙、没留痕迹,全靠一道“好心办坏事”的确认流程。

4.4 攻击场景与触发条件

触发前提(漏洞层面): Android 17 初始版本且 SPL 早于 2026-09-01;攻击者能以普通 App 立足(仅需常规安装权限,无需任何危险权限申请)。

隐蔽前提(利用层面): 无内存破坏、无竞争,内存布局与内核版本均无关;触发点是 Telecom 扫描 InCallService 候选的既有流程,App 侧无额外交互动作。

典型攻击场景:

• 恶意应用伪装成正常车机/手机 App 上架,装机后在系统处理呼叫相关流程时自动触发,以 system\_server 身份读写系统私有数据、操纵其他进程;

• 与浏览器/渲染器漏洞组合(如 IonStack 用 Firefox JIT + GhostLock),实现“点一个链接 → system\_server 内执行”;

• 物理接触场景(维修、产线、调试口)预装应用,直接获得 system 域执行能力。

绕过能力:无内存破坏意味着 KASLR、MTE、CFI、堆缓解全部无关;代码在 system\_server 的 SELinux 域内“合法”执行,SELinux 不构成拦截;触发时只留一行 INFO 级日志 serviceClassExists check,检测面近乎为零。单独本洞到不了 root——system\_server 域被 SELinux 禁止加载 native 库、禁止匿名可执行内存;LSPromise 用它的方式是反射注入把代码送进 networkstack 进程,再接内核阶段(CVE-2026-43284)完成最后一步。

4.5 漏洞复现

4.5.1 复现环境

项目 值
宿主机 Apple M1 Pro / macOS + Android SDK
模拟器 Android SDK Emulator 37.2.12,AVD lsp37 / google\_apis / arm64-v8a / Android 17(SPL 2026-08-05)
内核 6.12.81-android16(镜像自带,已含 LSPromise 链内核阶段修复——不影响框架阶段本漏洞的验证)
安全策略 SELinux Enforcing(全程未降权)
攻击面 普通 App(uid 10235,常规安装权限;READ\PHONE \_STATE / ACCESS\_FINE \_LOCATION / RECORD\ AUDIO / READ\_CONTACTS 安装时全部拒绝)
复现时间 第一层单独利用 2026-10-29;第二层链验证 2026-10-28

4.5.2 复现原理

为突出本漏洞的独立危害,复现分两层:第一层是团队自研的最小化 PoC(TelecomACE),只触发 CVE-2026-49881 本身——一个普通 App 不申请任何危险权限,点击按钮后以 system\_server 身份静默授予自己四个危险运行时权限(正常路径必须弹窗经用户手动允许);第二层是 LSPromise 官方工程验证链的“跳板”价值,确认本洞拿到的 system\_server 执行能力可以注入 networkstack、接通内核阶段。

PoC 组件/阶段 对应攻击动作
第一层:Telecom ACE最小化 PoC (团队自研,包名org.lspromise. telecomace) \_
MyInCallService +CLASS\_EXIST ENCE\_CHECK =true meta-data 声明带标志的 InCallService,强制 Telecom 走 serviceClassExists() 检查(漏洞入口)
MyAppComponent Factory 静态块 getClassLoader() 时先于一切应用代码被实例化,静态块以 system\_server(uid 1000)身份执行Shellcode.onAppComponentFactoryLoaded()
Shellcode.grant RuntimePermiss ionsSilently() 反射 IPackageManager.grantRuntimePermission,以 system 身份静默授予 READ\_PHONE\_STATE / ACCESS\_FINE\_LOCATION / RECORD\_AUDIO / READ\_CONTACTS,再广播回 App
MyConnection Service+addNewIn comingCall 触发Telecom绑定 InCallService扫描流程(按钮→ addNewIn comingCall → InCall Controller 走检查)
第二层:LSPromise 官方工程(user space 阶段) \_
stage1反射注入(IApplication Thread) 从 system\_server 向 com.android.network stack.process (uid 1073)注入并加载libexp.so(验证 本洞是完整链的入场券)
EVIL broadcast 注入成功后向App 回发controller binder,App拿到 networkstack 内的控制器

4.5.3 复现过程与结果

第一层:单独利用(TelecomACE)。攻击前基线——App 是普通应用(uid 10235),安装时四个危险权限全部保持拒绝,读设备序列号直接抛 SecurityException:

点击按钮后,logcat 关键输出(截图与完整 logcat 逐字见文末证据文件):

logcat 关键输出

设备端实测截图(同一屏幕呈现“攻击前基线 → 触发 → system\_server侧执行结果 → 回到 App 复测”完整故事线):

复现实测截图

实测截图:uid 10235 的普通 App 点击按钮后,四个危险权限被 system\_server(uid 1000)静默授予,全程无用户授权弹窗

第二层:链验证(LSPromise userspace 阶段)。同一模拟器运行官方 LSPromise APK 触发 userspace 阶段,logcat 依次实证环1(本漏洞)与环2(注入 networkstack):

第三层:组合链提权 root 实证(2026-10-28,同一模拟器换用团队自编译漏洞内核 6.12.52-4k,完整链一次跑通):

提权root实证

提权 root 实证:四个文件页缓存补丁完成,init → modprobe 以 root 加载内核模块,SELinux 由 Enforcing 转为 Permissive

复现结论验证项:

✅ 普通 App(uid 10235,无任何特权)→ 点击按钮 → 代码以 system\_server(uid 1000)身份执行,159ms内四个危险权限静默 GRANTED,全程 SELinux Enforcing、无用户交互;

✅ 本洞单独利用的真实危害实证:无需任何内存破坏,“权限弹窗”这一 Android 核心防线被整体绕过;

✅ 链验证:system\_server → networkstack(uid 1073)注入成功、libexp.so 加载——本洞是 LSPromise 完整提权链(配合 CVE-2026-43284 至 root)的入场券;

✅ 对照说明:本机内核 6.12.81-android16 已含链的内核阶段修复,完整链的 runAll 在 patch #2 处按预期终止——框架阶段(本漏洞)行为不受影响,正反两面互证;

✅ 组合链至 root 完整实证:换用漏洞内核 6.12.52-4k 后链一次跑通,getenforce 由 Enforcing 转为 Permissive(见 4.5.3 第三层截图与逐字日志)。

05 车联网相关性分析

该漏洞并非直接影响制动、转向等功能安全的漏洞,但对采用 Android Automotive OS 的智能座舱、车载娱乐主机、T-BOX 及

实际量产系统的限制条件:封闭系统(不开放应用安装、只读根文件系统)不适用本漏洞;车企应在 SBOM 与平台补丁基线中核查 CVE-2026-49881 与 2026-09-01 补丁级别,重点排查座舱/T-BOX 的补丁滞后情况(Google 已改为季度公告,Android 17 发布到修复间隔约 3 个月),并把“应用安装管控”作为补丁空窗期的第一道闸门。该漏洞可视为 ISO/SAE 21434 网络安全风险中的“本地提权环节”,而非直接的功能安全故障。

基于 Android 的域控制器具有直接安全相关性。典型攻击链:攻击者一旦通过恶意车机应用、被污染的应用分发渠道或调试/产线接口获得应用层立足点,即可借本洞提权至 system\_server(uid 1000,system 域),进而读写系统私有数据、操纵其他系统进程,并可作为跳板向 SELinux 白名单进程注入代码——配合内核漏洞(如 CVE-2026-43284)即完成“应用 → 系统 → 内核”的完整提权。

实际车载量产系统多启用 SELinux Enforcing(Android Automotive 强制开启),且车端容器化服务与系统组件(APEX/OTA 沙箱)天然使用 overlayfs 堆叠挂载——与本漏洞的触发地形吻合。限制条件也写清楚:SELinux 处于 Permissive、无嵌套 overlay、内核不含引入提交的车型不受影响。车企应在 SBOM 与内核补丁基线中核查本 CVE,重点排查运行 Linux 7.2 早期版本的座舱与网关平台。该漏洞可视为 ISO/SAE 21434 网络安全风险中的本地策略绕过环节,而非直接的功能安全故障。

06 参考链接

• LSPromise 完整链 writeup + PoC:https://github.com/LSPosed/LSPromise

• 修复 commit:

668eb07260ec Remove serviceClassExists logic to address security vulnerability

• Android 安全公告(2026-09-01):https://source.android.com/docs/security/bulletin/2026/2026-09-01

• 漏洞源码位置(android-17.0.0\_r1):https://cs.android.com/android/platform/superproject/+/android-17.0.0\_r1:packages/

services/Telecomm/src/com/android/server/telecom/InCallController.java;l=2603-2663

• canyie 公告背景分析:https://blog.canyie.top/2026/03/18/android-security-bulletin-index-2026/

精彩回顾

END

扫码申请获取PoC

CVE-2026-49881漏洞复现" 网络安全文章

CVE-2026-49881漏洞复现"

本文详细分析了Android17Telecom组件中的CVE-2026-49881漏洞,该逻辑错误允许普通应用以system\\_server身份执行任意代码,无内存破坏且成功率100%。漏洞由LSPosed团队发现,已于2026年9月安全公告修复。文章涵盖漏洞原理、影响范围、修复建议及完整复现过程,并指出与内核漏洞组合可完成提权链。建议及时升级补丁并加强应用安装管控。
动态|新型僵尸网络VeilDHT大范围传播风险预警" 网络安全文章

动态|新型僵尸网络VeilDHT大范围传播风险预警"

国家互联网应急中心监测发现新型僵尸网络veildht大范围传播,主要感染Linux服务器与IoT设备,利用漏洞利用扩散,具备DDoS攻击、命令执行、反向Shell及代理等功能,通信全程加密且隐蔽性强。2026年10月16日至26日境内感染约40467台设备。建议及时修复漏洞、加强口令、安装防护软件并监测IOC。
产业|网安市场周度监测(2026-11-03)" 网络安全文章

产业|网安市场周度监测(2026-11-03)"

网络安全行业资本市场及政策动态追踪,包括投融资、并购、IPO事件、上市公司动态、行业政策导向、研究报告及二级市场表现。重点包括AI原生进攻性安全、智能体安全、移动端EDR、零信任、威胁情报、工控安全等领域。
评论:0   参与:  0