如何安全地在两个进程之间交换号码

Posted

技术标签:

【中文标题】如何安全地在两个进程之间交换号码【英文标题】:How to exchange a number between two processes securely 【发布时间】:2021-11-05 21:37:51 【问题描述】:

这是myapp1myapp2 的示例代码:

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 包功能不断增长,而无需关心协议的增长。它总是一样的。因此,如果您想扩展您的应用程序,您将非常灵活。

【讨论】:

以上是关于如何安全地在两个进程之间交换号码的主要内容,如果未能解决你的问题,请参考以下文章

在两个进程之间交换值?

在 MPI 进程之间交换数据(晕)

使用内存映射文件在盒子上的两个进程之间交换文本

如何更有效地在 Erlang 中生成进程?

在 C++ 中父进程和子进程之间共享队列

在 Ruby 中处理多个进程