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

如何检查用户态触发内核procfs写入的调用参数及调用来源?

排查procfs write调用参数与触发进程的方法

用户态追踪工具:strace

直接用strace跟踪base64命令的系统调用,能清晰看到所有write调用的参数:

strace -e write base64 /path/to/your/file > /proc/your_proc_entry

输出里会显示每个write()系统调用的细节,包括:

  • 目标文件描述符(fd):对应/proc条目打开后的fd
  • 写入的缓冲区内容(文本类型会显示部分内容)
  • 传入的长度参数(系统调用的第三个参数)
  • 实际写入的字节数(系统调用的返回值)
    通过这些信息可以确认用户态触发的write调用参数是否符合预期,以及是否存在多次分段写入的情况(base64命令可能会分多次输出数据)。

内核态调试:添加打印日志

在你的procfs write回调函数中加入printk打印关键信息,直接在内核层面验证参数:

ssize_t your_proc_write(struct file *file, const char __user *buf, size_t len, loff_t *ppos)
{
    // 打印触发调用的进程名、PID、传入的len参数
    printk(KERN_INFO "proc_write: comm=%s, pid=%d, len=%zu, ppos=%lld\n",
           current->comm, current->pid, len, *ppos);
    
    // 记录copy_from_user的实际拷贝结果
    char kbuf[1024] = {0};
    long ret = copy_from_user(kbuf, buf, min(len, sizeof(kbuf)-1));
    if (ret != 0) {
        printk(KERN_WARNING "proc_write: copy_from_user failed, uncopied bytes=%ld\n", ret);
    } else {
        printk(KERN_INFO "proc_write: copied data snippet: %s\n", kbuf);
    }
    
    // 你的原有业务逻辑...
    return len;
}

编译加载内核模块后,通过dmesg或journalctl -k查看日志,就能对应到用户态触发write调用的进程(即base64),以及传入的len参数是否正确,还有copy_from_user的执行情况。

验证base64输出的完整性

如果怀疑base64命令的输出本身存在分段或长度异常,可以先将结果写入普通文件,对比写入proc时的总字节数:

base64 /path/to/your/file > test_base64.txt
# 查看文件总字节数,对比strace中所有write调用的len之和
wc -c test_base64.txt

确认总字节数是否和strace中所有write调用的长度总和一致,排除base64输出本身的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:37:36