Kali Nethunter Chroot 中 `apt` 解析错误的临时解决方案及其原理

背景

最近在我的 Kali Nethunter 环境中折腾,启动 chroot (chroot kali) 后遇到了一个颇为诡异的问题:

  • DNS 配置看起来一切正常,/etc/resolv.conf 文件内容无误。kali默认是使用的OpenDNS。
  • 使用 ping google.comdig google.com 均能成功解析域名并获得响应。
  • 但是,一旦运行 apt updateapt install <package>,就会收到大量针对软件源的解析错误,例如 "Temporary failure resolving ‘http.kali.org’" 等。这种情况修改各种源都没有作用。

更新失败,修改resolv也没用

尝试了修改 resolv.conf、重启网络服务等常规操作,均无济于事。经过研究,发现这个问题似乎并不罕见,在一些 Nethunter 用户中时有发生。

意外的解决方案

在一番搜索后,我在LinuxDo的评论区找到了一个看似“神奇”的解决方案,它并不直接涉及网络配置,而是修改了 /etc/passwd 文件:

  1. 使用编辑器(如 nanovim)打开 chroot 环境内的 /etc/passwd 文件:
    nano /etc/passwd
  2. 找到以 _apt 开头的那一行,它通常看起来像这样(UID 可能会不同):
    _apt:x:42:65534::/nonexistent:/usr/sbin/nologin

    或者在标准的 Debian/Ubuntu 上可能是:

    _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
  3. 关键在于第二个冒号和第三个冒号之间的数字,这是 _apt 用户的 UID。在我的例子中,这个数字是 42
  4. 将这个 UID 修改为 0
    _apt:x:0:65534::/nonexistent:/usr/sbin/nologin
  5. 保存文件并退出。

再次运行 apt update,问题竟然解决了!apt 能够成功连接软件源并更新列表。

apt成功更新

原理剖析:为何修改 _apt UID 有效?

要理解这个方法为何有效,我们需要了解 _apt 用户和 Linux 的权限机制:

  1. _apt 用户与权限分离 (Privilege Separation)

    • 在 Debian 及其衍生发行版(如 Kali)中,_apt 是一个特殊的系统用户。
    • 它的存在是为了实现权限分离。当 apt 工具需要执行网络操作(如从软件源下载包列表或软件包)时,它会放弃 root 权限,转而使用这个低权限的 _apt 用户身份来执行这些操作。
    • 安全考量:这样做的好处是,即便 apt 在连接到恶意软件源或处理有问题的网络数据时存在漏洞,攻击者也只能获得 _apt 用户的有限权限,而不是整个系统的 root 权限,从而大大降低了潜在的安全风险。虽然这个安全保护做得很边缘,毕竟apt源被投毒的概率很低,nologin配置进一步限制了它只能用于调起进程。但是Linux还是很细心地做了最安全模型。
  2. Chroot 环境与网络访问限制

    • pingdig 通常是由当前登录的用户(在 chroot 中大概率是 root)直接执行的,它们能直接利用系统的网络配置进行 DNS 解析。
    • 然而,在某些特定的 chroot 环境中,尤其是像 Android 上的 Nethunter,系统可能对非 root 用户的网络访问(包括 DNS 解析)施加了额外的限制。Android 本身有一套复杂的网络管理和权限体系,而这个体系和Nethunter之间有时会引发冲突。
    • apt 尝试降权到 _apt 用户(就可能因为某些限制而失败,导致无法解析域名。
  3. UID 0 的魔力

    • 在 Linux 系统中,UID 0 是为 root 用户保留的,拥有系统的最高权限。
    • 通过将 /etc/passwd 文件中 _apt 用户的 UID 修改为 0,我们实际上是告诉系统:“当 apt 说要用 _apt 用户时,请把它当作 root 用户对待。”
    • 因此,当 apt 进行网络操作时,它实际上是以 root 权限执行的。root 用户通常拥有无限制的网络访问权限,能够绕过那些可能阻止低权限用户(如原始 UID 的 _apt 用户)访问网络的限制。

简而言之,这个修改使得 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)

One thought on “Kali Nethunter Chroot 中 `apt` 解析错误的临时解决方案及其原理

  1. 补充和纠正:
    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
    “`

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注