Section outline

  • Set-UID 是 Unix 操作系统中一个重要的安全机制。当一个 Set-UID 程序运行时,它会获得文件所有者的权限。例如,如果程序的所有者是 root,那么任何人运行这个程序时,该程序在运行期间都会获得 root 权限。Set-UID 机制让我们实现了许多有用的功能,但由于它会提升用户权限,因此风险较大。尽管 Set-UID 程序的行为由其程序逻辑决定,不是由用户决定,但用户可以通过环境变量影响程序行为。为了理解 Set-UID 程序如何受到环境变量影响,我们首先要弄清楚 Set-UID 程序的进程是否会从用户的进程中继承环境变量。

      • 编写以下程序,用于打印当前进程中的所有环境变量。
        #include <stdio.h>
        #include <stdlib.h>
        
        extern char **environ;
        int main()
        {
          int i = 0;
          while (environ[i] != NULL) {
            printf("%s\n", environ[i]);
            i++;
          }
        }
      • 在你的 shell 中(需要是普通用户账户,而不是 root 账户), 使用 export 命令设置以下环境变量(它们可能已经存在):

        • PATH

        • LD_LIBRARY_PATH

        • ANY_NAME (这是由你定义的环境变量,可以选择任意名称)

        这些环境变量会在用户的 shell 进程中设置。现在,在你的 shell 中运行步骤 2 中的 Set-UID 程序。 当你在 shell 中输入程序名时,shell 会 fork 一个子进程,并使用子进程运行该程序。 请检查你在 shell 进程(父进程)中设置的所有环境变量是否都进入了 Set-UID 子进程。 描述你的观察结果。如果有让你感到意外的地方,请描述它们。