(编辑:将原始问题留作背景;如果您不感兴趣,请跳至分隔线下方。)
我的住所最近停电了。不幸的是,由于我当时外出,我无法在 UPS 电池耗尽之前彻底关闭系统。
我的 Linux 机器看起来不错,但我的 FreeBSD (12.1) 机器无法启动。它没有出现登录提示,而是直接将我带入一个无特权的 shell,甚至不允许我登录su
。
我已经检查了 tty 启动消息(尽我所能,因为它们会滚动)以及/var/log/messages
,但唯一潜在的问题迹象是:
- 愤怒的嘟嘟声(比 POST 嘟嘟声低且稍长)
- 关于“MSI-X 表”的错误消息
/
以只读方式安装
我手动运行fsck
(在单用户模式下启动似乎工作正常,除非系统实际上不能像那样使用)是干净的。我正在存储阵列上运行 zpool scrap(操作系统位于 UFS 上,但这个盒子本质上是 NAS),但预计不会出现任何错误。除了一些打开的 sshfs 连接之外,系统在断电时不会执行任何操作。
其他注意事项:
- 该系统最初安装为 FreeBSD 12.0,很可能升级后从未启动过。
- 根 FS 已挂载并且“看起来”完好无损。 (阅读:我运行
ls
了几个目录,预期的文件似乎存在。 - 我已经从 ports 安装了一些东西(主要是 GNU CLI 工具),但据我所知没有 kmods 或类似的东西。该系统是相当基本的预算AMD+APU。
- 似乎所有物理按键都被记录在
/var/log/messages
?
可能出什么问题了?
编辑:嗯...我是有点一个白痴,尽管这仍然是 WTF?情况。然而,我现在不太确定机器自安装以来是否没有这样做过;现在我意识到发生了什么事,我想我以前见过这个,所以它可能与断电无关。 (我有没有提到它不会经常重新启动?)
我终于注意到我被扔进去的贝壳里有一些有趣的东西。你能发现它吗?这是启动后的最后几行:
Updating motd:.
Mounting late filesystems:.
Security policy loaded: MAC/ntpd (mac_ntpd)
Starting ntpd.
[ntpd@<redacted> /]$ █
...就是这样;没有登录,没有错误,没有网络,只有上面显示的完全削弱的命令提示符。
所以为什么它到底在做什么? (提示:^D“修复”了它,如果您注意到问题所在,您可能会想到这一点,但是为什么它会这样做吗?我希望我的系统无需手持即可启动!我怀疑这也意味着我有一个不工作的守护进程
答案1
有多种方法可以实现这一目标,但最简单的方法之一是破坏设置ntpd_flags
并/etc/rc.conf
有效地对自身执行命令注入攻击。
这就是为什么rc
基于 shell 脚本的系统很难正确运行。这是非常很难彻底地防御可能(意外)注入额外 shell 命令的所有方式,尤其是在printf
缺少%q
格式说明符时。
FreeBSD 的 Mewburnrc
脚本几乎没有针对此类事故进行防御性编码。请注意,例如,如果文件名包含空格,则该ntpd_config
文件名将不起作用。与某些引用相比,这是相当微不足道的引用。
是的,这不是紧急外壳。
答案2
啊,深奥的(也是我讨厌 BSD 的事情)。
FreeBSD 上的默认 shell 是 (t?)csh。我讨厌[t]csh。所以,我插入了一行.cshrc
来执行 bash。
问题:现在任何“作为”root (nb su -m
) 运行的 shell 都无法接受命令参数;它只会执行(交互式!)bash。
解决方案:改为执行 bash in .login
(这显然是特定于 csh 的)。