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

BPF探针排查:sys_execve()在begin_new_exec()返回后能否返回错误?

问题解答

关于后期错误是否传递到用户态

是的,load_elf_binary()等步骤的错误会传递到用户态。execve()/execveat()这类系统调用的返回值会反映整个执行流程的最终结果:哪怕begin_new_exec()执行成功,后续加载二进制、设置进程镜像等环节出现错误时,内核会将对应的错误码(如ENOEXEC、ENOMEM、EACCES等)返回给用户态进程,告知调用失败。

关于sys_execve()在begin_new_exec()返回后失败且PID未终止的场景

存在这类场景。begin_new_exec()只是exec流程的前期初始化步骤,它完成后内核还会执行加载二进制文件、设置进程上下文、初始化新程序环境等后续操作。如果这些后续步骤失败,内核不会终止当前进程,而是会尝试回滚部分操作(但并非所有修改都能完全回滚),进程会以原PID继续运行,仅execve()系统调用返回错误。

举个典型例子:进程调用execve()加载一个格式无效的ELF文件,begin_new_exec()成功完成了凭证替换、旧可执行文件清理等操作,但load_elf_binary()因文件格式错误返回失败,此时进程不会终止,而是回到可运行状态,用户态会收到ENOEXEC错误,PID保持不变。

对你的BPF探针误报问题的补充说明

你的误报大概率源于这类exec失败场景:begin_new_exec()已经修改了任务的UID/GID或nsproxy,但后续流程失败后,内核并未将这些值恢复到exec调用前的状态,而你的探针只在execve()/execveat()成功返回时更新values[pid],未处理exec失败的路径,导致begin_new_exec()入口检查时,当前任务的数值与values[pid]中存储的旧值不匹配,触发误报。你需要在execve()/execveat()系统调用失败返回的路径也更新values[pid],或者在begin_new_exec()之后的错误处理路径添加探针,同步修正存储的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:24