查询 umask 以获得新文件权限的便携式方法?

查询 umask 以获得新文件权限的便携式方法?

我一直在关注 OSS-Security 上的一个主题,名为vim交换文件的安全风险。看来 Vim 和 Emacs 捕获了 CVE,因为编辑器在错误的位置创建了具有太多文件权限的临时文件。

我知道 Posix 有一个掩码函数来设置掩码,但我并没有真正看到查询它的函数。我也知道一些 shell 支持UMASK,但我没有看到我访问的 IEEE 页面中提到它。 (也许我错过了;另见Linux下如何查看所有用户的umask?)。

程序如何以可移植的方式查询 umask 值?

答案1

不带参数的shellumask内置函数会打印当前的值umask

系统umask()调用返回前一个的值umask,因此您可以执行以下操作:

umask = umask(0777);
umask(umask);

(或umask(umask = umask(0777))作为一个常见的习语)。

这就是umaskshell 内置函数的作用。请注意,在多线程程序中,如果另一个线程umask()同时调用,则两阶段过程可能会出现问题。但一般来说,程序通常在启动时执行此操作以找出umask()它们最初拥有的。

要获取umask另一个进程的信息,在最新版本的 Linux 上(4.7或以上), 你可以做:

sed -ne 's/^Umask:[[:blank:]]*//p' < "/proc/$pid/status"

请注意,您发布的链接中提到的安全注意事项与权限无关,而是与包含已编辑文件内容但具有不同扩展名(.swp而不是.php)的 swp 文件有关。如果 Web 服务器未配置为不提供隐藏文件,.swp则将提供该文件。而且由于它不是 php 文件,因此将提供原始内容(php 源代码而不是解释结果),这可能会泄露数据库密码等敏感信息。

这就是为什么通常配置 Web 服务器不是提供隐藏文件或以~常见编辑器备份或临时文件名模式结尾或遵循的文件。

即使vim很荣幸umask并且您有一个非常严格的限制umask077但在常见情况下(想想云托管的 Web 服务器部署),它仍然没有帮助,在这种情况下,只涉及一个用户,并且文件.swp是使用相同的创建的所有者作为正在编辑的文件。

更好的解决方案是告诉您在只有您有权访问的目录中vim创建文件。看swpdirectory vim

:h swap-file

vim了解详情。

或者更好的是,不要直接在 Web 服务器提供的区域中编辑文件,而是在单独的副本上编辑文件,例如 git 或其他工作副本,您可以在其中处理、跟踪更改并将新版本推送到实际的 Web服务器一旦你满意了。


严格来说,权限也存在潜在问题。vim将使用与该文件的编辑文件相同的权限.swp(此处不涉及 umask),但不会复制 ACL(如果有)。在文件上拥有用户 ACL,意味着返回的权限字段stat()将被视为对该文件具有额外的权限团体(由于 ACL 掩码),并且.swp在这些情况下文件对于组来说可能具有太宽的权限。

相关内容