C popen vs.KornShell安全

C popen vs.KornShell安全,c,shell,unix,ksh,popen,C,Shell,Unix,Ksh,Popen,我正在编写一个C程序,使用一些外部二进制文件来实现计划的目标。我需要运行一个命令,它给我一个输出,然后我需要处理它,然后作为输入输入输入到另一个程序中。我正在使用popen,但不知道这是否与使用KornShell(ksh)临时文件相同 例如: touch myfile && chmod 700 cat myfile > /tmp/tempfile process_file < /tmp/tempfile && rm /tmp/tempfile 触

我正在编写一个C程序,使用一些外部二进制文件来实现计划的目标。我需要运行一个命令,它给我一个输出,然后我需要处理它,然后作为输入输入输入到另一个程序中。我正在使用popen,但不知道这是否与使用KornShell(ksh)临时文件相同

例如:

touch myfile && chmod 700
cat myfile > /tmp/tempfile 
process_file < /tmp/tempfile  && rm /tmp/tempfile
触摸myfile&&chmod 700
cat myfile>/tmp/tempfile
进程文件
由于这会创建一个根用户可以读取的临时文件,如果在C中使用popen,并且知道管道也是文件,这会是相同的吗?或者可以安全地假设操作系统(OS)不允许任何其他进程读取您的管道吗?

您说“创建一个根用户可以读取的临时文件”,这意味着您试图以根用户无法读取的方式传输数据。那是不可能的;一般来说,根用户对系统拥有完全控制权,因此可以读取系统上的任何数据,无论它是否在临时文件中。即使在单个进程中,根用户也可以读取该进程的内存

如果使用
popen()
,则文件系统中不会有该文件的条目;它创建一个管道,其作用类似于一个文件,但实际上并不将数据写入磁盘,而是在两个程序之间传递数据

它将有一个文件描述符;根据系统的不同,截取这些数据可能更容易,也可能更难,但截取总是可能的。例如,在Linux上,您只需在
/proc//fd/
中查找所有打开的文件描述符并对其进行操作(读取或写入)。

您说“这创建了一个根用户可以读取的临时文件”,这意味着您正试图以根用户无法读取的方式传输数据。那是不可能的;一般来说,根用户对系统拥有完全控制权,因此可以读取系统上的任何数据,无论它是否在临时文件中。即使在单个进程中,根用户也可以读取该进程的内存

如果使用
popen()
,则文件系统中不会有该文件的条目;它创建一个管道,其作用类似于一个文件,但实际上并不将数据写入磁盘,而是在两个程序之间传递数据


它将有一个文件描述符;根据系统的不同,截取这些数据可能更容易,也可能更难,但截取总是可能的。例如,在Linux上,您只需在
/proc//fd/
中查找所有打开的文件描述符并对其进行操作(读取或写入)。

感谢Brian,问题不在于具有root访问权限的用户读取文件,而在于进程分离。我试图找出编写处理敏感数据的程序最安全的方法。例如,有人可能会建议共享内存作为更好的选择(我不是一个有经验的程序员,所以我不知道)。感谢您的建议。@user1944224创建管道(使用
popen
)将保留内存中的所有数据;它永远不会将其写入磁盘(除非作为交换,但内存中的任何数据都是如此)。它也不会在任何文件系统上为它创建文件。因此,从这个意义上讲,它更安全,因为您不太可能意外地公开文件(如果不小心,将文件写入
/tmp
会有各种问题)。没有任何东西可以保护您的数据不受以root用户身份运行的程序的影响,该程序正试图从您的程序中提取数据;无论您如何通信,特权进程都可以直接读取内存。尽管Linux为匿名管道创建了一个inode,但它在文件系统上不可见(与命名管道/fifo不同)。匿名管道只能在相关进程(父子进程、兄弟进程或类似进程)之间使用;root用户可以连接到共享内存来读取它。在Linux上,管道可能仍然难以拦截;读取会破坏数据,因此如果
root
读取信息,另一个进程根本看不到它。@JonathanLeffler虽然root从管道中读取可能不太方便,但也不难。他们可以只调用从管道复制数据而不使用它。或者,它们可以附加到您的进程并跟踪其系统调用。或者从进程的
/proc/$pid/mem
读取数据。或者任何其他获取数据的方法。感谢Brian,我们关心的不是具有root访问权限的用户读取文件,而是进程分离。我试图找出编写处理敏感数据的程序最安全的方法。例如,有人可能会建议共享内存作为更好的选择(我不是一个有经验的程序员,所以我不知道)。感谢您的建议。@user1944224创建管道(使用
popen
)将保留内存中的所有数据;它永远不会将其写入磁盘(除非作为交换,但内存中的任何数据都是如此)。它也不会在任何文件系统上为它创建文件。因此,从这个意义上讲,它更安全,因为您不太可能意外地公开文件(如果不小心,将文件写入
/tmp
会有各种问题)。没有任何东西可以保护您的数据不受以root用户身份运行的程序的影响,该程序正试图从您的程序中提取数据;无论您如何通信,特权进程都可以直接读取内存。尽管Linux为匿名管道创建了一个inode,但它在文件系统上不可见(与命名管道/fifo不同)。匿名管道只能在相关进程(父子进程、兄弟进程或类似进程)之间使用;root用户可以连接到共享内存来读取它。O