首页
社区
课程
招聘
[原创] Audit 侧信道: Root, scrcpy 和模拟器的新型检测与绕过
发表于: 2026-5-20 23:54 4991

[原创] Audit 侧信道: Root, scrcpy 和模拟器的新型检测与绕过

2026-5-20 23:54
4991

260522 21:17:53 更新

Hide procfs related audit messages from appdomain

这个链接是一个 AOSP 的修复变更, 旨在修复一个 Audit 日志泄露的问题

在三方 App 受限沙箱中, 即使不能直接读取其他进程的 /proc/<pid> 信息, 通过访问 procfs 触发 SELinux Audit 日志, 也可能可以从 logcat 里的 tcontext 反推出目标进程的安全域

也可以说这是一个基于 audit 日志的侧信道检测思路.

基于这个思路, 先尝试了以下三类场景:

依旧是使用 Mira 开源框架进行运行时风险分析. 介绍在 https://bbs.kanxue.com/thread-291041.htm 这篇文章

相对于不断打包安装和触发, Mira 只需 AI 自行对 shell 脚本不断进行微调和执行即可. 比如这次的改 PID 范围, 改 logcat 匹配规则, 改扫描窗口, 很快, 很省精力.

文末为原理, 修复, 以及绕过方案.

让 AI 调用 Mira 的 MCP 功能, AI 这里使用分块扫描, 从 900 开始按窗口触碰 /proc/<pid>, 每个窗口 25 个 PID, 发现命中后停止.

可以直接看到, App 沙箱侧触碰 procfs 后, audit 日志暴露了 tcontext=u:r:magisk:s0.

AVD 即 Android Studio 自带模拟器, 这里使用 M 芯片 Mac android studio 的 Android 13 镜像作为演示样本

Magisk检测 中使用 AI 调用 MCP 用于展示 AI 快速微调的效率, 实际弄懂原理之后, 手动使用该受控三方权限 shell 会更快

先 adb 查看有什么进程, 进程名是什么

试探一下, 发现了 qemu_props 特征

同样, 再找点其他模拟器特征, 比如

这些就不如 qemu 的特征明显, 但也可以被触发

从 android 9 往后, 对 scrcpy 的检测就一直没有什么好方案, 因为特征隐藏的足够好, 而 audit 可以提供一种新的思路

分析 scrcpy 的源码, 发现新版本的 scrcpy 基于 adb shell 拉起 app_process, 启动 scrcpy 自己的 jar 包运行, 运行起来会删除 /data/local/tmp/scrcpy-server.jar 文件, 没有文件特征

参考 avd 的研究方法, 先 adb shell 查看, 可以看到投屏服务对应 sh -> app_process -> app_process 三个 pid 很相近的进程

audit 日志不能直接读出 app_process, 但能看到高 PID 中有三个离得很近的 u:r:shell:s0 特征:

启停对比也符合预期: 关闭投屏后, 相同高 PID 范围扫描结果为:

正常用户即使开启 adb, 不用 scrcpy 投屏也不会有这个特征, 因此连续 3 个 u:r:shell:s0 可以作为判断正疑似使用 scrcpy 投屏的策略, 具体需要线上环境验证, 这里只是提供一个思路

若想隐藏, 要么使用修复后系统, 要么就是得 root 设备然后 hook 系统框架将这部改掉, 但就会引入新的特征进入 root 对抗的范畴. 提高攻击方的成本.

该侧信道不适合无脑大范围扫描, 实验中出现过单点命中, 大窗口扫描反而漏检的情况

原因主要有两个:

推荐使用小窗口或重叠窗口:

如果 CHUNK=50 漏检, 优先降低到 CHUNK=10, 或使用 CHUNK=50 STEP=25。不要只增加 sleep, 因为失败原因通常不是日志延迟, 而是 audit 限流和窗口噪声。

当前 shell 触碰 /proc/<pid>sh script.sh 新开子 shell 触碰, 不等价.

推荐方式:

问题核心在 system/logging/logd/LogAudit.cppLogAudit::logPrint

logd 收到 audit 消息后, 先格式化成字符串:

此时 str 中已经包含原始 audit 信息, 例如 dev="proc", scontext, tcontext, tclass, comm, path 等字段。对本文场景来说, 关键是 dev="proc"tcontext 同时存在

随后代码从 audit 字符串中查找 pid= 字段, 并用 pidToUid 找到触发 audit 的 UID:

这个 UID 后续会传给日志系统. 对于 App 触发的 procfs audit, 这里解析出的 UID 会落在 AID_APP_START 之后.

原代码会调用 auditParse(str, uid):

auditParse 会解析 scontext, tcontext, tclass, 并尝试匹配 bug metadata. 更重要的是, 当 UID 属于 App 范围时, 它还会追加 App 包名:

这说明 logd 不只是原样转发 audit 字符串, 还会把它加工成更适合定位问题的日志. 对系统调试来说这是正向能力, 但对 App 可见日志来说, 它强化了侧信道可读性.

原代码随后把 audit 字符串和追加元数据写入 events buffer:

这里使用的 uid, pid, tid 来自前面的解析结果. 也就是说, 这条 audit 日志会以触发方相关身份进入日志系统.

后续代码还会构造 main buffer 日志. 它会从 audit 字符串中解析 comm="...", 构造新的日志内容, 再把 denial metadata 拼进去.

结果是, 同一条 procfs denial 可能进入 main buffer 和 events buffer. 只要 App 侧能够读取到对应日志面, tcontext 就会暴露.

根因可以概括为一句话:

hidepid=2 保护的是 procfs 正常读取面, 但原 logd 路径把 procfs 访问失败后的 audit 诊断信息转发到了 App 可见日志面.

因此 App 不需要直接读取 /proc/<pid>. 它只需要触碰 /proc/<pid> 触发 getattr denial, 再从 logcat 中读取 tcontext, 就能推断目标进程属于哪个 SELinux 安全域.

Android 上 audit 消息会通过 netlink socket 转发给 logd, logd 又可能把这些消息转发到 App 自身可见的日志面. 这样就形成了下面的信息流:

这条链路绕过的不是 SELinux 权限检查本身, 而是利用权限检查失败后的诊断信息.

3725346 补丁新增的逻辑如下:

这段过滤有两个条件。

第一, uid >= AID_APP_START. 说明过滤对象是 App UID 触发的 audit, 而不是所有系统 audit. 这样可以避免影响系统服务和原生系统进程的正常诊断.

第二, strstr(str, "dev=\"proc\""). 说明过滤对象是 procfs 相关 audit. 补丁没有泛化过滤所有 SELinux denial, 而是精准阻断这条通过 /proc/<pid> 泄露其他进程安全域的路径.

修的是 logd 的转发边界. 访问失败可以继续失败, 系统也可以继续审计, 但 App 无法通过日志缓冲看到其他进程的 tcontext.

一条典型的 SELinux 拒绝记录如下:

关键字段如下:

AOSP SELinux 文档说明, SELinux denial 会进入 dmesglogcat, 并且 scontext, tcontext, tclass 分别描述发起方, 目标方和目标对象类型. 也就是说, audit 日志的设计目标是帮助系统开发者定位策略问题, 但在特定日志可见性条件下, 它也可能成为信息侧信道.

260522 21:17:53 更新

219K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2N6X3W2J5j5i4S2H3i4K6u0r3h3V1&6Q4x3X3c8m8N6h3c8A6N6q4m8S2N6r3y4Z5i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8X3#2G2k6s2g2D9k6g2)9J5c8Y4y4J5j5#2)9J5c8X3#2S2K9h3&6Q4x3V1k6U0M7s2m8Q4x3V1k6Z5L8$3!0C8i4K6u0W2j5%4m8H3i4K6t1K6e0o6x3$3


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2026-5-22 21:50 被vwvw编辑 ,原因: 更新 mb_bvvcoitr 大佬指正的错误
收藏
免费 72
打赏
分享
最新回复 (41)
雪    币: 139
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2026-5-21 01:37
0
雪    币: 106
活跃值: (3639)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢分享 ~
2026-5-21 09:51
0
雪    币: 104
活跃值: (8742)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
tql
2026-5-21 10:54
0
雪    币: 410
活跃值: (1748)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
1
2026-5-21 11:56
0
雪    币: 3001
活跃值: (2540)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
tql
2026-5-21 12:14
0
雪    币: 191
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
666
2026-5-21 12:24
0
雪    币: 1500
活跃值: (2241)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
666
2026-5-21 13:35
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2026-5-21 14:00
0
雪    币: 5
活跃值: (4115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
6666
2026-5-21 14:10
0
雪    币: 139
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
666
2026-5-21 14:48
0
雪    币: 161
活跃值: (943)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习学习
2026-5-21 15:09
0
雪    币: 76
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
看看
2026-5-22 13:24
0
雪    币: 98
活跃值: (811)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我选择priv_app是有原因的,你的写法才会触发检测,比如path匹配proc的话,app可以自行找一个带proc的路径(比如/data/data/xxx/proc/(触发denial,结果发现日志里被改了
2026-5-22 19:19
1
雪    币: 98
活跃值: (811)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
此外priv_app的后缀(mls特征)是固定的,随机化反而说明有问题
2026-5-22 19:20
1
雪    币: 139
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mb_bvvcoitr 我选择priv_app是有原因的,你的写法才会触发检测,比如path匹配proc的话,app可以自行找一个带proc的路径(比如/data/data/xxx/proc/(触发denial,结果发现日志 ...
学到了大佬, 我明天研究下改下帖子, 感谢指导
2026-5-22 19:42
0
雪    币: 139
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mb_bvvcoitr 此外priv_app的后缀(mls特征)是固定的,随机化反而说明有问题
已修改, 再次感谢
2026-5-22 21:38
0
雪    币: 764
活跃值: (3607)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
666
2026-5-22 23:19
0
雪    币: 6247
活跃值: (11217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
2026-5-23 11:02
0
雪    币: 5
活跃值: (1492)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
233
2026-5-23 11:56
0
雪    币: 4694
活跃值: (5530)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
6
2026-5-23 12:05
0
雪    币: 1226
活跃值: (1775)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
666
2026-5-23 20:44
0
雪    币: 865
活跃值: (1075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
666
2026-5-25 09:32
0
雪    币: 55
活跃值: (442)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
tql
2026-5-25 09:48
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
tql

2026-5-26 15:40
0
游客
登录 | 注册 方可回帖
返回