我一直在关注 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))
作为一个常见的习语)。
这就是umask
shell 内置函数的作用。请注意,在多线程程序中,如果另一个线程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
并且您有一个非常严格的限制umask
,077
但在常见情况下(想想云托管的 Web 服务器部署),它仍然没有帮助,在这种情况下,只涉及一个用户,并且文件.swp
是使用相同的创建的所有者作为正在编辑的文件。
更好的解决方案是告诉您在只有您有权访问的目录中vim
创建文件。看swp
directory
vim
:h swap-file
内vim
了解详情。
或者更好的是,不要直接在 Web 服务器提供的区域中编辑文件,而是在单独的副本上编辑文件,例如 git 或其他工作副本,您可以在其中处理、跟踪更改并将新版本推送到实际的 Web服务器一旦你满意了。
严格来说,权限也存在潜在问题。vim
将使用与该文件的编辑文件相同的权限.swp
(此处不涉及 umask),但不会复制 ACL(如果有)。在文件上拥有用户 ACL,意味着返回的权限字段stat()
将被视为对该文件具有额外的权限团体(由于 ACL 掩码),并且.swp
在这些情况下文件对于组来说可能具有太宽的权限。