首页
社区
课程
招聘
[原创]KernelSU检测之“时间侧信道攻击”
发表于: 2025-10-28 15:49 4150

[原创]KernelSU检测之“时间侧信道攻击”

2025-10-28 15:49
4150

​ 偶然间拿到一个海外Bank的样本,打开后出现崩溃的现象,但是我的手机只刷了KernelSU,并且还魔改过的,以前一直都是过五关斩六将,但是这个app为什么会崩溃呢,难道说是检测到我的环境装了KernelSU?带着这个疑问对这个样本进行了一系列惨无人道的摧残,发现确实检测了KernelSU,并且不是普通的检测方式,而是鲜少听闻的”侧信道攻击“检测。

在开始之前说下什么是“侧信道攻击”。

想象一下,你想知道一个保险箱的密码,但你并不去尝试破解它的机械结构或电子锁。

通过分析这些间接信息,你很有可能推断出正确的密码。这种通过收集和分析系统在运行过程中产生的物理间接信息,而不是直接攻击算法或代码本身,来获取秘密信息的攻击方式,就叫做侧信道攻击

样本so用了AppGuard加固,且应用自身的so被加密了,节约时间就直接步入正题。

检测方式用的是“时间侧信道攻击”

这是ksu的检测代码,接下来对其进行拆解

作用:

获取核心数,评估性能并识别大核

绑定到高性能核心以稳定测量

作用:为时间数据分配并清零内存

这里会收集两个函数的执行耗时

分别收集__NR_faccessat和__NR_fchownat的执行时间

作用:稳定比较,减小极值影响

作用:并行比较并累加异常计数

这段代码理解起来可能比较吃力,换个如下实现方式就非常清晰了

就是单纯的比较NR_faccessat数组和NR_fchownat数组里的元素大小,当出现NR_faccessat>NR_fchownat的情况是就记录为一次异常,往后依次自增。

用NEON的目的是为了提升代码执行性能。

作用:超过阈值时判定存在 hook,并触发回调

针对这块的检测我们可以简单看看KernelSU的hook

实现方式

选择 faccessat 因其在 KSU hook 列表中,且满足“简单、快速、失败无副作用”的要求

其他 hook 调用要么更复杂,要么有副作用,不适合用作可靠的基线或被测调用

一般来说faccessat的执行速度是要比fchownat快的,如果faccessat出现大量慢于fchownat的情况,那么说明环境有异常。

Android 15

Android 10

// 正常路径

syscall -> kernel -> 快速返回

时间:50-100 纳秒

// 有任何拦截后

syscall -> kernel -> hook层 -> 返回

时间:200-500 纳秒

“侧信道攻击”防护确实非常有效,感觉针对这种防护的方式只有进一步去魔改对应的hook函数了,要么就针对处理检测函数。

攻击类型 攻击原理 典型例子 关键特点
计时攻击 测量操作执行时间,通过时间差异推断数据。例如,字符串比较时,早期返回错误会导致更短的执行时间。 1. 分析网站登录验证,猜测用户名和密码。 2. 通过测量RSA解密操作的时间来推测私钥。 纯软件攻击,无需物理接触。依赖代码逻辑不是“恒定时间”的。
功耗分析攻击 测量设备运行时芯片的功耗波动。处理不同数据(0或1)时功耗有微小差异,分析这些“功耗轨迹”可还原密钥。 1. 攻击智能卡、加密狗。 2. 攻击POS机,窃取信用卡PIN码。 需要物理接近和精密仪器(如示波器)。分为简单功耗分析(SPA)和差分功耗分析(DPA)。
电磁分析攻击 测量设备运行时散发的电磁辐射。与功耗分析类似,电磁辐射也携带着与当前操作和数据相关的信息。 1. 通过探测手机CPU的电磁辐射,还原其正在运行的加密算法和密钥。 2. 攻击接触式/非接触式智能卡。 是一种“非侵入式”攻击,可以在一定距离外进行。信息量可能比功耗更丰富。
声音攻击 录制设备运行时的声音,分析其机械部件的声学特征,来还原处理的信息。 1. 通过点阵打印机的声音还原打印内容。 2. 通过键盘敲击声识别输入的按键。 3. 通过硬盘寻道声推测读取的数据。 利用的是机械振动产生的声音,对麦克风灵敏度要求高。
缓存攻击 利用CPU缓存的访问时间差异(缓存命中快,未命中慢)。通过监控自身程序的访问速度,来探测受害者进程的缓存使用情况,从而泄露信息。 1. Spectre(幽灵)Meltdown(熔断) 漏洞就是利用缓存侧信道跨进程窃取内核内存数据。 2. 在云环境中,攻击同一物理主机的其他虚拟机。 是现代CPU微架构中最重要的侧信道之一,威胁云安全。
光学攻击 使用高分辨率相机等设备,捕捉设备运行时泄露的光学信息。
__int64 __fastcall ksu_check(void *a1)
{
  __int64 v1; // x0
  __int64 *v2; // x22
  __int64 v3; // x19
  __int64 v4; // x0
  void **v5; // x21
  __int64 v6; // x20
  __int64 v7; // x0
  __int64 i; // x20
  __int64 v9; // x19
  __int64 v10; // x0
  __int64 j; // x20
  __int64 v12; // x19
  __int64 (__fastcall *v13)(const void *, const void *); // x19
  __int64 v14; // x20
  void *v15; // x0
  int32x2_t v16; // d0
  int64x2_t v17; // q1
  uint64x2_t *v18; // x8
  int64x2_t *v19; // x9
  int32x2_t v20; // d2
  uint64x2_t v21; // q3
  uint64x2_t v22; // q4
  int32x2_t v23; // d0
  unsigned __int32 v24; // s0
 
  LODWORD(off_132FC0) = sub_67AF8(a1);
  if ( off_132FC0 >= 2 )
  {
    sub_67E1C();
    if ( off_132FD8 )
      sub_67F8C();
  }
  v1 = sub_539B0(80000LL);
  v2 = d1_ptr;
  v3 = v1;
  *d1_ptr = v1;
  v4 = sub_539B0(80000LL);
  v5 = d2_ptr[0];
  v6 = v4;
  *d2_ptr[0] = v4;
  sub_54EB0(v3, 0LL, 80000LL);
  v7 = sub_54EB0(v6, 0LL, 80000LL);
  for ( i = 0LL; i != 80000; i += 8LL )
  {
    v9 = sub_67AD8(v7);
    v10 = sub_54E70(48LL, 0xFFFFFFFFLL, 0LL, 0xFFFFFFFFLL, 0LL);
    v7 = sub_67AD8(v10);
    *(*v2 + i) = v7 - v9;
  }
  for ( j = 0LL; j != 80000; j += 8LL )
  {
    v12 = sub_67AD8(v7);
    v7 = sub_67AD8(linux_eabi_syscall(__NR_fchownat, -1, 0LL, 0, 0, -1));
    *(*v5 + j) = v7 - v12;
  }
  v13 = compare;
  v14 = 10000LL;
  sub_557B0(*v2, 10000LL, 8LL, compare);
  sub_557B0(*v5, 10000LL, 8LL, v13);
  v15 = *v2;
  v16.n64_u64[0] = 0LL;
  v17 = vdupq_n_s64(1uLL);
  v18 = (*v2 + 16);
  v19 = (*v5 + 16);
  v20.n64_u64[0] = 0LL;
  do
  {
    v21 = v18[-1];
    v22 = *v18;
    v18 += 2;
    v14 -= 4LL;
    v16.n64_u64[0] = vsub_s32(v16, vmovn_s64(vcgtq_u64(v21, vaddq_s64(v19[-1], v17)))).n64_u64[0];
    v20.n64_u64[0] = vsub_s32(v20, vmovn_s64(vcgtq_u64(v22, vaddq_s64(*v19, v17)))).n64_u64[0];
    v19 += 2;
  }
  while ( v14 );
  v23.n64_u64[0] = vadd_s32(v20, v16).n64_u64[0];
  v24 = vadd_s32(v23, vdup_lane_s32(v23, 1)).n64_u32[0];
  if ( v24 > 0x1B58 )
  {
    sub_681AC(v24);
    v15 = *v2;
  }
  operator delete(v15);
  operator delete(*v5);
  return 0LL;
}
__int64 __fastcall ksu_check(void *a1)
{
  __int64 v1; // x0
  __int64 *v2; // x22
  __int64 v3; // x19
  __int64 v4; // x0
  void **v5; // x21
  __int64 v6; // x20
  __int64 v7; // x0
  __int64 i; // x20
  __int64 v9; // x19
  __int64 v10; // x0
  __int64 j; // x20
  __int64 v12; // x19
  __int64 (__fastcall *v13)(const void *, const void *); // x19
  __int64 v14; // x20
  void *v15; // x0
  int32x2_t v16; // d0
  int64x2_t v17; // q1
  uint64x2_t *v18; // x8
  int64x2_t *v19; // x9
  int32x2_t v20; // d2
  uint64x2_t v21; // q3
  uint64x2_t v22; // q4
  int32x2_t v23; // d0
  unsigned __int32 v24; // s0
 
  LODWORD(off_132FC0) = sub_67AF8(a1);
  if ( off_132FC0 >= 2 )
  {
    sub_67E1C();
    if ( off_132FD8 )
      sub_67F8C();
  }
  v1 = sub_539B0(80000LL);
  v2 = d1_ptr;
  v3 = v1;
  *d1_ptr = v1;
  v4 = sub_539B0(80000LL);
  v5 = d2_ptr[0];
  v6 = v4;
  *d2_ptr[0] = v4;
  sub_54EB0(v3, 0LL, 80000LL);
  v7 = sub_54EB0(v6, 0LL, 80000LL);
  for ( i = 0LL; i != 80000; i += 8LL )
  {
    v9 = sub_67AD8(v7);
    v10 = sub_54E70(48LL, 0xFFFFFFFFLL, 0LL, 0xFFFFFFFFLL, 0LL);
    v7 = sub_67AD8(v10);
    *(*v2 + i) = v7 - v9;
  }
  for ( j = 0LL; j != 80000; j += 8LL )
  {
    v12 = sub_67AD8(v7);
    v7 = sub_67AD8(linux_eabi_syscall(__NR_fchownat, -1, 0LL, 0, 0, -1));
    *(*v5 + j) = v7 - v12;
  }
  v13 = compare;
  v14 = 10000LL;
  sub_557B0(*v2, 10000LL, 8LL, compare);
  sub_557B0(*v5, 10000LL, 8LL, v13);
  v15 = *v2;
  v16.n64_u64[0] = 0LL;
  v17 = vdupq_n_s64(1uLL);
  v18 = (*v2 + 16);
  v19 = (*v5 + 16);
  v20.n64_u64[0] = 0LL;
  do
  {
    v21 = v18[-1];
    v22 = *v18;
    v18 += 2;
    v14 -= 4LL;
    v16.n64_u64[0] = vsub_s32(v16, vmovn_s64(vcgtq_u64(v21, vaddq_s64(v19[-1], v17)))).n64_u64[0];
    v20.n64_u64[0] = vsub_s32(v20, vmovn_s64(vcgtq_u64(v22, vaddq_s64(*v19, v17)))).n64_u64[0];
    v19 += 2;
  }

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

最后于 2025-10-28 16:09 被九天666编辑 ,原因:
上传的附件:
收藏
免费 202
支持
分享
最新回复 (132)
雪    币: 7066
活跃值: (23500)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
2
看看
2025-10-28 15:52
0
雪    币: 2549
活跃值: (1900)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
不知道为啥发出来图片没了
2025-10-28 15:56
0
雪    币: 1528
活跃值: (5237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
图片挂了
2025-10-28 15:57
0
雪    币: 2549
活跃值: (1900)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
陈某人 图片挂了
我这里加载是能看到图片 发出来就挂了
2025-10-28 15:58
0
雪    币: 2549
活跃值: (1900)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
搞好了图片
2025-10-28 16:10
0
雪    币: 2280
活跃值: (2730)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
666
2025-10-28 16:13
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
666
2025-10-28 16:14
0
雪    币: 2549
活跃值: (1900)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
随风而行aa 看看
大佬
2025-10-28 16:15
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
666
2025-10-28 16:17
0
雪    币: 199
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
666
2025-10-28 16:18
0
雪    币: 7066
活跃值: (23500)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
12
九天666 大佬
不错的思路
2025-10-28 16:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
666
2025-10-28 16:20
0
雪    币: 6434
活跃值: (5300)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
14
感謝分享, 學到了
2025-10-28 16:28
0
雪    币: 204
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
牛,还能这样玩的
2025-10-28 16:31
0
雪    币: 442
活跃值: (1551)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
6666
2025-10-28 16:32
0
雪    币: 3226
活跃值: (8023)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
17
ACE里面也有类似的
2025-10-28 16:33
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
YYDS
2025-10-28 16:36
0
雪    币: 1
活跃值: (820)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
6
2025-10-28 16:53
0
雪    币: 397
活跃值: (2718)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
学习一下
2025-10-28 17:04
0
雪    币: 158
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习
2025-10-28 17:21
0
雪    币: 9194
活跃值: (6990)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
22
好主意,找时间抄过来
2025-10-28 17:25
0
雪    币: 1185
活跃值: (2122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我来看啊看
2025-10-28 18:04
0
雪    币: 5199
活跃值: (3211)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
666
2025-10-28 18:37
0
雪    币: 930
活跃值: (1420)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
learn
2025-10-28 20:45
1
游客
登录 | 注册 方可回帖
返回