You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过修改program counter让Linux内核崩溃并重启?

如何通过自定义系统调用触发Linux内核崩溃重启?

当前实验环境与设置

  • 故障注入用的自定义系统调用:通过跳转到无效地址模拟控制流错误,代码如下:
#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE0(fine) {
    printk("==== FINE systemcall ====\n");
    printk("====      START      ====\n");
    asm volatile("jmp 0x01");
    printk("====      JUMPED     ====\n");
    printk("====       END       ====\n");
    return 0;
}
  • 触发故障的用户态程序:调用上述自定义系统调用,代码如下:
#include <stdio.h>
#include <sys/syscall.h> 

int main(){
    printf("Calling the system call...\n");
    printf("syscall output: %d\n", syscall(600)); // 自定义系统调用号为600
    printf("System call is called!\n");
    return 0;
}
  • 运行环境:VirtualBox中运行的Pop!_OS虚拟机,已安装编译好的自定义内核。

当前问题与需求

当前调用系统调用后,仅触发用户态程序终止,dmesg显示page fault,仅实现了局部故障注入。希望升级为系统级故障,让内核直接崩溃并触发重启。

同时有以下疑问:

  • 通用Linux内核是否足够健壮,导致这类操作难以实现?
  • 是否可以通过修改跳转目标为“相对不那么无效”的地址来实现系统崩溃?

临时解决方案(更新1)

已通过两个系统调用临时解决:一个执行跳转触发局部故障,另一个直接调用内核panic()函数,满足了教育实验需求,但仍好奇原问题的答案。


解答

为什么当前跳转只触发page fault而非系统崩溃?

内核的内存保护机制会拦截对无效地址的访问:0x01属于未映射的物理内存区域,触发page fault后,内核会检查该访问是否合法——由于是内核态的非法访问,内核会终止发起调用的进程(即你的用户态程序),但不会直接崩溃,这是内核的故障隔离机制在起作用,避免单个进程的错误扩散到整个系统。

如何修改实现系统级崩溃?

要绕过内核的故障隔离,需要让错误破坏内核的关键数据结构或执行路径,以下几种方法可行:

  1. 跳转到内核关键代码段的非法位置
    不要跳转到完全未映射的地址,而是跳转到内核已映射但不属于合法执行路径的地址,比如内核代码段中的中间位置(比如某个函数的指令中间)。这样CPU执行到非法指令或破坏寄存器状态后,会触发无法修复的内核错误,最终导致panic。
    操作步骤:先通过cat /proc/kallsyms查看内核符号的地址,比如找到init函数的起始地址,然后跳转到该地址+偏移的位置(比如asm volatile("jmp 0xffffffff81000010");,具体地址需根据你的内核实际情况调整)。

  2. 直接破坏内核关键数据结构
    在系统调用中直接修改内核的关键全局变量,比如修改current指针(指向当前进程的task_struct结构体),或者修改页表项,导致内核后续访问时出现致命错误。示例代码:

    SYSCALL_DEFINE0(crash) {
        // 直接覆盖current指针的内容,导致内核后续访问进程数据时崩溃
        *(unsigned long *)&current = 0xdeadbeef;
        return 0;
    }
    
  3. 触发内核BUG检查
    可以使用内核提供的BUG()宏,它会直接触发内核panic,模拟故障导致的崩溃场景,而非主动调用panic()函数。示例代码:

    SYSCALL_DEFINE0(crash) {
        // 触发内核BUG检查,直接引发系统崩溃
        BUG();
        return 0;
    }
    

关于内核健壮性的疑问

通用Linux内核确实具备较强的故障隔离和错误恢复机制,比如页表隔离、进程地址空间隔离、内核错误处理框架等,核心目标是避免单个进程或局部错误扩散到整个系统。但内核态的非法操作如果直接破坏了核心数据结构或执行路径,内核将无法恢复,最终会触发panic并重启(重启延迟可通过sysctl kernel.panic命令调整)。


内容的提问来源于stack exchange,提问作者III_phr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:07:02