SUID

应用于可执行程序的粘性位,用于标记系统,以在程序完成运行后将程序的映像保留在内存中。

但是我不知道这是什么它存储在内存中。以及在这种情况下如何看到它们?

评论

这是一个很好的教程,其中包含有效的示例和说明。理解这一点的关键是所涉及的八进制系统。 Linux粘性位教程,带有有效示例。

#1 楼

这可能是我一直以来最讨厌的事情之一。 SUID / GUID位和粘性位是2个完全不同的东西。

如果执行man chmod,则可以了解SUID和粘性位。手册页也可以在这里找到。

背景

摘录


字母rwxXst为受影响的用户选择文件模式位:读取
(r),写入(w),执行(或搜索目录)(x),仅执行/搜索
,如果文件是目录或已经具有某些用户的执行权限
/>(X),在执行时设置用户或组ID,限制删除标志或
粘性位(t)。


SUID / GUID

上面的手册页试图说的是,x位在用户八进制(第一组rwx)和八进制组(第二组rwx)的rwxrwxrwx中的位置可以处于附加状态x变成s。发生这种情况时,该文件在执行时(如果它是一个程序,而不仅仅是一个shell脚本)将在所有者或文件组的许可下运行。

因此,如果文件由root拥有并且SUID位已打开,则该程序将作为root运行。即使您以普通用户身份执行它。 GUID位也是如此。

摘录


SETUID和SETGID位

chmod清除设置组ID。如果文件的组ID
与用户的有效组ID或用户的
补充组ID之一不匹配,则为常规文件的一位,除非用户具有适当的特权。
其他限制可能导致MODE或RFILE的set-user-id和set-group-ID位
被忽略。此行为取决于基础chmod系统调用的策略和功能。如有疑问,请检查底层系统行为。

chmod保留目录的set-user-ID和set-group-ID位,除非
您明确指定其他方式。您可以使用
u + s和gs等符号模式来设置或清除位,还可以使用数字模式来设置(但不能清除)这些位



SUID / GUID示例

没有suid / guid-仅设置了rwxr-xr-x位。

$ ls -lt b.pl
-rwxr-xr-x 1 root root 179 Jan  9 01:01 b.pl


suid和用户的可执行位已启用(小写s)-已设置rwsr-xrx位。

$ chmod u+s b.pl 
$ ls -lt b.pl 
-rwsr-xr-x 1 root root 179 Jan  9 01:01 b.pl


suid已启用且可执行位已禁用(大写S)-rwSr-xr位设置-x。

$ chmod u-x b.pl
$ ls -lt b.pl 
-rwSr-xr-x 1 root root 179 Jan  9 01:01 b.pl


引导和组的可执行位已启用(小写s)-设置了rwxr-sr-x位。

$ chmod g+s b.pl
$  ls -lt b.pl 
-rwxr-sr-x 1 root root 179 Jan  9 01:01 b.pl


启用了GUI且禁用了可执行位(大写S)-设置了rwxr-Sr-x位。

$ chmod g-x b.pl
$  ls -lt b.pl 
-rwxr-Sr-x 1 root root 179 Jan  9 01:01 b.pl


粘性位
另一方面,粘性位表示为t,例如/tmp目录:

$ ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp


该位应该一直所谓的“限制删除位”就是它的真正含义es。启用此模式位后,它会创建一个目录,以便用户只能删除自己拥有的文件和目录。

摘录


限制删除标志或粘性位

限制删除标志或粘性位是单个位,其
解释取决于文件类型。对于目录,它
防止非特权用户删除或重命名
目录中的文件,除非他们拥有该文件或目录。这称为目录的
受限删除标志,通常在
世界可写目录(例如/ tmp)中找到。对于某些
较旧系统上的常规文件,该位将程序的文本图像保存在swap
设备上,以便在运行时更快地加载。这就是所谓的粘性位。


评论


实际上,粘性位以前可以应用于可执行文件,这导致它们在首次加载后仍保持交换状态。这可以为大量使用的程序节省大量不必要的磁盘/网络(NFS)和CPU使用率。但是,Linux和大多数(所有?)Unix系统都不再支持此功能(它已从内核中删除)。这是“粘性”的,因为可执行文件卡在交换中。此外,它还用于您描述的目录。

–巴德·科珀罗德(Baard Kopperud)
13年6月14日在13:38

实际上,“用得最多或很大”将是一个更好的描述。请记住,我的大学在1995年的时候就将Netscape Web浏览器作为“粘性”安装在其HP-UX计算机上。所以经常使用的小型程序(例如cron频繁运行系统命令)和大型程序(例如Netscape)是“粘性”的主要候选人。在这两种情况下,不断从磁盘/ NFS重新加载它们将是浪费的。

–巴德·科珀罗德(Baard Kopperud)
2013年6月14日14:48



粘性位程序旨在驻留在RAM中,而不是驻留在交换中(从交换文件中加载映像并不比从文件系统磁盘中加载映像快得多)。它旨在用于基本的OS级命令,例如ls。显然,只有超级用户才能在文件上设置粘性位。在引入虚拟内存和共享库之后,它变得不那么重要了,尤其是随着传呼机变得更加智能并且可以动态决定保留哪些页面时,传呼机变得尤为重要。

–alexis
2013年6月14日18:04



而且由于sticky属性对目录没有意义,因此稍后解释了权限掩码的相同位以修改目录的传统文件创建语义。

–alexis
2013年6月14日18:07

@alexis:最初,粘性位程序保留在交换空间中。这比从文件系统读取要快得多,因为读取交换文件图像是连续的扇区,因此大多数情况下可以异步读取。对于早期的文件系统,没有扇区“运行长度”,并且大多数早期的文件系统驱动程序一次读取一个扇区,即使这些扇区碰巧是连续的。在PDP-40上的结果是粘性程序似乎可以立即加载,而非粘性程序通常需要一两秒钟。我认为我们只是粘性。

– wallyk
15年9月22日在18:05

#2 楼


“应用于可执行程序的粘性位将系统标记为
在程序完成运行后将程序的映像保存在内存中。”


我认为这是非常过时的信息,今天大多数现代Unix都忽略了这一点。在Linux中,粘性位仅与目录有关。请参阅此处和内容丰富的Wikipedia文章。

无论如何,在旧的行为中,图像(仅“代码”,而不是数据)仅保存在虚拟内存中-通常被交换,而不是在真实内存中,以便下次更快地运行。

#3 楼


什么是粘性位?


粘性位是在目录上设置的允许位,该目录仅允许该目录中文件的所有者或root用户访问删除或重命名文件。没有其他用户具有删除其他用户创建的文件所需的特权。

这是一种安全措施,可避免删除其他用户的关键文件夹及其内容(子目录和文件)。拥有完全权限。

评论


那是不对的:en.wikipedia.org/wiki/Sticky_bit

– A.B.
15年4月19日在15:01

@ A.B。对我来说,这似乎很准确,几乎可以解释您引用的Wikpedia文章的开头。它出什么问题了?

–roaima
15年4月19日在15:42

我会说答案是不完整的。 “ Sticky”还表示可执行文件将保留在交换空间中,以使其更快地运行。现在,这是古老的历史,但是在较旧的文件系统中,驱动程序一次只能读取一个扇区,即使这些扇区碰巧是连续的。这使得非粘性可执行文件变慢,而粘性在当时具有很大的意义。

– GhostCode
19年8月22日在10:38