如何安全地在两个进程之间交换号码
Posted
技术标签:
【中文标题】如何安全地在两个进程之间交换号码【英文标题】:How to exchange a number between two processes securely 【发布时间】:2021-11-05 21:37:51 【问题描述】:这是myapp1
和myapp2
的示例代码:
myapp1 代码:
int main(int argc, char *argv[])
int secret = 123;
char buffer[20];
sprintf(buffer,"%d",secret);
char *argv[] = "/bin/myapp2", buffer, 0 ;
char *envp[] =
"HOME=/",
"PATH=/bin:/usr/bin",
0
;
int retval = execve(argv[0], &argv[0], envp);
printf("return value is: %d\n", retval);
return 0;
myapp2 代码:
int main(int argc, char *argv[])
int val = atoi(argv[1]);
some_process(val);
return val;
如您所见,我正在使用execve()
从myapp1
调用应用程序myapp2
。我在其参数中向myapp2
发送了一个秘密号码。
myapp2
对其进行一些处理并将相同的密码返回给调用程序。
现在,我的问题是我希望这个秘密号码对外界保密。使用ps
命令可以轻松破解密码。
我想要的是我想确保myapp2
被调用是原始的。如果有人用myappfake
替换它,它也返回相同的密码,我怎么知道我被愚弄了?
基本上,我想确保我收到回复的myapp2
是真实的。
【问题讨论】:
为什么不用一对管道在两个进程之间来回传递数据? 此外,您要么在示例代码中删除了它以简化它,要么您误解了exec*
系列函数的工作原理。首先,您需要一个fork
调用才能并行运行第一个进程。其次,即使 execve
返回,它也会返回 execve
调用本身的成功/失败指示符,而不是其他程序返回的内容。
如果有人可以完全访问机器,那么您无法以任何方式保证这种安全性。使用管道比将秘密作为参数传递要好,但这仍然只是security through obscurity。
你可以看看 boost boost.org/doc/libs/1_54_0/doc/html/interprocess/…,然后还有平台特定的解决方案。 RPC 是一种选择,但对于一个数字来说可能有点矫枉过正。
@Someprogrammerdude:分享的示例代码只是为了简化代码。实际上,myapp1 是一个 Linux 内核模块。并且 myap2 正在使用 call_usermodehelper() API 调用。我想我们不能在这种情况下使用管道。
【参考方案1】:
我会给你一个 RPC 的方向 - 远程过程调用。 这是一个旧协议,但我被一些现代操作系统(如 Linux 或 Windows)使用。 该协议可以在网络上使用。因此,您不仅限于本地站。 而且由于Linux和Windows都支持本地(无服务器)环境,所以测试或扩展协议都不是问题(而且调用次数不受限制,您可以进行)。 您可以加密或解密每一侧(应用程序点)上的所有数据。 RPC 是一个古老的协议。所以,你必须自己做证券。而且,您可以在不同平台上编写 RPC 应用程序,因为 RPC 协议不依赖于任何平台(以本机形式)。 但是您必须存储函数调用的两个副本(服务器/客户端)。 如果你聪明的话,你可以扩展你的 RPC 包功能不断增长,而无需关心协议的增长。它总是一样的。因此,如果您想扩展您的应用程序,您将非常灵活。
【讨论】:
以上是关于如何安全地在两个进程之间交换号码的主要内容,如果未能解决你的问题,请参考以下文章