前几天遇到的一个状况,给大家探讨一下: Linux 下普通用户使用 sudo 删掉了 libc.so,如何恢复?

2017-12-28 18:18:15 +08:00
 rrfeng
问题已经解决了,就想看看大家能想到什么办法。
3639 次点击
所在节点    问与答
34 条回复
ironx
2017-12-28 20:11:56 +08:00
@rrfeng 当然可以,不然怎么能叫恢复模式
geelaw
2017-12-28 20:15:09 +08:00
@msg7086 展开来说:

- 如果按照 UAC (管理员确认模式)的思路用 sudo,那么用户是知道 root 的密码的。
- 如果是 run as different user 的模式用,那么用户旁边有一个知道 root 密码的人,发现出错的时候(我并不知道此时 sudo 用不了了,如果造成的错误不会无效化 sudo 的运行),那么这个人可以请旁边的人再输入一次密码。

应该把“能 sudo 的普通用户”理解为让 sudo 改变用户成功那一刻的电脑使用对象,它可以是一个人(第一种情况)或者几个人(第二种情况)。同时提到另一个我们正在讨论的话题的话,这就像是“攻击者”并不需要是一个具体的人,可以是一段单机程序,或者一个黑客组织,或者一个分布式网络。
msg7086
2017-12-28 20:20:33 +08:00
@rrfeng 补充一下 @ironx 的回答。
恢复模式下是由内核 initrd 直接转交给 init = busybox 启动的,因为 busybox 不依赖任何其他组件,所以可以独立工作,比如 mount 或者 cp mv。
msg7086
2017-12-28 20:25:34 +08:00
@geelaw 相反,很多现代化发行版的 root 甚至是没有密码的,所以你可能连「知道 root 密码」这件事都做不到。
(比如典型安装的 Ubuntu 就没有 root 密码。)
另外,如我所说,sudo 是验证「本人」密码。哪怕你知道 root 密码,也不可能在普通用户账号上通过 sudo 提权,只有知道当前账号密码的人才能过 sudo 验证。

最后,删掉系统库以后,整个系统所有依赖 C 运行时的程序都无法运行,不仅仅是 sudo,几乎所有的程序都是无法启动的。
a1044634486
2017-12-28 20:25:51 +08:00
@geelaw 你是来搞笑的吗?
sudo 输入的不是当前用户的密码???
a1044634486
2017-12-28 20:26:38 +08:00
上面少打一个吗
sudo 输入的不是当前用户的密码吗?
Kirscheis
2017-12-28 20:29:12 +08:00
这楼感觉要歪了,我解释一下吧

1. 如果你能接触到物理机,只要你没有开磁盘加密,最简单的方法就是直接用另一个系统挂载原来的磁盘,这时候原本的权限已经无效了。

2. 我给的第二个方法是假设你接触不到物理机,rsync, cp, wget 这些都失效的情况下,怎样可以在机器上弄出一个 glibc。因为这种事故下不见得一定要先去搞环境。先把 libc.so 放在自己的目录下,用这个 glibc 把数据先救出来转移到备机,然后再恢复环境。

3. 因为我假设你已经把 glibc 删干净了,所以我没说 LD_PRELOAD。如果你系统里甚至还有 libc.so 的副本,那这根本就不算什么问题。。

4. 我提了一下 busybox,因为它可以静态编译,所以不受没有 glibc 的影响。这种情况下,一般要先想办法稳定环境,所以要先开一个不依赖 glibc 的备用接入点,以免在修复中途因为网络之类的问题导致唯一剩下的接入点坏掉。另外,busybox 可以加入 /dev, /etc 和 kernel 做成一个新的系统,用来恢复原本的系统。
gam2046
2017-12-28 20:31:07 +08:00
@geelaw sudo 并不需要知道 root 密码。实际上你可以试试。sudo 验证的是当前用户的密码,即执行 sudo 命令的用户密码。

$ sudo su
# passwd // 重置 root 密码
# exit
$ sudo // 此时要求你输入的并不是 rootd 的密码
geelaw
2017-12-28 20:37:44 +08:00
@msg7086 #24
@a1044634486 #25

我应该换一种说法,请把 sudoers 和 root 理解为 Windows 下的 Administrators 组,并假设我用这些词儿的时候意思都是“具有控制电脑权限的人”。(*nix 用户和非 *nix 用户果然还是很难交流)

问题:一个用户是 sudoer,它和 root 有什么区别?
(问这个问题是因为在 Windows 上内置管理员和其他管理员没有什么区别:惟一的区别是是否有一个特殊设置可以免除 UAC 确认,但是这个功能没有安全意义——一个用户可以以高权限令牌启动 PowerShell,此后便不再需要 UAC )
rrfeng
2017-12-28 20:39:49 +08:00
@geelaw
sudo 就是 linux 下的一个指令。还是不要搞混了的好。
geelaw
2017-12-28 20:44:01 +08:00
@geelaw #29
@rrfeng #30

Ah I see,Wikipedia 告诉我 sudo 允许的权限是 root 的权限的子集。能删除但不能修改和创建似乎也不是没有道理的设置。但无论如何,既然 sudo 已经无法运行,那就当我没说即可。
rrfeng
2017-12-28 20:45:08 +08:00
@Kirscheis
@msg7086

确实对于 busybox 不熟悉,所以只需要下载一个 busybox (通过 LD_PRELOAD 之类的办法),然后重启并引导到 busybox 启动。
赞。
msg7086
2017-12-28 20:49:37 +08:00
@geelaw 不是很难交流,而是混淆了一些基本概念。
Windows 上也是类似的,唯有一点不同的是你用户本身就是特权组身份,提权不会切换身份,只会切换权限旗标。
而 Linux 下 root 仅有 ID=0 账号,特权组提权是通过切换身份完成的。

Windows 上 UAC 提权是输入自己账号的密码,相当于 Linux 下的 sudo。
Windows 上普通权限用户提权是输入特权账号和密码,相当于 Linux 下的 su。

问题:一个用户是 sudoer,它和 root 有什么区别?
完全不同,而且没有任何相同点。
一个 sudoer 和 root 的关系是完全依靠 sudo 程序来提权的,没有了 sudo (比如,没有安装 sudo 软件的话),sudoer 和 root 便没有任何关系。
你完全可以自己花几分钟写一个脚本,根据用户的年龄、生日、体重、身高、天气等等,来决定谁能够提权成为 root,而不是是否为 sudoers。
msg7086
2017-12-28 20:53:21 +08:00
@rrfeng 很多系统都预装了 busybox。毕竟万一文件系统出错,内核异常,各种不可预见的错误发生时,busybox 是最后一道防线,很少会有系统不自带 busybox。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/418383

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX