与通过参数传递(Linux)相比,通过标准输入将敏感数据传递给另一个脚本真的安全吗?

信息安全 密码 linux Debian x11
2021-09-04 06:20:57

是的,通过参数传输到脚本是通过等可见的ps -ax/proc/<pid>/cmdline但是如果有人已经从外部获得了对您帐户的访问权限(例如通过入侵您的浏览器),他不仅可以轻松查看ps -ax,而且还可以定期拦截/proc/<pid>/fd/0(一旦被拦截,第二次被跳过,以减少可疑)。

但这没什么,因为如果入侵者访问了您的帐户,他只需运行键盘记录器(监听 x11 服务器)并拦截击键并不难。

我目前正在编写一个通过 sudo (root) 运行并接受敏感数据的脚本。当直接将它们(作为参数)发送到脚本时,我可以使用 sudo ( user ALL = (root) NOPASSWD: /bin/program [0-9][0-9a-z][0-9a-z]...) 硬限制参数中使用的字符,以便攻击者无法使用特殊字符组合绕过限制并因此获得 root 访问权限。

通过管道(stdin)获取数据时,我当然也会过滤数据:

#!/bin/sh
pass=$(dd if=/dev/stdin bs=1 count=10 2>/dev/null | tr -cd [:alnum:])

,但我认为通过 sudo 限制参数的简单规则更安全(在脚本本身中也会有额外的检查)。

那么通过标准输入或参数之间有根本的区别吗?

4个回答

/proc/<pid>/fd/0只能由进程所有者和 root 读取。/proc/<pid>/cmdline所有用户都可以阅读。

除了进程的命令行与其管道所需的不同权限之外,请考虑:

命令行经常出现在审计日志、shell 历史或类似内容中;传递给标准输入的数据没有。

从程序启动到停止(可能是很长的时间),命令行在任何时候都是可见的,即使没有记录命令行或持有对进程的引用。标准输入(和其他管道)中的数据是短暂的;如果你想拦截它,你需要在正确的时间(写之后和读之前)这样做。

重要的部分不是关于攻击者完全破坏您的帐户。

典型 Linux 系统上的任何帐户都可以运行ps并查看其他帐户在运行什么。

即使您的特定机器是个人的并且只有一个(人类)用户,典型的现代 Linux 系统也会创建大约 25 个帐户供内部使用(只需查看您的/etc/passwd.

它们的存在是有原因的——如果某些子系统受到损害,可以限制损害。

通过向这些帐户公开重要信息,您可以有效地绕过此机制。

我认为你的问题的标题和你的问题的主体有点矛盾,我认为这可能会导致与其他正确答案的一些混淆。

您的标题说“它真的安全吗”,但在您的请求正文中,您正在比较通过标准输入与命令行参数传递的数据。当您比较两件事时,比较的结果仅与比较有关,并且绝不允许您在比较本身之外做出绝对声明。例如:数字 10 比数字 5 多。所以 10 比 5“大”。但是当数字明显更大时,10 是一个“大”数字吗?我不能仅仅因为它比其他数字大就说“10 是一个大数字”。

所以:“安全吗?” 是一个问题,但您的问题实际上是在暗示:“它更安全吗?” 强调“更安全”的额外“r”。

就像总是有更大的数字时说 10 是一个大数字是没有意义的:信息安全中没有什么是 100%“安全”的。正如您所指出的,存在可能允许攻击者获取通过标准输入传递的数据的攻击向量。关键是,允许攻击者访问通过标准输入传递的数据的攻击向量要少得多。并且这些向量更难以实现。

正如其他答案所指出的:通过命令行参数传递的数据在很长一段时间内都是可见的。它们经常登录到日志文件以及 .bash_history 等历史文件中。这些日志文件和历史文件可以备份到云中,复制到其他文件夹、磁盘等。这些数据也对其他可能受到损害的系统帐户可见。换句话说:攻击者有很多可用的攻击向量来访问命令行参数数据。而且由于这些数据会保留多长时间以供查看,攻击者还有更大的时间窗口,他可以利用这些时间窗口来执行这些攻击并仍然访问命令行数据。

使用标准输入,不仅向量更少:而且攻击者也有有限的时间窗口来执行成功的攻击。他必须专门破坏您的帐户或root。这两者都比破坏其中一个系统帐户更困难。然后假设他成功发起了攻击以破坏您的帐户或 root:现在他只能看到实时传递到标准输入的数据。他无法返回并查看 bash_history 或日志文件以查看来自标准输入的数据。

在较少数量的攻击向量和时间问题之间:很明显,通过标准输入传递数据更安全。这才是最重要的:事情不可能 100% 万无一失/安全。安全方面的一切都是关于选择最安全的选项,以最大限度地减少攻击向量的数量或可能受到攻击并导致系统受损的点的暴露“表面积”。

所以:TL;DR:不,标准输入不是 100% 安全的。但它比命令行参数安全得多,这就是为什么它比使用命令行参数传递密码等敏感数据更受欢迎的原因。