当我尝试在 Thunderbird 中打开某些附件时,会出现权限被拒绝的情况。然而,它看起来并不像 Thunderbird 错误,因为当我strace
处理该过程时,我看到它发出了正确的调用。然而它失败了。
11545 execve("/usr/local/bin/libreoffice6.4", ["libreoffice6.4", "--writer", "file:///tmp/user/1000/via%20alla%20quite%2012%20Laigueglia"], ["SHELL=/bin/bash", "WINDOWID=18874383", "QT_ACCESSIBILITY=1", "XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0", "XTERM_VERSION=XTerm(344)", ... ]) = -1 EACCES (Permission denied)
权限很好,我用namei
和进行了测试getfacl
。然后我将execve
指令复制strace -v -s 1024
到 C 文件并编译它。在这种情况下,它就成功了。每次我在 Thunderbird 中通过鼠标单击运行它时都会失败,每次我运行以下测试程序时它都会成功。
#include <unistd.h>
#include <stdio.h>
int main()
{
char *path="/usr/local/bin/libreoffice6.4";
char *argv[] =
{
"libreoffice6.4",
"--writer",
"file:///tmp/user/1000/via%20alla%20quite%2012%20Laigueglia",
NULL
};
char *envp[] =
{
"SHELL=/bin/bash",
"WINDOWID=18874383",
"QT_ACCESSIBILITY=1",
"XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0",
"XTERM_VERSION=XTerm(344)",
// ...
NULL
};
int rtc = execve(path, argv, envp);
perror("execve failed");
return rtc;
}
请注意,Thunderbird 可以正确打开多个附件。到目前为止,只有 LibreOffice 和自定义 shell 程序失败。两者都不是股票分配的一部分——Devuan Beowulf——但这不能解释失败,不是吗?
向 Thunderbird 报告该错误是没有意义的,因为它是旧的 68 版本,并且该错误可能已经修复,或者可能会在下次安装时自动消失。当然,如果我不知道到底出了什么问题,我就无法报告它。我不明白为什么访问会被交替拒绝和授予。
- 我在同一个用户 ID/会话下运行 Thunderbird 和稻草人程序。
- Thunderbird 似乎没有调用任何
trace=setuid,setfsuid,setreuid
. - 该
x
位在相关路径的每个部分上均打开。 - 我从来没有使用过 ACL。
编辑:手册页execve
列出了四个可能的原因EACCESS
:
- 对文件名路径前缀或脚本解释器名称的组成部分的搜索权限被拒绝。
- 该文件或脚本解释器不是常规文件。
- 文件、脚本或 ELF 解释器的执行权限被拒绝。
- 文件系统以 noexec 方式挂载。
这些似乎都不是真的。我将稻草人程序复杂化,添加了虚拟变量thread_creation
和fork
s 来模仿 Thunderbird 的行为。特别是,运行此可执行文件:
-rwxr-xr-x 1 root root 14328 Nov 6 2019 /usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop
请注意,它是 的一部分libglib2.0-0:amd64
,而不是 Thunderbird。
尽管如此,我仍无法重现 Thunderbird 所经历的失败。
Edit2:将针对 libc6 的案例提交给双方德文错误 497和Debian 错误 966343
答案1
这是一个理论,而不是结论性的答案......
拒绝许可还有其他原因。我脑海中浮现出的一个是应用装甲。我还没有检查这是否会影响您发行版上的 Thunderbird。当阻止程序访问时,它应该写入系统日志,因此请检查/var/log/syslog
。
这可以清楚地解释您的问题,因为 AppArmor 是按程序配置的,并且默认情况下会让未知程序执行它们喜欢的操作。雷鸟可能有一个 AppArmor 配置文件,阻止它执行其他程序 (OpenOffice)。您自己的测试程序不会有这样的配置文件。