【问题标题】:Hiding command line arguments for C program in Linux在 Linux 中隐藏 C 程序的命令行参数
【发布时间】:2011-08-28 03:34:15
【问题描述】:

如何隐藏在 Linux 中运行的 C 程序的命令行参数,使其他用户无法通过“w”、“ps auxwww”或类似命令看到它们?

【问题讨论】:

  • 有人告诉我,当用户在命令行中键入密码时,mysql 会隐藏密码,因此wps 不会显示它。也许您可以尝试看看它是如何实现这一点的(我的意思是,当像 mysql -u foobar -ppasswordw 或类似命令调用时显示 mysql -u foobar -pxxxxxx。除此之外我无法帮助您(但我同意 @paxdiablo,如果您不这样做'不希望它们可见,不要将该数据用作命令行参数)。

标签: c linux command-line-arguments


【解决方案1】:

这实际上是相当困难的(我不会说不可能,因为 可能 是一种我不知道的方式),特别是如果用户可以访问 @987654321 @你的进程的文件系统。

也许防止人们看到你的命令行参数的最好方法是不使用命令行参数:-)

您可以将您的参数存储在一个名为(例如)myargs.txt 的适当保护的文件中,然后运行您的程序:

myprog @myargs.txt

当然,您必须修改 myprog 以处理“文件中的参数”场景。

或者,您可以将参数设置为环境变量并让您的程序使用getenv

但是,我不知道有任何方法可以保护您免受适当授权的进程(例如由root 运行的进程)。

【讨论】:

  • 我觉得没那么难。如果我没记错的话,Linux 的大多数/所有安全增强补丁集都添加了一个选项,可以将/proc/NNNNN 条目的权限更改为0700,现在甚至可能在默认内核中提供了一个挂载选项。 (我写这篇评论而不是答案的唯一原因是我没有检查过它。)
  • 即使您将 args 存储在一个文件中,在隐藏 args 之前,您仍然有一个程序运行了几分之一秒的可见 args。如果用户在正确的时刻运行 w 命令,他们仍然不受保护。
  • 有人可以确认 /proc/NNNNN 是唯一包含命令行参数的地方吗?有没有办法只为某些特定进程更改 /proc/NNNNN 的权限(即,更改这些权限的启动进程?)任何提供更多信息的链接将不胜感激。
  • 一个适当授权的进程可以查看每个人的信息,甚至可以查看他们地址空间中的内存。很难向这样的野兽隐藏信息:-)
  • @Chris,我不是说 程序 将 args 放在一个文件中,我的意思是 user。 然后唯一传递的东西命令行将是字符串“@myargs.txt”。你不在乎谁看到了 that 因为它所显示的只是一个文件名——实际的 args 永远不会出现在命令行上。但是,同样,一个足够强大的进程可以直接查看您的文件。
【解决方案2】:

在你的程序中修改argv的内容:

#include <stdio.h>
#include <time.h>

void delay (long int msecs)
{
        clock_t delay = msecs * CLOCKS_PER_SEC / 1000;
        clock_t start = clock();
        while (clock() - start < delay);
}

void main (int argc, char **argv)
{
    if (argc == 2) 
    {
        printf ("%s\n", argv[1]);
        delay (6000);

        argv[1][0] = 'x';
        argv[1][1] = '.';
        argv[1][2] = 'x';

        printf ("%s\n", argv[1]);
        delay (5000);
        printf ("done\n");
    }
    else printf ("argc != 1: %d\n", argc);
}

调用:

./argumentClear foo  
foo
x.x
done

结果,ps查看:

asux:~ > ps auxwww | grep argu
stefan   13439 75.5  0.0   1620   352 pts/5    R+   17:15   0:01 ./argumentClear foo
stefan   13443  0.0  0.0   3332   796 pts/3    S+   17:15   0:00 grep argu
asux:~ > ps auxwww | grep argu
stefan   13439 69.6  0.0   1620   352 pts/5    R+   17:15   0:02 ./argumentClear x.x
stefan   13446  0.0  0.0   3332   796 pts/3    S+   17:15   0:00 grep argu

备注:我的延迟功能没有按预期工作。程序运行时间不是 11 秒,而是大约 2-3 秒。我不是大 C 程序员。 :) 这里的延迟功能需要改进。

【讨论】:

  • 根据 Chris H,'ps auxwww' 不会在正确的时刻运行(在程序修改 argv 之前仍然会显示命令行参数?
  • 嗯,当然。在程序隐藏参数之前,它们并没有被隐藏。由于我知道没有程序可以及时旅行,将它们隐藏在过去。也许你可以禁止使用ps和其他程序,但我不知道如何找到所有知名程序的列表。并且必须阻止用户编写/安装自己的程序。或者内核必须被修改。在用户重新登录之前,您需要踢出用户并停止他的进程,启动修改其参数的程序。如果您尝试隐藏密码,可能是带有 NOPASSWD 的 sudoers-file ...
  • ... 使用预共享密钥和受信任主机的 ssh 是更好的解决方案。
【解决方案3】:

据我所知,这些信息存储在内核空间中。如果不编写内核模块,您将无法隐藏此信息,因为任何程序都可以查询 proc 文件系统以查看命令行参数(这是 ps 所做的)。

作为替代方案,您可以在标准输入上读取命令行参数,然后填充一个数组以传递给命令行参数处理程序。或者,更好的是,为您的程序添加支持以读取包含相同命令行参数信息的配置文件并设置权限,以便只有所有者才能读取该文件。

我希望这会有所帮助。

【讨论】:

    【解决方案4】:

    要隐藏 ps 命令的参数,您可以使用我一直使用的 hack: sprintf(argv[0], "My super long argument list

    "); 请务必使用空格键使用 3 行左右的空格,否则编译器会报错! 请记住在解析命令行后更改 argv[0]!

    59982 pts/1 SLl+ 0:00 我的超长参数列表 字符串 /proc/59982/cmdline 我的超长参数列表

    这是一个hack,但是入侵者会先发出“ps axw”。

    始终监控关键任务服务器并检查登录用户!!!

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2013-03-30
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多