【发布时间】: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 调用。我想我们不能在这种情况下使用管道。
标签: c++ security secure-coding information-hiding