缓冲区溢出导致内核崩溃
Maintainer thường phản hồi trong vòng 3 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- android, c, linux
- Lĩnh vực
- operating-systems, security
Hướng nghiên cứu
Bắt đầu với kernel/patch/android/userd.c, tập trung vào after_openat và before_openat, sau đó so sánh cách sử dụng data0 trong kpms/demo-syscallhook/syscallhook.c. Kiểm tra log_boot và đường dẫn compat_strncpy_from_user được báo cáo, đối chiếu với crash log và mã disassembly được cung cấp. Được xem là hoàn tất khi kernel crash được báo cáo không còn tái hiện được và các đường dẫn hook và logging bị ảnh hưởng vẫn an toàn.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
环境
手机型号:小米10(umi)
内核版本:4.19.318-perf+
系统OS:lineage21
系统版本:14(API 34)
系统指纹:Xiaomi/umi_global/umi:13/RKQ1.211001/V14.0.5.0.TJBMIXM:user/release-key
APatch版本:10763
KernelPatch版本:0.10.7
崩溃原因
bmax121/KernelPatch/kernel/patch/android/userd.c 函数 after_openat 中
static void after_openat(hook_fargs4_t *args, void *udata)
{
if (args->local.data0) {
compat_copy_to_user((void *)args->local.data1, ORIGIN_RC_FILE, sizeof(ORIGIN_RC_FILE));
log_boot("restore rc file: %x\n", args->local.data0);
}
if (args->local.data2) {
fp_unhook_syscall(__NR_openat, before_openat, after_openat);
}
}
此函数通过判断data0是否恢复用户空间的文件名,并调用log_boot
而在 bmax121/KernelPatch/kpms/demo-syscallhook/syscallhook.c 中
使用了data0用于保存task,导致compat_copy_to_user无论如何都会被调用,可能引起未定义异常
args->local.data0 = (uint64_t)task;
且log_boot也被调用,log_boot实现如下
#define BOOT_LOG_SIZE 0x2000
static char boot_log[BOOT_LOG_SIZE] = { 0 };
static int boot_log_offset = 0;
void log_boot(const char *fmt, ...)
{
va_list va;
va_start(va, fmt);
int ret = vsprintf(boot_log + boot_log_offset, fmt, va);
va_end(va);
printk("KP %s", boot_log + boot_log_offset);
boot_log_offset += ret;
}
当log_boot被多次调用时,会发生缓冲区溢出,最终会覆盖linux_libs_symbol_init初始化的函数表的位置,在before_openat函数中调用compat_strncpy_from_user时由于函数表被覆盖,从而导致PC异常,这也是为什么PC寄存器为restore字符串的hex值的原因,从而导致内核崩溃
解包APatch APK,分析assets\kpimg,具体崩溃位置如下AFA4 ,对应函数为compat_strncpy_from_user,崩溃日志中X16,X3,PC寄存器值一致,验证崩溃位置定位正确
ROM:000000000000AF94 E3 00 00 90 ADRP X3, #off_26040@PAGE
ROM:000000000000AF98 63 20 40 F9 LDR X3, [X3,#off_26040@PAGEOFF]
ROM:000000000000AF9C 63 00 00 B4 CBZ X3, loc_AFA8
ROM:000000000000AF9C
ROM:000000000000AFA0
ROM:000000000000AFA0 loc_AFA0 ; CODE XREF: cpyfromuser+1C↓j
ROM:000000000000AFA0 F0 03 03 AA MOV X16, X3
ROM:000000000000AFA4 00 02 1F D6 BR X16
崩溃日志
已经关闭内核ASLR
[ 0.000000] KP Kernel pa: a0080000
[ 0.000000] KP Kernel va: ffffff8008080000
[ 0.000000] KP Kernel Version: 413ff
[ 0.000000] KP Kernel Patch Version: a07
[ 0.000000] KP Kernel Patch Config: 2
[ 0.000000] KP Kernel Patch Compile Time: 12:16:35 May 1 2024
[ 0.000000] KP Kernel stext prot: 500000a0080793
[ 0.000000] KP Region: ffffff8167ac4000, ffffff8167ff4000
[ 0.000000] KP KernelPatch start prot: c80001ffac4713
[ 0.000000] KP Text: ffffff8167ac4000, ffffff8167ad7620
[ 0.000000] KP Data: ffffff8167ae4000, ffffff8167ae8f80
[ 0.000000] KP Extra: ffffff8167af4000, ffffff8167aff550
[ 0.000000] KP Hook: ffffff8167b00000, ffffff8167c00000
[ 0.000000] KP RW: ffffff8167c00000, ffffff8167e00000
[ 0.000000] KP ROX: ffffff8167e00000, ffffff8168000000
[ 0.000000] KP add vmalloc area: ffffff8167ac4000, 530000
[ 0.000000] KP Restore: ffffff80096a7f50, ffffff80096a84c0
...
[ 3.270513] Internal error: SP/PC alignment exception: 8a000000 [#1] PREEMPT SMP
[ 3.270517] Modules linked in:
[ 3.270520] Process init (pid: 1, stack limit = 0x00000000ed062f92)
[ 3.270524] CPU: 7 PID: 1 Comm: init Tainted: G S 4.19.318-perf+ #9
[ 3.270526] Hardware name: Qualcomm Technologies, Inc. xiaomi umi (DT)
[ 3.270529] pstate: 60400005 (nZCv daif +PAN -UAO)
[ 3.270532] pc : 0x2065726f747365
[ 3.270534] lr : 0xffffff8167ad4298
[ 3.270536] sp : ffffff800805b4e0
[ 3.270538] x29: ffffff800805b520 x28: ffffffc07fd80f80
[ 3.270541] x27: 0000000000000000 x26: 0000000000000000
[ 3.270543] x25: 0000000056000000 x24: 0000000000213d58
[ 3.270546] x23: ffffff8167b05cc0 x22: ffffff8167b05b80
[ 3.270548] x21: ffffff8167b05b9c x20: ffffff8167ad6fa8
[ 3.270550] x19: ffffff800805bdf8 x18: 0000000000000000
[ 3.270553] x17: 0000000000000000 x16: 722065726f747365
[ 3.270555] x15: 0000000000000000 x14: 0000000000000000
[ 3.270557] x13: 0000000000000000 x12: 0000000000000000
[ 3.270559] x11: 0000000000000000 x10: 0000000000000000
[ 3.270562] x9 : 0000000000000000 x8 : ffffff8167b05ec0
[ 3.270564] x7 : 0000000000000000 x6 : 00000000d503201f
[ 3.270566] x5 : 00000000d503201f x4 : 0000000000000002
[ 3.270568] x3 : 722065726f747365 x2 : 0000000000000020
[ 3.270571] x1 : 0000000000213d58 x0 : ffffff800805b590
[ 3.270573] Call trace:
[ 3.270575] 0x2065726f747365
[ 3.270577] 0xffffff8167b05f4c
[ 3.270584] el0_svc_common+0x98/0x160
[ 3.270587] el0_svc_handler+0x60/0x78
[ 3.270591] el0_svc+0x8/0x380
[ 3.270594] Code: bad PC value
- Ngôn ngữ chính
- C
- Star
- 1.6k
- Fork
- 395
- Merge trung bình
- 3 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 7
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của bmax121/KernelPatch
-
official LineageOS on nicepool: APpatch patching fails but only if done via recovery sideloadCó thể đã có người làm @bmax121 đã nhận 12 ngày trước. Đang mở
bmax121/KernelPatch#332 · 1 người được giao ·
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
bmax121/KernelPatch#329 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 3 ngày
-
kernel stack overflow: handle_supercmd 与 supercmd_echo 各持 4KB 栈缓冲区嵌套,event 上报改写 argv 时栈耗尽 panicĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
bmax121/KernelPatch#323 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
bmax121/KernelPatch#319 · 9 bình luận ·
Maintainer thường phản hồi trong vòng 3 ngày
-
SUPERCALL_KSTORAGE_LIST_IDS writes to an unvalidated userspace pointer with a raw memcpy → kernel KEĐang mở
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 72/100
bmax121/KernelPatch#308 ·
Maintainer thường phản hồi trong vòng 3 ngày
Tất cả issue của bmax121/KernelPatch
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
HexaCluster/credcheck#86 ·
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
AOMediaCodec/SVT-AV1#3320 ·
-
Add `CPC_TAKE_TILL_CHARS`Đang mởdifficulty: easy
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
-
ML-KEM: OQS_KEM_encaps/decaps cannot do the FIPS 203 length (type) checks; please document itĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
open-quantum-safe/liboqs#2647 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày