【问题标题】:Security of stdio communicationsstdio 通信的安全性
【发布时间】:2010-02-18 16:58:52
【问题描述】:

在我正在开发的程序(Linux)中,我需要非常简单的基于文本的 IPC。为此使用标准输入/输出管道将非常容易。我可以相信任何人都无法读取发送到进程标准输入的消息吗?另外,我可以相信,如果我将管道保持在它的标准输出上,只有我可以读取它输出的内容吗?我只是想确保没有可以从这些中读取的基于 procfs 的技巧。

【问题讨论】:

    标签: linux ipc stdio


    【解决方案1】:

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

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

    您可能会考虑将 SELinux 沙盒与您正在做的事情结合使用 - 如果您真的需要这种级别的保护,请访问 http://danwalsh.livejournal.com/ 了解更多信息。 libselinux 允许您与它交互以检查保护是否存在等。

    【讨论】:

    • 我不需要诺克斯堡——只是想确保没有任何安全漏洞
    【解决方案2】:

    据我所知,没有“技巧”,其他用户无法读取您的标准输入/标准输出。请记住:

    • 以同一用户身份运行的其他进程可以读取您进程的内存;这是因为安全保护您免受其他用户的侵害。
    • 以超级用户身份运行的进程可以做任何事情。

    也就是说,如果您正在处理敏感数据,请查看mlock

    【讨论】:

      【解决方案3】:

      没有任何技巧,我能想到的关于检测 stdout 是否被重定向到其他地方的唯一方法就是像在此处显示的isredirected 中那样在一个简单的 C 函数中执行此操作,除了责任在于您确保消息保持安全...另一件事是使用 procfs 技巧需要 root 权限才能访问某些 procfs 功能...因此请确保您在那里进行检查以确保它不是以 root 身份运行...

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

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

      【讨论】:

      • 问题:isatty 将为管道返回 false,这是 OP 想要做的。
      【解决方案4】:

      在我自己的有限测试中(运行uniq | sort 然后尝试通过/proc/XXX/fd 窥探管道的两端),似乎我无法读取发送到管道中的内容,但我可以将数据注入它。

      换句话说,做你自己的测试,看看你能做什么,不能做什么。 :-)

      【讨论】:

      • 嗯...谢谢。能够注入数据是行不通的! :-) 我想我只会使用带有 SO_PEERCRED 的本地套接字(不需要它是可移植的)。
      • 我认为这种注入需要您以同一用户或 root 身份运行?这似乎不足以成为不信任标准输入/标准输出 I/O 的理由。
      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 2012-12-16
      • 2018-06-07
      • 2010-11-12
      • 2013-02-07
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多