'ptrace_scope'是用于Wine程序的解决方法,它有什么作用?是否存在风险?

要在WINE中运行某些Windows程序,您需要使用以下解决方法:
echo 0|sudo tee /proc/sys/kernel/yama/ptrace_scope

根据支持网站的说法,这是由于Ubuntu内核中的一个错误导致ptrace和WINE无法很好地协同工作。
使用上述命令将ptrace设置为0,根据我所做的研究(不要问我是哪些网站,我看了很多),ptrace与程序之间的交互有关。0设置比1更宽松。
我必须假设Ubuntu希望将ptrace设置为1有充分的理由,这让我回到了问题的简短形式。
设置ptrace=0是否存在任何风险?安全性降低?调试问题?还有其他我没有考虑到的问题吗?
附言:对于阅读此文并想知道该错误会导致什么后果的人来说,Windows程序将完全无法打开,在系统监视器中,您将看到许多程序尝试打开,然后最终全部退出,如果您从终端运行程序,将收到告诉您已达到程序实例的最大数量的错误信息。

这是一个与PlayOnLinux弹出的错误消息相关联的描述,该错误消息会中止.Net 4.5的安装,除非将ptrace_scope设置为0:https://www.playonlinux.com/en/topic-10534-Regarding_ptrace_scope_fatal_error.html - pabouk - Ukraine stay strong
4个回答

短答案:目前没有实际危险,但请继续阅读以了解更好的方法...
这个ptrace是什么东西?

这是Ubuntu内核的一个错误,阻止了ptrace和WINE之间的良好协作。

  • 不,ptrace保护是Ubuntu 10.10左右首次引入的故意的内核安全措施。它不是一个错误,因此不会被“修复”。

  • 简单来说,默认的ptrace_scope值为1会阻止一个进程检查和修改另一个进程,除非第二个进程(子进程)是由第一个进程(父进程)启动的。

  • 这可能会影响到一些在Wine下运行的程序,因为wineserver提供了“Windows服务”给这些程序。

ptrace_scope设置为0有哪些风险?

  • 这将恢复旧有的行为,其中一个进程可以“追踪”另一个进程,即使它们之间没有父子关系。

  • 理论上,恶意软件可以利用此功能来损害您/您的计算机;例如,它可以附加到Firefox并记录您的所有URL/密码等。但实际上,除非您盲目地从随机网站安装二进制deb文件等,否则这种情况极不可能发生。

  • 就调试而言,对于gdb、strace等程序,实际上需要将0设置为非子进程的附加权限,除非您以提升的特权(sudo)运行它们。

解决方法存在哪些问题?

解决方法有些问题,因为`ptrace_scope`是一个全局值,当它被设置为`0`时,系统上的所有进程都不受非子进程限制。
如果您使用这个解决方法,请将其放在一个简单的bash脚本中,在启用它后运行您的Windows程序,然后在退出时禁用(设置为1)。 请勿像论坛帖子建议的那样将`ptrace_scope`设置为可写入(666),因为这会带来巨大的安全风险,现在任何进程都可以随意更改它!
有更好的解决方案吗?
更安全且不需要重复修改ptrace_scope的更好解决方案是授予Wineserver ptrace权限
在终端中执行以下命令: ``` sudo apt-get install libcap2-bin sudo setcap cap_sys_ptrace=eip /usr/bin/wineserver sudo setcap cap_sys_ptrace=eip /usr/bin/wine-preloader ```
这将使"wineserver"和"wine-preloader"二进制文件免除非子进程ptrace限制,并允许它们对任何进程进行ptrace操作。
这只需要执行一次,而且更安全,因为这些二进制文件通常来自可信的来源 - 官方软件库或官方Wine PPA,所以它们不会是恶意软件。
如果您使用Crossover:
安装libcap2: ``` sudo apt-get install libcap2-bin; ```
然后,为Crossover添加一个例外:
sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wineserver; sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wine-preloader;
最后,将其库添加到ld.so.conf中(否则会出现“error while loading shared libraries: libwine.so.1: cannot open shared object file: No such file or directory”):
echo /opt/cxoffice/lib/ | sudo tee /etc/ld.so.conf.d/crossover.conf sudo /sbin/ldconfig

我认为之所以称之为一个bug,是因为在Wine被修补以支持它后,ptrace在10.10版本中运行良好。它在10.10-11.10版本中一直正常工作,但在12.04版本中出现了退化。 - TrailRider
感谢接受,@TrailRider;我是在指你说的“这是内核中的一个bug”(实际上并不是);对于Wine来说,这确实是一种bug,应该被解决掉 :) 内核有时候确实会发生变化,通常是为了更好的改进,而受影响的软件需要自行修复,而不是告诉Linus“嘿,老兄,回退一下吧” :P - ish
我明白你在这里说的并且同意,我只是说它是内核中的一个错误,因为几个支持网站和Codeweavers都称其为内核错误。这是Codeweavers关于此问题的页面。http://www.codeweavers.com/support/wiki/linux/faq/ubuntu1204 - TrailRider
3我将全局的 ptrace 设置为 0,在应用程序启动后几秒钟又设置回 1;使用 setcap 更安全,而且不会像经常要求输入 sudo 那样令人烦恼。谢谢! - Aquarius Power
@izx:谢谢你的回答。如果能添加关于“eip”指的是什么的信息会很有趣(在这里解释了:http://www.andy-pearce.com/blog/posts/2013/Mar/file-capabilities-in-linux/)。此外,我建议在reptyr文档中推荐这种方法,作者回复说这可能是一个安全问题:https://github.com/nelhage/reptyr/pull/27#issuecomment-29486673 - 如果你能详细说明一下,那就太好了。 - blueyed
你觉得在这种情况下有没有什么变通的方法?http://askubuntu.com/questions/526156/multiple-wine-versions-using-setcap-cap-sys-ptrace-eip - Aquarius Power
我不认为 sudo setcap cap_sys_ptrace=eip ... 更安全,因为根据描述(man capabilitiescapability.h),这个能力允许程序追踪任何进程(就像以 root 权限运行一样),而不仅仅是同一用户的进程。如果我错了,请纠正我。 - pabouk - Ukraine stay strong
在使用/opt/wine-devel中的Wine设置时,添加两行到ld.so.conf文件中会有帮助 - 我还在第二行添加了一个lib64文件夹,然后它就可以工作了。谢谢! - Igor Zinov'yev
@izx 如何在PlayOnLinux上使其工作? - Roman M. Koss
这个也适用于PlayOnLinux吗? - Aaron Franke
如何将setcap恢复为默认值? - Exil
它在PlayOnLinux上运行正常。 - Exil
对于Wine PPA,我执行了以下命令:echo /opt/wine-devel/lib64/ | sudo tee /etc/ld.so.conf.d/wine64.confecho /opt/wine-devel/lib/ | sudo tee /etc/ld.so.conf.d/wine.conf。请注意,在echo参数的末尾加上/,否则它将无法正常工作! - melkyades
此外,对于64位可执行文件,您还需要调用setcap命令来设置/opt/wine-devel/bin/wine64-preloader的权限。 - melkyades

ubuntuforums.org上,我得到了一个带有以下链接的答案。

https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection

这是从链接中复制的内容(加上了我的强调)。
随着Linux的普及,它将成为恶意软件的日益增长目标。 Linux进程接口中一个特别令人担忧的弱点是,单个用户能够检查其任何进程的内存和运行状态。例如,如果一个应用程序(如Firefox)受到攻击,攻击者可以附加到其他正在运行的进程(如GPG代理),以提取额外的凭据并继续扩大他们的攻击范围。
这不是一个理论性问题。如果正常情况下允许ptrace,SSH会话劫持甚至任意代码注入都是完全可能的。
解决方案之一是,某些应用程序使用prctl()来明确禁止此类ptrace附加(如ssh-agent)。更通用的解决方案是只允许父进程直接对子进程进行ptrace(即直接gdb和strace仍然可用),或者作为root用户(即gdb BIN PID和strace -p PID仍然作为root用户工作)。
该行为通过/proc/sys/kernel/yama/ptrace_scope sysctl值进行控制。默认值为“1”,以阻止非子级ptrace。值为“0”将恢复先前更宽松的行为,这对于某些仅具有管理员帐户的开发系统和服务器可能更合适。使用“sudo”也可以通过CAP_SYS_PTRACE功能临时授予ptrace权限,尽管这种方法允许对任何进程进行ptrace。
所以我猜简短的答案就是,它的安全性较低,但个人电脑遭受这种攻击的可能性非常小。

更新 上述指示:

sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wineserver;
sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wine-preloader;

截至2018年9月15日,在Ubuntu 18.04.1和PlayOnLinux v.4.2.12上,使用最新稳定版本的Wine(v.3.0.1),无法正常工作。已经安装了libcap2。
在Gnome终端中显示的错误信息如下:
Failed to set capabilities on file `/usr/bin/wineserver' (Invalid argument)
The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

不确定那是什么意思......但是我想把它放出来让任何人来解释,也许能有一个新的、可行的解决方案。
谢谢。

在Ubuntu 19.10上,/usr/bin/wineserver/usr/bin/wine-preloader实际上是符号链接而不是文件。这可能也适用于18.04版本。我在另一个帖子中看到了以下解决方案,但现在无法找到了。请尝试使用以下方法:
sudo setcap cap_sys_ptrace=eip "$(readlink -f "/usr/bin/wineserver")"
sudo setcap cap_sys_ptrace=eip "$(readlink -f "/usr/bin/wine-preloader")"

根据您使用的葡萄酒软件包不同,您需要添加以下内容之一: echo /opt/wine-stable/lib/ | sudo tee /etc/ld.so.conf.d/wine.conf 或者: echo /opt/wine-staging/lib/ | sudo tee /etc/ld.so.conf.d/wine.conf 然后执行以下命令: sudo /sbin/ldconfig