首页
社区
课程
招聘
[原创]侧信道检测APatch Root
发表于: 2026-1-21 01:43 1378

[原创]侧信道检测APatch Root

2026-1-21 01:43
1378

摘要

APatch在内核中HOOK了truncate(45号)系统调用,作为应用层请求ROOT权限的接口。如下是相关代码,它的含义如下:

• 挑选truncate作为后门调用, 安装HOOK
• 取调用的key与cmd参数, 如果参数校验通过, 进入后门调用, 否则进入正常调用

由此可以得出检验方法:

  1. 设置key, cmd参数, 尽可能多的触发后门调用中的代码, 计算执行时间为T1
  2. 设置key, cmd参数, 尽可能少的触发后门调用中的代码, 计算执行时间为T2
  3. 在正常环境中, T1与T2应该接近, 因为都会触发truncate的参数检验提前返回
  4. 在APatch环境中, T1与T2应该有较大相差值

实现细节

检测代码如下, 基本逻辑如下:

• 要将执行线程绑定到固定CPU核心上, 避免线程切换CPU核心产生影响
• 设置参数1为su, 参数2在1000-1005执行若干次, 计算时间T1
• 设置参数1为su, 参数2在994-999执行若干次, 计算时间T2
• 在APatch环境中, T1与T2存在较大差异, 因为T1会执行更多后门代码, T2在后门代码开头即会退出
• 在正常环境中, T1与T2基本无差异, 因为会在truncate函数入口处由于su文件不存在退出

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define _GNU_SOURCE
 
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
 
static inline uint64_t get_ticks() {
  uint64_t v;
  asm volatile("isb; mrs %0, cntvct_el0; isb" : "=r"(v) : : "memory");
  return v;
}
 
void bind_to_cpu(int cpu_id) {
  cpu_set_t cpuset;
  CPU_ZERO(&cpuset);
  CPU_SET(cpu_id, &cpuset);
 
  if (sched_setaffinity(0, sizeof(cpu_set_t), &cpuset) == -1) {
    perror("sched_setaffinity");
  } else {
    printf("Thread successfully bound to CPU %d\n", cpu_id);
  }
}
 
int get_current_cpu() {
  int cpu = sched_getcpu();
  if (cpu == -1) {
    perror("sched_getcpu");
    return -1;
  }
  return cpu;
}
 
uint64_t runner(int cmd) {
  char buffer[3] = "su";
 
  uint64_t t1 = get_ticks();
  for (int i = 0; i < 10000; i++) {
    syscall(45, buffer, cmd);
  }
  uint64_t t2 = get_ticks();
  return t2 - t1;
}
 
int main(int argc, char *argv[]) {
  // 绑定cpu核心, 避免切换cpu核心对结果的影响
  bind_to_cpu(0);
 
  uint64_t d1 = 0, d2 = 0;
  for (int i = 0; i < 5; i++) {
    d2 += runner(0x999 - i);
  }
  for (int i = 0; i < 5; i++) {
    d1 += runner(0x1000 + i);
  }
  printf("Duration for cmd 0x1000: %lu tk\n", d1);
  printf("Duration for cmd 0x500 : %lu tk\n", d2);
  uint64_t diff = d1 > d2 ? d1 - d2 : d2 - d1;
  printf("Delta percentage: %.2f%%\n",
         (double)diff / ((double)(d1 + d2) / 2) * 100.0);
  return 0;
}

如下图所示, APatch环境中T1 T2差异较明显, 正常环境中T1 T2差异不明显
APatch环境
正常环境


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 13
支持
分享
最新回复 (7)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2026-1-21 11:12
0
雪    币: 1916
活跃值: (1846)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2026-1-21 11:28
0
雪    币: 1320
活跃值: (2312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2026-1-21 15:01
0
雪    币: 2259
活跃值: (6504)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5

libtersafe.so,这地方还有种方式可以利用

最后于 2026-1-21 20:45 被R0g编辑 ,原因:
2026-1-21 20:44
0
雪    币: 495
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
换个系统调用就行了
2026-1-21 21:07
0
雪    币: 904
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
mt好像有这个检测
2026-1-21 21:39
0
雪    币: 184
活跃值: (577)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
20小时前
0
游客
登录 | 注册 方可回帖
返回