相同的 execve 会导致一个程序“权限被拒绝”,但不会导致另一个程序“权限被拒绝”

相同的 execve 会导致一个程序“权限被拒绝”,但不会导致另一个程序“权限被拒绝”

当我尝试在 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_creationforks 来模仿 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 的案例提交给双方德文错误 497Debian 错误 966343

答案1

这是一个理论,而不是结论性的答案......

拒绝许可还有其他原因。我脑海中浮现出的一个是应用装甲。我还没有检查这是否会影响您发行版上的 Thunderbird。当阻止程序访问时,它应该写入系统日志,因此请检查/var/log/syslog

这可以清楚地解释您的问题,因为 AppArmor 是按程序配置的,并且默认情况下会让未知程序执行它们喜欢的操作。雷鸟可能有一个 AppArmor 配置文件,阻止它执行其他程序 (OpenOffice)。您自己的测试程序不会有这样的配置文件。

相关内容