stdio通信的安全性

6

我正在开发一个程序(Linux),需要非常简单的基于文本的IPC。使用标准输入/输出管道非常容易。我可以相信发送到进程stdin的消息不会被任何人读取吗?此外,我可以相信如果我保持其stdout的管道,只有我可以读取它输出的内容吗?我只是想确保没有procfs-based trick可以从这些管道中读取。

4个回答

2
说实话,这取决于您认为应用程序需要多少安全性。我在标准输入上输入了我的GPG密钥密码。我总是问自己“什么是可接受的风险?”

尽管如此,没有什么能保护您的应用程序免受内核空间中的rootkit攻击。它可以读取不仅是标准输入/输出终端,而且还可以读取您运行时的整个进程内存。并且可能覆盖您已经放置的一些保护措施。

如果您真的需要那种级别的保护,您可以考虑使用SELinux沙箱技术与您正在进行的操作相结合 - 在http://danwalsh.livejournal.com/阅读更多有关它的信息。libselinux让您与之交互以检查保护是否存在等等。


我不需要像福特诺克斯那样的安全性 — 只是想确保没有任何严重的安全漏洞。 - c4757p

1

没有什么诀窍,我所能想到的唯一与检测stdout是否被重定向到其他地方有关的方法是像这个简单的C函数中所示的那样进行操作,如isredirected,除此之外,你需要确保消息的安全性...另外,使用procfs技巧需要root权限才能访问某些procfs功能...因此,请确保在其中放置一个检查以确保它不作为root运行...

int isredirected(void){
if (!isatty(fileno(stdin))) return 1;
return 0;
}

希望这能有所帮助, 最好的问候,汤姆。


问题:isatty会对管道返回false,而这正是OP想要做的。 - C. K. Young

1
据我所知,没有“诀窍”,其他用户无法读取您的 stdin/stdout。只需记住以下几点:
  • 作为同一用户运行的其他进程可以读取您的进程内存;这是因为安全性保护了您免受其他用户的侵害。
  • 以 superuser 身份运行的进程可以执行任何操作。

话虽如此,如果您处理敏感数据,请查看 mlock


0
在我的有限测试中(运行uniq | sort,然后尝试通过/proc/XXX/fd窥探管道的两端),似乎我无法读取发送到管道中的内容,但我可以向其中注入数据。
换句话说,进行自己的测试以查看您能够做什么和不能做什么。 :-)

嗯...谢谢。仅仅能够注入数据是不够的!:-) 我想我会使用带有SO_PEERCRED的本地套接字(这不需要是可移植的)。 - c4757p
1
我认为这种注入方式要求您以相同的用户或根用户身份运行?这似乎是不足以不信任标准输入/输出I/O的理由。 - Eric Seppanen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接