【安全】Linux 版本使用 `CAP_NET_ADMIN` 获取网络权限
问题描述
当前(测试版本:7.10.5),为了开启 TUN 模式,v2rayN 仍然使用保存并加密 sudo 密码的方式。但是这种方法不仅导致密码被可解密地(不同于 Linux 内核的哈希方法)保存在本地,而且默认配置文件是普通用户可读的;事实上,整个 /opt/v2rayn 都是如此。
这不是 Linux 权限系统的常规做法,是否被看做一个潜在安全风险?
替代方法
考虑到 libcap2 包及其提供的 setcap 工具在大多数发行版中都是默认包含的,我认为使用 CAP_NET_ADMIN 权限单独授权 sing-box 内核执行操作,更符合 Linux 权限系统的要求和推荐做法,例如:
sudo setcap cap_net_admin=+ep $SING_BOX_LOCATION
当然,这会与 SE Linux 和 AppArmor 这类拓展权限系统产生冲突,但是在桌面端启用这些功能似乎不太常见。
备注
我不熟悉 C# 和 v2rayN 的代码,可能无法 PR,不过这似乎不难实现。
这不是 Linux 权限系统的常规做法,是否被看做一个潜在安全风险?
@tokenicrat 对,它就是非常简单明了的安全风险,直接绕过了 Linux 现有大部分的安全机制。
我之前发过一个相同内容的帖子,并建议开发者参考 nekoray,只在需要 root 权限的时候才向用户请求权限,并且应用程序本身不存储 root 密码。
最终,开发者嫌这么做很麻烦,拒绝了我的提议,只是把 root 密码加密存储在应用数据中。
- https://github.com/2dust/v2rayN/issues/6071
说实在,这种保存 root 密码的做法,我目前只遇到 v2rayN 是这么干的。Linux 又不是 windows,拿到了 root 密码,真的是可以对系统为所欲为,有能力的话直接干废用户的硬件又不是非常困难的事情。
因为相似的态度(觉得麻烦,不想做),拒绝实现的功能还有:
- https://github.com/2dust/v2rayN/issues/6008
开发者连 KDE 这种最多人使用的桌面环境之一都不愿意适配一下,我当时就感觉开发者对 Linux 的支持只是顺带做一下,主力目标人群依旧是 Windows/MacOS,于是我决定不再使用 v2rayN 了。
系统管理员必须极其谨慎地管理 root 密码和其他特权访问凭据,因为像 sudo rm -rf / 这样的命令足以在瞬间摧毁系统。
开发者能力有限,有些功能确实不懂的如何来做,你可以 PR 来完善。
很可惜我完全没有 C# 基础,只能另候高人了 😮💨
个人认为,如果没有实现的计划,也应该删除保存密码的功能,然后要求用户每次启动都授权,或者指导用户在第一次使用时赋予内核网络权限。
clash-verge-rev 也不会保存密码,它只会在应用第一次启动的时候请求用户使用 root 权限注册一个专门用于 tun 网卡的 systemd 服务,然后用户每次开启 tun 网卡的时候,都不需要输入 root 密码。
Tokenicrat @.***> 于 2025年4月20日周日 上午11:15写道:
很可惜我完全没有 C# 基础,只能另候高人了 😮💨
个人认为,如果没有实现的计划,也应该删除保存密码的功能,然后要求用户每次启动都授权,或者指导用户在第一次使用时赋予内核网络权限。
— Reply to this email directly, view it on GitHub https://github.com/2dust/v2rayN/issues/7116#issuecomment-2816968685, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUZ22DH4E2Y6TENOXQWIFNT22MGMVAVCNFSM6AAAAAB3AUM6HKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDQMJWHE3DQNRYGU . You are receiving this because you commented.Message ID: @.***> tokenicrat left a comment (2dust/v2rayN#7116) https://github.com/2dust/v2rayN/issues/7116#issuecomment-2816968685
很可惜我完全没有 C# 基础,只能另候高人了 😮💨
个人认为,如果没有实现的计划,也应该删除保存密码的功能,然后要求用户每次启动都授权,或者指导用户在第一次使用时赋予内核网络权限。
— Reply to this email directly, view it on GitHub https://github.com/2dust/v2rayN/issues/7116#issuecomment-2816968685, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUZ22DH4E2Y6TENOXQWIFNT22MGMVAVCNFSM6AAAAAB3AUM6HKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDQMJWHE3DQNRYGU . You are receiving this because you commented.Message ID: @.***>
@tokenicrat
使用 sudo setcap cap_net_admin=+ep $SING_BOX_LOCATION 测试了下,在 Ubuntu 22 和 kde 环境下,
运行sing-box tun 配置后,确实可以跑起来了,但是还是缺少权限,会要求 3 次权限请求提示,这样这个方式就无法解决问题了。
测试方式大概如下,不涉及 v2rayN ` sudo setcap cap_net_admin=+ep $SING_BOX_LOCATION
sing-box run config.json `
clash-verge-rev 也不会保存密码,它只会在应用第一次启动的时候请求用户使用 root 权限注册一个专门用于 tun 网卡的 systemd 服务,然后用户每次开启 tun 网卡的时候,都不需要输入 root 密码。
这个是终极方案,就是开一个进程专门用来处理 TUN 要求的权限,这个老早就考虑过了。 但是这个方案在 C# 这边有很多问题,可以讨论。
- 用 C# 写的 控制台程序编译后体积巨大;
- 进程间通信很麻烦;
- 本应用主大便携版,不愿意在系统中注册服务等;
- v2rayN 主要专注 windows ,在 windows 上没有必要这么麻烦
使用 sudo setcap cap_net_admin=+ep $SING_BOX_LOCATION 测试了下,在 Ubuntu 22 和 kde 环境下, 运行sing-box tun 配置后,确实可以跑起来了,但是还是缺少权限,会要求 3 次权限请求提示,这样这个方式就无法解决问题了。
Arch Linux 和 KDE 复现了,确实。很奇怪,对 Clash 内核用这个方法就没啥问题(FlClash 测试),应该是 sing-box 调用了额外的权限。
这不是 Linux 权限系统的常规做法,是否被看做一个潜在安全风险?
@tokenicrat 对,它就是非常简单明了的安全风险,直接绕过了 Linux 现有大部分的安全机制。
我之前发过一个相同内容的帖子,并建议开发者参考 nekoray,只在需要 root 权限的时候才向用户请求权限,并且应用程序本身不存储 root 密码。
最终,开发者嫌这么做很麻烦,拒绝了我的提议,只是把 root 密码加密存储在应用数据中。
* [[Bug] 不赞同在本地文件中存储 root 密码,特别是这个密码是以明文形式进行存储 #6071](https://github.com/2dust/v2rayN/issues/6071)说实在,这种保存 root 密码的做法,我目前只遇到 v2rayN 是这么干的。Linux 又不是 windows,拿到了 root 密码,真的是可以对系统为所欲为,有能力的话直接干废用户的硬件又不是非常困难的事情。
因为相似的态度(觉得麻烦,不想做),拒绝实现的功能还有:
* [[Bug] v7.0.6 - v7.0.7 版本任务栏图标一直显示 #6008](https://github.com/2dust/v2rayN/issues/6008)开发者连 KDE 这种最多人使用的桌面环境之一都不愿意适配一下,我当时就感觉开发者对 Linux 的支持只是顺带做一下,主力目标人群依旧是 Windows/MacOS,于是我决定不再使用 v2rayN 了。
需求不一样吧。我这种啥也不懂的普通linux用户倒是觉得足够了😂感谢开发者能适配linux。对一个打打游戏上上网的普通用户来说那些安全需求跟新装一台电脑直接关闭系统更新的windows用户差不多都一样,最需要的还是使用方便和直观。只要不像qv2ray和neko那样,能长久使用稳定更新才是最大的刚需。
https://github.com/2dust/v2rayN/releases/tag/7.12.0
看这个更新,目前这种方案开发者认为已经是最优解了。
为什么我输入的密码是正确的,但是v2rayn开启tun时却提醒密码错误