背景
最近在我的 Kali Nethunter 环境中折腾,启动 chroot (chroot kali
) 后遇到了一个颇为诡异的问题:
- DNS 配置看起来一切正常,
/etc/resolv.conf
文件内容无误。kali默认是使用的OpenDNS。 - 使用
ping google.com
或dig google.com
均能成功解析域名并获得响应。 - 但是,一旦运行
apt update
或apt install <package>
,就会收到大量针对软件源的解析错误,例如 "Temporary failure resolving ‘http.kali.org’" 等。这种情况修改各种源都没有作用。
尝试了修改 resolv.conf
、重启网络服务等常规操作,均无济于事。经过研究,发现这个问题似乎并不罕见,在一些 Nethunter 用户中时有发生。
意外的解决方案
在一番搜索后,我在LinuxDo的评论区找到了一个看似“神奇”的解决方案,它并不直接涉及网络配置,而是修改了 /etc/passwd
文件:
- 使用编辑器(如
nano
或vim
)打开 chroot 环境内的/etc/passwd
文件:nano /etc/passwd
- 找到以
_apt
开头的那一行,它通常看起来像这样(UID 可能会不同):_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
或者在标准的 Debian/Ubuntu 上可能是:
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
- 关键在于第二个冒号和第三个冒号之间的数字,这是
_apt
用户的 UID。在我的例子中,这个数字是42
。 - 将这个 UID 修改为
0
:_apt:x:0:65534::/nonexistent:/usr/sbin/nologin
- 保存文件并退出。
再次运行 apt update
,问题竟然解决了!apt
能够成功连接软件源并更新列表。
原理剖析:为何修改 _apt
UID 有效?
要理解这个方法为何有效,我们需要了解 _apt
用户和 Linux 的权限机制:
-
_apt
用户与权限分离 (Privilege Separation):- 在 Debian 及其衍生发行版(如 Kali)中,
_apt
是一个特殊的系统用户。 - 它的存在是为了实现权限分离。当
apt
工具需要执行网络操作(如从软件源下载包列表或软件包)时,它会放弃 root 权限,转而使用这个低权限的_apt
用户身份来执行这些操作。 - 安全考量:这样做的好处是,即便
apt
在连接到恶意软件源或处理有问题的网络数据时存在漏洞,攻击者也只能获得_apt
用户的有限权限,而不是整个系统的 root 权限,从而大大降低了潜在的安全风险。虽然这个安全保护做得很边缘,毕竟apt源被投毒的概率很低,nologin配置进一步限制了它只能用于调起进程。但是Linux还是很细心地做了最安全模型。
- 在 Debian 及其衍生发行版(如 Kali)中,
-
Chroot 环境与网络访问限制:
ping
和dig
通常是由当前登录的用户(在 chroot 中大概率是 root)直接执行的,它们能直接利用系统的网络配置进行 DNS 解析。- 然而,在某些特定的 chroot 环境中,尤其是像 Android 上的 Nethunter,系统可能对非 root 用户的网络访问(包括 DNS 解析)施加了额外的限制。Android 本身有一套复杂的网络管理和权限体系,而这个体系和Nethunter之间有时会引发冲突。
- 当
apt
尝试降权到_apt
用户(就可能因为某些限制而失败,导致无法解析域名。
-
UID
0
的魔力:- 在 Linux 系统中,UID
0
是为root
用户保留的,拥有系统的最高权限。 - 通过将
/etc/passwd
文件中_apt
用户的 UID 修改为0
,我们实际上是告诉系统:“当apt
说要用_apt
用户时,请把它当作root
用户对待。” - 因此,当
apt
进行网络操作时,它实际上是以root
权限执行的。root
用户通常拥有无限制的网络访问权限,能够绕过那些可能阻止低权限用户(如原始 UID 的_apt
用户)访问网络的限制。
- 在 Linux 系统中,UID
简而言之,这个修改使得 apt
在进行网络通信时不再降权,而是始终以 root
权限运行,从而解决了在特定 Nethunter chroot 环境下低权限用户网络访问受限的问题。
安全性与实用性的权衡
重要提示:将
_apt
用户的 UID 修改为0
会牺牲apt
的权限分离安全机制。这意味着,如果apt
连接到一个被篡改的恶意软件源,或者其网络处理部分存在可利用的漏洞,攻击者可能会直接获得 chroot 环境的root
权限。
这是一种权宜之计,而非根本性的修复。
然而,考虑到 Nethunter 的使用场景:
- 临时性与特定目的:Nethunter 通常用于渗透测试、安全研究等特定任务,很多时候是在受控或临时的环境中使用。
- 用户认知:使用 Nethunter 的用户通常对安全风险有一定认知,并且可能更看重工具的即时可用性。
- 潜在的 Bug:正如我观察到的,Nethunter chroot 中创建非 root 用户后,有时会遇到各种命令执行问题,这可能暗示了 chroot 环境或其与 Android 系统交互层面存在一些更深层次的权限或配置问题。在这些根本问题得到解决之前,这种“不安全但实用”的方法或许是必要的妥协。
因此,对于专门用于临时渗透测试的 Nethunter 环境,在官方修复此类 bug 或提供更优雅解决方案之前,将 _apt
UID 修改为 0
可以作为一个快速恢复 apt
功能的方法。但务必清楚其潜在的安全风险。
结论
修改 _apt
用户的 UID 为 0
解决了 Nethunter chroot 中 apt
解析失败的问题,其原理是让 apt
的网络操作以 root
权限执行,绕过了低权限用户可能遇到的网络访问限制。虽然此方法会降低 apt
本身的安全性,但在特定的 Nethunter 应用场景下,它不失为一种实用的临时解决方案。
希望未来 Nethunter 或相关的 chroot 实现能够更好地处理非 root 用户的权限和网络访问问题,让我们不再需要这样的“hack skill”。
(本文让Gemini2.5Pro润色,NCC表示心旷神怡并亲了亲提供模型的hxzzz)
补充和纠正:
NCC头脑发热搞错啦,这不是一个没有修复的Bug,而是分区使用nosid挂载选项导致, nosuid 选项会禁用 setuid 和 setgid 位,阻止进程提升权限。实际上执行这个看看是不是有就好:
“`bash
mount | grep /usr
mount | grep /bin
“`
然后重新挂载:
“`bash
sudo mount -o remount,suid /usr
sudo mount -o remount,suid /bin
“`