Linux内核的下一个版本7.2将在openat2系统调用中引入OPENAT2_REGULAR标志。此功能允许程序确保只打开常规文件,避免被重定向到诸如/dev/null或FIFO等特殊设备,这些设备可能导致意外的阻塞行为和安全隐患。
OPENAT2_REGULAR在内核中的工作原理 🛡️
OPENAT2_REGULAR标志在openat2调用中充当过滤器。当激活时,内核会在允许打开之前验证目标文件是否为常规文件(S_IFREG)。如果文件是块设备、FIFO或套接字,操作将失败并返回EISDIR或EPERM错误。此验证在解析符号链接之后进行,从而阻止了使用链接指向特殊设备的攻击。该实现由UAPI小组请求,用于保护处理用户文件的应用程序。
告别/dev/null和调皮FIFO带来的惊吓 😅
到目前为止,一个信任的程序可能会打开一个文件,却发现它是一个FIFO,让它永远等待数据,或者更糟的是,一个/dev/null悄无声息地吞噬了它的所有输出。有了OPENAT2_REGULAR,这些惊吓就结束了:如果文件不是常规文件,内核会拒绝,开发者可以节省数小时的调试时间。这就像在磁盘入口处安装了一个过滤器,只允许真正的文件通过,而不是狂欢节的伪装。