1. man capabilities 1.1 Capabilities 功能 1.2 全面实施功能需要: (在内核2.6.24之前,仅满足前两个要求;从内核2.6.24开始,所有这三个要求都得到满足) 1.3 给内核开发人员的说明 1.4 Thread capability sets 线程功能集 1.5 File capabilities 文件功能 1.6 File capability extended attribute versioning 文件功能扩展属性版本控制 1.7 Transformation of capabilities during execve() 期间的功能转换 1.8 Safety checking for capability-dumb binaries 安全检查哑巴二进制文件 1.9 Capabilities and execution of programs by root 根目录的功能和程序执行 1.a Set-user-ID-root programs that have file capabilities 具有文件功能的设置用户ID根程序 1.b Capability bounding set 能力边界集 1.b.1 从Linux 2.6.25开始的功能范围设置 1.b.2 Linux 2.6.25之前的功能范围设置 1.c Effect of user ID changes on capabilities 用户ID更改对功能的影响 1.e Programmatically adjusting capability sets 以编程方式调整功能集 1.e The securebits flags: establishing a capabilities-only environment 建立仅功能的环境 1.f Per-user-namespace "set-user-ID-root" programs 每个用户命名空间的“设置用户ID根”程序 1.g Namespaced file capabilities 命名空间文件功能 1.g Interaction with user namespaces 与用户名称空间的交互 1.i NOTES 笔记 1.j. Capabilities list 能力清单 2 例子: 2.1 更多示例 2.2. Useful commands 3 更多参考
1. man capabilities
注: 本文时man配置的自动翻译,仅供参考.
https://jlk.fjfi.cvut.cz/arch/manpages/man/capabilities.7
该页面是Linux 手册页项目5.07版的一部分。可以在https://www.kernel.org/doc/man-pages/上找到该项目的描述,有关错误报告的信息以及此页面的最新版本。2019-08-02
1.1 Capabilities 功能
为了执行权限检查,传统的UNIX实现将进程分为两类:特权 进程(其有效用户ID为0,称为超级用户或root),以及非特权进程(其有效UID为非零)。
特权进程绕过所有内核权限检查,而无特权的进程则根据进程的凭据(通常是:有效的UID,有效的GID和补充组列表)接受完全的权限检查。
从内核2.2开始,Linux将传统上与超级用户相关联的特权划分为不同的单元,称为 功能,可以独立地启用和禁用这些功能。功能是每个线程的属性。
1.2 全面实施功能需要: (在内核2.6.24之前,仅满足前两个要求;从内核2.6.24开始,所有这三个要求都得到满足)
- 对于所有特权操作,内核必须检查线程在其有效集中是否具有所需的功能。
- 内核必须提供系统调用,以允许更改和检索线程的功能集。
- 文件系统必须支持将功能附加到可执行文件,以便进程在执行文件时获得那些功能。
1.3 给内核开发人员的说明
在添加应由功能控制的新内核功能时,请考虑以下几点。
- 功能的目标是将超级用户的权限分成多个部分,这样,如果具有一个或多个功能的程序受到损害,则其破坏系统的能力将小于以root特权运行的同一程序。
- 您可以选择为新功能创建新功能,或者将功能与现有功能之一相关联。为了使功能集保持在可管理的大小,后一种选择是可取的,除非有充分的理由采用前一种选择。(还有一个技术限制:功能集的大小当前限制为64位。)
- 要确定哪些现有功能最可能与您的新功能相关联,请查看上面的功能列表,以找到最适合您的新功能的“筒仓”。采取的一种方法是确定是否还有其他功能需要与新功能一起使用的功能。如果没有这些其他功能,新功能将无用,则应使用与其他功能相同的功能。
- 如果可以避免,请不要选择CAP_SYS_ADMIN!现有功能的大部分检查都与此功能相关联(请参阅上面的部分列表)。它可以合理地称为“新根”,因为一方面它赋予了广泛的权力,另一方面,它的广泛范围意味着这是许多特权程序所需要的功能。不要让问题变得更糟。应该与CAP_SYS_ADMIN关联的唯一新功能 是那些与该筒仓中的现有用途紧密匹配的功能。
- 如果您确定确实有必要为您的功能创建新功能,请不要将其创建或命名为“单次使用”功能。因此,例如,添加高度特定的CAP_SYS_PACCT可能是一个错误。取而代之的是,尝试将您的新功能标识为更广泛的筒仓,并将其命名为其他相关的将来用例可能适合的筒仓。
1.4 Thread capability sets 线程功能集
每个线程具有以下功能集,其中包含零个或多个上述功能:
Permitted 允许的
这是线程可能具有的有效功能的一个限制超集。对于在有效集中没有CAP_SETPCAP功能的线程可能添加到可继承集中的功能,它也是一个限制超 集。
如果线程从其允许的集合中删除了一项功能,则它将永远无法重新获得该功能(除非它是execve(2)的一个set-user-ID-root程序,或者其关联文件功能允许该功能的程序)。
Inheritable 可继承的
这是execve(2)保留的一组功能。当执行任何程序时,可继承功能保持可继承的状态,而当执行文件可继承集中具有相应位的程序时,可继承功能会添加到允许的集合中。
因为当以非root用户身份运行时,可继承功能通常不会在execve(2)上保留 ,所以希望运行具有增强功能的帮助程序的应用程序应考虑使用环境功能,如下所述。
Effective 有效
这是内核用于对线程执行权限检查的功能集。
Bounding 边界(从Linux 2.6.25开始的每个线程)
能力边界集是一种可用于限制execve(2)期间获得的能力的机制。
从Linux 2.6.25开始,这是每个线程的功能集。在较早的内核中,功能边界集是系统上所有线程共享的系统范围属性。
有关功能边界集的更多详细信息,请参见下文。
Ambient 环境(自Linux 4.3起)
这是在非特权程序的execve(2)中保留的一组功能 。环境能力集服从不变性,即如果既不允许又不可继承,则任何能力都不可能是环境。
可以使用prctl(2)直接修改环境功能集。如果降低了相应的允许或可继承的功能,则环境功能会自动降低。
执行由于设置用户ID或设置组ID位而更改UID或GID的程序,或者执行具有任何文件功能集的程序,将会清除环境设置。当调用execve(2)时,环境功能会添加到允许的集合中并分配给有效的集合。如果环境能力导致在execve(2)期间进程的允许和有效能力增加,则这不会触发ld.so(8)中描述的安全执行模式。
通过fork(2)创建的子级继承其父级功能集的副本。有关execve(2)期间功能处理的讨论,请参见下文。
使用capset(2),线程可以操纵自己的功能集(请参见下文)。
从Linux 3.2开始,文件/ proc / sys / kernel / cap_last_cap 公开了正在运行的内核所支持的最高性能的数值。这可用于确定功能集中可能设置的最高位。
1.5 File capabilities 文件功能
从内核2.6.24开始,内核支持使用setcap(8)将功能集与可执行文件相关联。文件功能集存储在名为security.capability的扩展属性(请参阅setxattr(2)和xattr(7))中 。写入此扩展属性需要 CAP_SETFCAP功能。文件功能集与线程的功能集一起确定execve(2)之后的线程的功能。
三个文件功能集是:
Permitted (formerly known as forced): 允许(原名强制):
无论线程的可继承功能如何,这些功能都会自动授予线程。
Inheritable (formerly known as allowed): 可继承的(以前称为allowed):
该集合与线程的可继承集合进行“与”运算,以确定在execve(2)之后的线程的允许集合中启用了哪些可继承功能。
Effective: 有效:
这不是一个集合,而是一个位。如果设置了此位,则在execve(2)期间,还将在有效集中提高线程的所有新允许功能。如果未设置此位,则在execve(2)之后,新的有效功能中都没有新的允许功能。
启用文件有效功能位意味着,导致线程在execve(2)期间获取相应的允许功能的任何文件允许或可继承功能(请参阅下面描述的转换规则)也将在其有效集中获取该功能。因此,在将功能分配给文件(setcap(8),cap_set_file(3),cap_set_fd(3))时,如果我们将有效标志指定为对任何功能启用,则还必须将有效标志指定为对所有功能均启用启用了相应的允许或可继承标志的其他功能。
1.6 File capability extended attribute versioning 文件功能扩展属性版本控制
为了实现可扩展性,内核支持一种在security.capability扩展属性内对版本号进行编码的方案,该属性用于实现文件功能。这些版本号是实现的内部内容,对用户空间应用程序不直接可见。迄今为止,支持以下版本:
VFS_CAP_REVISION_1
这是原始的文件功能实现,支持文件功能的32位掩码。
VFS_CAP_REVISION_2(从Linux 2.6.25开始)
该版本允许文件功能掩码的大小为64位,并且在受支持的功能数量增加到32以上时是必需的。内核透明地继续支持具有32位版本1功能掩码的文件的执行,但是在添加时对于以前不具有功能的文件,或修改现有文件的功能,它会自动使用版本2方案(或可能使用版本3方案,如下所述)。
VFS_CAP_REVISION_3(从Linux 4.14开始)
提供版本3文件功能以支持命名空间文件功能(如下所述)。
与版本2文件功能一样,版本3功能掩码的大小为64位。但此外,名称空间的根用户ID编码在security.capability扩展属性中。(名称空间的根用户ID是该名称空间内的用户ID 0映射到初始用户名称空间中的值。)
第3版文件功能旨在与第2版功能共存。也就是说,在现代Linux系统上,可能有些文件具有版本2功能,而另一些文件具有版本3功能。
在Linux 4.14之前,可以附加到文件的唯一一种文件功能扩展属性是VFS_CAP_REVISION_2 属性。从Linux 4.14开始, 附加到文件的security.capability扩展属性的版本取决于创建该属性的环境。
从Linux 4.14开始,如果以下两个条件均成立,则会自动将security.capability扩展属性创建为(或转换为)版本3(VFS_CAP_REVISION_3)属性:
(1)写入属性的线程位于非初始用户名称空间中。(更准确地说:该线程驻留在用户名称空间中,而不是从其安装基础文件系统的名称空间中。)
(2)线程在文件索引节点上具有CAP_SETFCAP功能,这意味着(a)线程在其自己的用户名称空间中具有CAP_SETFCAP功能;(b)文件inode的UID和GID在编写者的用户名称空间中具有映射。
当VFS_CAP_REVISION_3 security.capability 创建扩展属性,所述创建线程的用户命名空间的根用户ID保存在扩展属性。
相比之下, 从特权(CAP_SETFCAP)线程创建或修改security.capability扩展属性,该线程位于安装了底层文件系统的名称空间(通常意味着初始用户名称空间)中,因此会自动创建版本2(VFS_CAP_REVISION_2)属性。
请注意,版本3 security.capability 扩展属性的创建是自动的。也就是说,当用户空间应用程序 以版本2格式写入(setxattr(2))security.capability属性时,如果在上述情况下创建了内核,则内核将自动创建版本3属性。相应地,当获取版本3的 security.capability属性时(getxattr(2))通过驻留在由根用户ID(或该用户名称空间的后代)创建的用户名称空间内的进程,返回的属性(自动)简化为显示为版本2属性(即,返回的值为版本2属性的大小,并且不包括root用户ID)。这些自动转换意味着无需对用户空间工具(例如setcap(1)和getcap(1))进行任何更改,即可将这些工具用于创建和检索版本3 security.capability属性。
请注意,文件可以具有与之关联的版本2或版本3的 security.capability扩展属性,但不能同时具有两者:创建或修改security.capability扩展属性将根据扩展的情况自动修改版本。属性被创建或修改。
1.7 Transformation of capabilities during execve() 期间的功能转换
在execve(2)期间,内核使用以下算法计算进程的新功能:
P‘(ambient) = (file is privileged) ? 0 : P(ambient) P‘(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding)) | P‘(ambient) P‘(effective) = F(effective) ? P‘(permitted) : P‘(ambient) P‘(inheritable) = P(inheritable) [i.e., unchanged] P‘(bounding) = P(bounding) [i.e., unchanged] where:
P() 表示在execve(2)之前设置的线程功能的值
P‘() 表示在execve(2)之后设置的线程功能的值
F() 表示文件功能集
请注意与上述能力转换规则有关的以下详细信息:
仅从Linux 4.3开始提供环境功能集。在execve(2)期间确定环境集的转换时,特权文件是具有功能或具有set-user-ID或set-group-ID位的文件。
在Linux 2.6.25之前,边界集是所有线程共享的系统范围的属性。该系统范围的值用于以与上述P(bounding)相同的方式在execve(2)期间计算新的允许集。
注意:在上述功能转换期间,出于忽略设置用户ID和设置组ID位的相同原因,可以忽略文件功能(将其视为空)。参见 execve(2)。如果使用no_file_caps选项引导内核,则文件功能也会被忽略。
注意:根据上述规则,如果具有非零用户ID的进程执行execve(2),则将清除其允许和有效集中存在的任何功能。对于当用户ID为零的进程执行execve(2)时的功能处理 ,请参阅下面的功能和通过root执行程序。
1.8 Safety checking for capability-dumb binaries 安全检查哑巴二进制文件
功能笨拙的二进制文件是一种已标记为具有文件功能的应用程序,但尚未转换为使用libcap(3) API来操纵其功能。(换句话说,这是一个传统的set-user-ID-root程序,已切换为使用文件功能,但尚未修改其代码以了解功能。)对于此类应用程序,将有效功能位设置在文件,以便在执行文件时在过程有效集中自动启用文件允许的功能。内核将具有有效功能位设置为“能力哑”的文件识别为此处描述的检查目的。
当执行能力哑二进制文件时,内核将在执行上述能力转换后,检查进程是否获得了文件许可集中指定的所有许可能力。(之所以不会发生这种情况,典型的原因是功能限制集掩盖了文件允许集中的某些功能。)如果进程未获得文件允许的完整功能集,则execve(2)将失败,并且错误的EPERM。这样可以防止以功能弱的应用程序以所需的较少特权执行该应用程序时可能出现的安全风险。请注意,根据定义,应用程序本身无法识别此问题,因为它未使用libcap(3) API。
1.9 Capabilities and execution of programs by root 根目录的功能和程序执行
为了反映传统的UNIX语义,当具有UID 0(根)的进程执行程序时,并且在执行set-user-ID-root程序时,内核对文件功能进行特殊处理。
在执行了由二进制文件的设置用户ID模式位触发的对过程有效ID的任何更改之后,例如,由于执行了设置用户ID根程序,因此将有效用户ID切换为0(root) —内核按以下方式计算文件功能集:
1。如果该进程的实际或有效用户ID为0(root),那么将忽略文件的可继承集和允许集;否则,将忽略该文件。相反,它们在概念上被认为是全部(即,启用了所有功能)。(此行为有一个例外,下面在具有文件功能的Set-user-ID-root程序中进行了介绍。)
2。如果进程的有效用户ID为0(root)或实际上启用了文件有效位,则名义上将文件有效位定义为1(启用)。
然后,如上所述,使用文件功能集的这些名义值来计算execve(2)期间进程功能的转换。
因此,当具有非零UID的进程execve(2)是没有附加功能的设置用户ID根程序时,或者当实际和有效UID为零的进程是execve(2)程序时,计算流程的新允许功能可简化为:
P‘(permitted) = P(inheritable) | P(bounding) P‘(effective) = P‘(permitted)
因此,该过程将获得其许可的有效能力集中的所有能力,但能力边界集所掩盖的能力除外。(在计算P‘(允许)时,可以简化P‘(环境)项,因为根据定义,它是P(可继承)的适当子集。)
可以使用下面描述的securebits机制禁用在本小节中描述的用户ID 0(root)的特殊处理。
1.a Set-user-ID-root programs that have file capabilities 具有文件功能的设置用户ID根程序
root的功能和程序执行 下描述的行为有一个例外。如果(a)正在执行的二进制文件具有附加功能,并且(b)进程的实际用户ID 不为 0(root),并且(c)进程的有效用户ID 为 0(root),则文件能力位是受尊重的(即,从概念上讲,它们并不是全部)。发生这种情况的通常方式是在执行还具有文件功能的set-UID-root程序时。当执行这样的程序时,该过程仅获得该程序授予的功能(即,并非所有功能,如在执行不具有任何关联文件功能的set-user-ID-root程序时会发生的那样)。
请注意,可以将空的功能集分配给程序文件,因此可以创建一个set-user-ID-root程序,该程序将执行该程序的进程的有效和保存的set-user-ID更改为0,但没有赋予该过程任何功能。
1.b Capability bounding set 能力边界集
功能边界集是一种安全机制,可用于限制在execve(2)期间可获得的功能。边界集以以下方式使用:
在execve(2)期间,将功能边界集与文件允许的能力集进行“与”运算,并将此操作的结果分配给线程的允许的能力集。因此,功能边界集对可执行文件可以授予的允许功能施加了限制。
(从Linux 2.6.25开始)功能限制集充当线程可以使用capset(2)添加到其可继承集的功能的限制超集。这意味着,如果能力不在约束集,然后一个线程不能将此功能添加到它的可继承集,即使是在其许可的能力,从而不能有这个能力,它允许集中保存,当它的execve (2)具有可继承集中功能的文件。
请注意,边界集将屏蔽文件允许的功能,但不会屏蔽可继承的功能。如果线程在其可继承集合中维护的功能不在其边界集中,那么它仍然可以通过执行在其可继承集合中具有该功能的文件来在其允许的集合中获得该功能。
根据内核版本,功能边界集可以是系统范围的属性,也可以是每个进程的属性。
1.b.1 从Linux 2.6.25开始的功能范围设置
从Linux 2.6.25开始,功能边界集是每个线程的属性。(下面描述的系统范围的功能边界集不再存在。)
边界集是在fork(2)处从线程的父级继承的,并保留在execve(2)中。
线程可以使用prctl(2) PR_CAPBSET_DROP操作从其能力范围集中删除能力,前提是它具有CAP_SETPCAP能力。一旦将功能从边界集中删除,就无法将其还原到该集中。线程可以使用prctl(2) PR_CAPBSET_READ操作确定功能是否在其边界集中。
仅当将文件功能编译到内核中时,才支持从边界集中删除功能。在Linux 2.6.33之前的内核中,文件功能是一个可选功能,可以通过CONFIG_SECURITY_FILE_CAPABILITIES选项进行配置 。从Linux 2.6.33开始,已删除了配置选项,并且文件功能始终是内核的一部分。将文件功能编译到内核后, 初始化进程(所有进程的祖先)以完整的边界集开始。如果没有将文件功能编译到内核中,则 init 将从一个完整的边界集减去CAP_SETPCAP开始,因为在没有文件功能的情况下,此功能具有不同的含义。
从边界集中删除功能不会将其从线程的可继承集中删除。但是,它的确阻止了将来将该功能重新添加到线程的可继承集中。
1.b.2 Linux 2.6.25之前的功能范围设置
在2.6.25之前的内核中,功能边界集是系统范围的属性,会影响系统上的所有线程。可以通过文件/ proc / sys / kernel / cap-bound访问边界集。(令人困惑的是,此位掩码参数在/ proc / sys / kernel / cap-bound中表示为带符号的十进制数。)
只有初始化过程才能在功能边界集中设置功能;除此之外,超级用户(更确切地说:具有CAP_SYS_MODULE功能的进程)可能仅清除此集合中的功能。
在标准系统上,功能边界集始终掩盖CAP_SETPCAP功能。要删除此限制(危险!),请在 include / linux / capability.h中修改CAP_INIT_EFF_SET的定义并重建内核。
从内核版本2.2.11开始,系统范围的功能限制集功能已添加到Linux。
1.c Effect of user ID changes on capabilities 用户ID更改对功能的影响
为了保留传统的语义,以实现0和非零用户ID之间的转换,内核会根据对线程的真实,有效,已保存集和文件系统用户ID的更改(使用setuid(2),setresuid( 2)或类似):
1。如果一个或多个真实,有效或已保存的用户ID先前为0,并且由于UID更改而导致所有这些ID均具有非零值,则将从许可的,有效和环境能力集中清除所有能力。
2。如果有效用户ID从0更改为非零,那么将从有效集中清除所有功能。
3。如果有效用户ID从非零更改为0,则将允许的集复制到有效集。
4。如果文件系统用户ID从0更改为非零(请参阅 setfsuid(2)),那么将从有效集中清除以下功能:CAP_CHOWN,CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH,CAP_FOWNER,CAP_FSETID, CAP_LINUX_IMMUTABLE(从Linux CAP 2.6.30开始),和CAP_MKNOD(从Linux 2.6.30开始)。如果文件系统UID从非零更改为0,则在有效集中启用在允许集中启用的所有功能。
如果一个线程的一个或多个用户ID的值为0,则当它希望将其所有用户ID重置为非零值时希望阻止清除其允许的功能集时,可以使用下面所述的 SECBIT_KEEP_CAPS securebits标志来实现。
1.e Programmatically adjusting capability sets 以编程方式调整功能集
线程可以使用capget(2)和capset(2)系统调用来检索和更改其允许的,有效的和可继承的功能集。但是,为此目的,最好使用libcap软件包中都提供的cap_get_proc(3)和cap_set_proc(3)。以下规则控制线程功能集的更改:
1。如果调用者不具有CAP_SETPCAP功能,则新的可继承集必须是现有可继承集和允许集的组合的子集。
2。(从Linux 2.6.25开始)新的可继承集必须是现有可继承集和功能边界集的组合的子集。
3。新的允许集必须是现有允许集的子集(即,不可能获取线程当前不具备的允许功能)。
4。新的有效集必须是新的允许集的子集。
1.e The securebits flags: establishing a capabilities-only environment 建立仅功能的环境
从内核2.6.26开始,并在启用了文件功能的内核中,Linux实现了一组每线程安全位标志,这些标志可用于禁用对UID 0(root)的功能的特殊处理。这些标志如下:
SECBIT_KEEP_CAPS
设置此标志可使具有一个或多个0 UID的线程在将其所有UID都切换为非零值时将功能保留在其允许的集合中。如果未设置此标志,则此类UID开关将导致线程丢失所有允许的功能。始终在execve(2)上清除此标志。
请注意,即使设置了SECBIT_KEEP_CAPS标志,当线程将其有效UID切换为非零值时,也会清除其有效功能。但是,如果线程已设置此标志并且其有效UID已经为非零,并且线程随后将所有其他UID切换为非零值,则将不会清除有效功能。
如果设置了SECBIT_NO_SETUID_FIXUP标志,则将忽略 SECBIT_KEEP_CAPS标志的设置。(后一个标志提供了前一个标志效果的超集。)
该标志提供的功能与早期的prctl(2) PR_SET_KEEPCAPS操作相同。
SECBIT_NO_SETUID_FIXUP
当线程的有效UID和文件系统UID在零和非零值之间切换时,设置此标志将阻止内核调整进程的允许,有效和环境能力设置。(请参阅小节用户ID更改对功能的影响。)
SECBIT_NOROOT
如果设置了此位,则当执行set-user-ID-root程序或有效或实际UID为0的进程调用execve(2)时,内核将不授予功能。(请参阅小节 功能和按root执行程序)。
SECBIT_NO_CAP_AMBIENT_RAISE
设置此标志不允许通过prctl(2) PR_CAP_AMBIENT_RAISE操作提高环境功能 。
上面的每个“基本”标志都有一个伴随的“已锁定”标志。设置任何“锁定”标志都是不可逆的,并且具有防止进一步更改相应“基本”标志的作用。锁定标志为: SECBIT_KEEP_CAPS_LOCKED,SECBIT_NO_SETUID_FIXUP_LOCKED, SECBIT_NOROOT_LOCKED和 SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED。
所述securebits标志可被修改,并使用所检索的使用prctl(2) PR_SET_SECUREBITS和PR_GET_SECUREBITS 操作。该CAP_SETPCAP能力需要修改的标志。请注意,只有在包含<linux / securebits.h>头文件之后,SECBIT_ *常量才可用。
该securebits标志由子进程继承。在execve(2)期间,将保留所有标志,但始终清除的SECBIT_KEEP_CAPS除外 。
应用程序可以使用以下调用将自身及其所有后代锁定到唯一获得能力的方法是通过执行具有关联文件功能的程序的环境:
prctl(PR_SET_SECUREBITS, /* SECBIT_KEEP_CAPS off */ SECBIT_KEEP_CAPS_LOCKED | SECBIT_NO_SETUID_FIXUP | SECBIT_NO_SETUID_FIXUP_LOCKED | SECBIT_NOROOT | SECBIT_NOROOT_LOCKED); /* Setting/locking SECBIT_NO_CAP_AMBIENT_RAISE is not required */
1.f Per-user-namespace "set-user-ID-root" programs 每个用户命名空间的“设置用户ID根”程序
UID与创建用户名称空间的UID匹配的set-user-ID程序,当由该名称空间中的任何进程或任何后代用户名称空间执行时,将在该进程的允许和有效集中赋予功能。
关于execve(2)期间过程能力转换的规则完全与小节 execve()中的能力转换以及功能和按root执行程序的小节中所述,不同之处在于,在后一小节中,“ root ”是用户名称空间创建者的UID。
1.g Namespaced file capabilities 命名空间文件功能
传统(即版本2)文件功能仅将一组功能掩码与二进制可执行文件关联。当进程执行具有此类功能的二进制文件时,它会根据上面“ execve()期间的功能转换”中所述的规则获得关联的功能(在其用户名称空间内)。
由于版本2文件功能将功能授予执行过程,而不管其驻留在哪个用户名称空间中,因此仅允许特权进程将功能与文件关联。在此,“特权”是指 在安装了文件系统的用户名称空间(通常是初始用户名称空间)中具有CAP_SETFCAP功能的进程。此限制使文件功能在某些用例中无用。例如,在以用户命名空间分隔的容器中,可能希望能够创建一个二进制文件,该二进制文件仅将功能授予该容器内部执行的进程,而不授予该容器外部执行的进程。
Linux 4.14添加了所谓的命名空间文件功能来支持此类用例。命名空间文件功能记录为版本3(即VFS_CAP_REVISION_3)security.capability扩展属性。在上述情况下,在“文件功能扩展属性版本控制”下会自动创建这样的属性。创建版本3 security.capability扩展属性时,内核不仅在扩展属性中记录功能掩码,还记录名称空间根用户ID。
与具有二进制VFS_CAP_REVISION_2文件的能力,与二进制VFS_CAP_REVISION_3中文件的能力赋予能力的过程的execve()。但是,仅当二进制文件由驻留在其UID 0映射到扩展属性中保存的根用户ID的用户名称空间中的进程执行时,或者由驻留在此类后代中的进程执行时,才赋予功能。命名空间。
1.g Interaction with user namespaces 与用户名称空间的交互
有关功能和用户名称空间交互的更多信息,请参见user_namespaces(7)。
1.i NOTES 笔记
尝试使用strace(1)具有功能的二进制文件(或set-user-ID-root二进制文件)时,您可能会发现-u <username>选项很有用。就像是:
$ sudo strace -o trace.log -u ceci ./myprivprog
从内核2.5.27到内核2.6.26,功能是可选的内核组件,可以通过CONFIG_SECURITY_CAPABILITIES内核配置选项启用/禁用 。
所述的/ proc / [PID] /任务/ TID /状态文件可以用来查看能力集的螺纹的。在的/ proc / [PID] /状态文件显示能力集进程的主线程的。在Linux 3.8之前的版本中,不存在的功能显示为已启用(1)。从Linux 3.8开始,所有不存在的功能(在CAP_LAST_CAP之上)都显示为已禁用(0)。
所述的libcap包提供了一套例程设置和获取功能,是更舒适并且不太可能改变比提供的接口capset(2)和capget(2) 。该软件包还提供了setcap(8)和getcap(8)程序。可以在以下链接找到 。https://git.kernel.org/pub/scm/libs/libcap/libcap.git/refs/
在内核2.6.24之前,以及从内核2.6.24到内核2.6.32(如果未启用文件功能),具有CAP_SETPCAP 功能的线程可以操纵其自身以外的线程的功能。但是,这仅在理论上是可能的,因为在以下两种情况之一中,没有线程具有 CAP_SETPCAP:
在2.6.25之前的实现中,系统范围的功能限制集 / proc / sys / kernel / cap-bound始终掩盖CAP_SETPCAP 功能,并且在不修改内核源代码和重建内核的情况下无法更改此功能。
如果禁用了文件功能(即,禁用了内核 CONFIG_SECURITY_FILE_CAPABILITIES选项),则 init将从将CAP_SETPCAP功能从其每个进程的边界集中删除开始,并且该边界集将由系统上创建的所有其他进程继承。
1.j Capabilities list 能力清单
https://jlk.fjfi.cvut.cz/arch/manpages/man/capabilities.7
https://en.wikibooks.org/wiki/Grsecurity/Appendix/Capability_Names_and_Descriptions
https://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271
以下列表(包含上面3个页面的描述文字)显示了在Linux上实现的功能,以及每种功能允许的操作或行为:
name (Linux) | jlk.fjfi.cvut.cz/arch/manpages/man/capabilities.7 | cn-38-cvut.cz | en.wikibooks.org/wiki/grsecurity/appendix/capability_names_and_descriptions | forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271 |
cap_mknod (2.4) |
Create special files using mknod(2). | 使用mknod(2)创建特殊文件。 | 允许mknod()的特权方面。 | 允许创建非root用户拥有的块设备, 该块设备与(例如)系统磁盘是同一设备(在grsecurity上, 访问该块设备也将需要cap_sys_rawio). 这允许对系统上的任何二进制文件进行后门操作. |
cap_audit_control (2.6.11) |
Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. | 启用和禁用内核审核; 更改审核过滤器规则; 检索审核状态和过滤规则。 | 允许管理内核的审核系统。 | 到审计子系统的audit_tty_get/audit_tty_set netlink命令允许记录和检索tty i/o, 从而获得root密码 |
cap_setfcap (2.6.24) |
Set arbitrary capabilities on a file. | 在文件上设置任意功能。 | 允许设置文件功能。 | 可以对文件设置全部功能, 在执行时授予全部功能 |
cap_chown | Make arbitrary changes to file UIDs and GIDs (see chown(2)). | 对文件UID和GID进行任意更改 | 在定义了[_posix_chown_restricted]选项的系统中,这将覆盖更改文件所有权和组所有权的限制。 | /etc/shadow、/root/.ssh/*可以通过所有权更改被盗或修改, 从而允许完整的root用户 |
cap_dac_override | Bypass file read, write, and execute permission checks. (DAC is an abbreviation of "discretionary access control".) | 绕过文件读取, 写入和执行权限检查。(DAC是“*访问控制”的缩写。) | 如果定义了[_posix_acl],则覆盖所有dac访问,包括acl执行访问。 不包括cap_linux_immutable涵盖的dac访问。 |
与cap_dac_read_search相同的旁路, 也可以修改由root执行的非suid二进制文件以具有全部特权执行代码(修改suid根二进制文件供您执行将需要cap_fsetid, 因为否则setuid位会在修改时清除;多亏了eric paris ). 可以如上所述修改modprobe sysctl以执行具有全部功能的代码. |
cap_dac_read_search | Bypass file read permission checks and directory read and execute permission checks; invoke open_by_handle_at(2); use the linkat(2) AT_EMPTY_PATH flag to create a link to a file referred to by a file descriptor. |
绕过文件读取权限检查以及目录读取和执行权限检查; 调用open_by_handle_at(2) ; 使用linkat(2) AT_EMPTY_PATH标志创建到文件描述符引用的文件的链接。 |
如果定义了[_posix_acl],则覆盖所有关于文件和目录的读取和搜索的dac限制,包括acl限制。 不包括cap_linux_immutable涵盖的dac访问。 |
/etc/shadow、/root/.ssh/*可以读取, 从而允许完整的root用户 |
cap_fowner | Bypass permission checks on operations that normally require the filesystem UID of the process to match the UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by CAP_DAC_OVERRIDE and CAP_DAC_READ_SEARCH; set inode flags (see ioctl_iflags(2)) on arbitrary files; set Access Control Lists (ACLs) on arbitrary files; ignore directory sticky bit on file deletion; modify user extended attributes on sticky directory owned by any user; specify O_NOATIME for arbitrary files in open(2) and fcntl(2). |
绕过权限检查通常需要进程的文件系统UID匹配文件的UID的操作(例如 chmod(2), utime(2)), 但CAP_DAC_OVERRIDE和CAP_DAC_READ_SEARCH所覆盖的那些操作 除外; 在任意文件上设置inode标志(请参阅ioctl_iflags(2)); 在任意文件上设置访问控制列表(ACL); 在删除文件时忽略目录粘贴位; 修改任何用户拥有的粘性目录上的用户扩展属性; 为open(2)和 fcntl(2)中的任意文件指定O_NOATIME。 |
覆盖关于文件上允许的操作的所有限制,其中文件所有者id必须等于用户id,但适用cap_fsetid的情况除外。 它不会覆盖mac和dac限制。 |
允许任意的chmod, 从而允许chmod 777/etc/shadow读取/修改根密码并获得对系统的完全访问权限 |
cap_net_admin | Perform various network-related operations: interface configuration; administration of IP firewall, masquerading, and accounting; modify routing tables; bind to any address for transparent proxying; set type-of-service (TOS); clear driver statistics; set promiscuous mode; enabling multicasting; use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE. |
执行各种与网络相关的操作: 接口配置; IP防火墙的管理, 伪装和计费; 修改路由表; 绑定到任何地址以进行透明代理; 设置服务类型(TOS); 清除驾驶员统计信息; 设置混杂模式; 启用多播; 使用setsockopt(2)设置以下套接字选项: SO_DEBUG, SO_MARK, SO_PRIORITY(对于0到6之外的优先级), SO_RCVBUFFORCE和 SO_SNDBUFFORCE。 |
允许接口配置。 允许管理ip防火墙,伪装和计费。 允许在套接字上设置调试选项。 允许修改路由表。 允许在套接字上设置任意进程/进程组所有权。 允许绑定到任何地址以进行透明代理。 允许设置tos(服务类型)。 允许设置混杂模式。 允许清除驱动程序统计信息。 允许多播。 允许读/写设备专用寄存器。 允许激活atm控制插座。 |
除其他功能外, 还可以管理防火墙, 从而可以将发往系统网络服务的数据包重定向到木马服务, 以窃取凭据或利用客户端. 2009年8月至2011年3月之间的内核还允许具有cap_net_admin的用户加载普通搜索路径中的任何模块(例如: ifconfig xfs加载xfs模块(如果存在)), 从而增加了内核的攻击面 |
cap_net_raw | Use RAW and PACKET sockets; bind to any address for transparent proxying. |
使用RAW和PACKET插槽; 绑定到任何地址以进行透明代理。 |
允许使用raw插槽。 允许使用packet插槽。 |
可以嗅探并将任何本地网络服务重定向到特洛伊木马, 类似于cap_net_admin攻击(感谢下面的评论者) |
cap_setpcap | If file capabilities are supported (i.e., since Linux 2.6.24): add any capability from the calling thread‘s bounding set to its inheritable set; drop capabilities from the bounding set (via prctl(2) PR_CAPBSET_DROP); make changes to the securebits flags. If file capabilities are not supported (i.e., kernels before Linux 2.6.24): grant or remove any capability in the caller‘s permitted capability set to or from any other process. (This property of CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since CAP_SETPCAP has entirely different semantics for such kernels.) |
如果支持文件功能(例如, 从Linux 2.6.24开始): 将调用线程边界集的任何功能添加到其可继承集; 从边界集中删除功能(通过prctl(2) PR_CAPBSET_DROP); 更改securebits标志。 如果不支持文件功能(例如, Linux 2.6.24之前的内核): 在任何其他进程中调用方的允许功能集中授予或删除任何功能。(的此属性 CAP_SETPCAP当内核被配置为支持文件能力, 因为不提供CAP_SETPCAP具有用于这样的内核完全不同的语义。) |
没有vfs对功能的支持: 将许可集中的任何功能转移到任何pid,将许可集中的任何功能从任何pid中删除。 借助vfs对功能的支持(以上均不支持)。 将当前能力边界集中的任何能力添加到当前流程的可继承集合中。 允许将比特移出功能边界集。 允许修改进程的安全位。 |
如果尚未降低当前进程的有界集合, 则可以通过修改可继承集合在子进程中获得任何功能. 此功能允许绕过限制, 该限制要求功能处于子进程继承的当前进程的允许集中. |
cap_setuid | Make arbitrary manipulations of process UIDs (setuid(2), setreuid(2), setresuid(2), setfsuid(2)); forge UID when passing socket credentials via UNIX domain sockets; write a user ID mapping in a user namespace (see user_namespaces(7)). |
对进程UID进行任意操作(setuid(2), setreuid(2), setresuid(2), setfsuid(2)); 通过UNIX域套接字传递套接字凭证时伪造UID; 在用户名称空间中编写用户ID映射(请参阅 user_namespaces(7))。 |
允许set * uid(2)操作(包括fsuid)。 允许套接字凭据传递时使用伪造的pid。 |
可以将实际uid设置为0并在exec上获得全部功能. 也可以用于忽略对unix域套接字的凭据检查, 并通过假定的安全通道馈送精心制作的数据. 也可以用作有效的cap_sys_ptrace替换(您可以更改为任何uid, 因此可以跟踪任何进程). |
cap_sys_admin | Note: this capability is overloaded; see Notes to kernel developers, below. Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), pivot_root(2), swapon(2), swapoff(2), sethostname(2), and setdomainname(2); perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to permit such operations); perform VM86_REQUEST_IRQ vm86(2) command; perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects; override RLIMIT_NPROC resource limit; perform operations on trusted and security extended attributes (see xattr(7)); use lookup_dcookie(2); use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling classes; forge PID when passing socket credentials via UNIX domain sockets; exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system calls that open files (e.g., accept(2), execve(2), open(2), pipe(2)); employ CLONE_* flags that create new namespaces with clone(2) and unshare(2) (but, since Linux 3.8, creating user namespaces does not require any capability); call perf_event_open(2); access privileged perf event information; call setns(2) (requires CAP_SYS_ADMIN in the target namespace); call fanotify_init(2); call bpf(2); perform privileged KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations; perform madvise(2) MADV_HWPOISON operation; employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other than the caller‘s controlling terminal; employ the obsolete nfsservctl(2) system call; employ the obsolete bdflush(2) system call; perform various privileged block-device ioctl(2) operations; perform various privileged filesystem ioctl(2) operations; perform privileged ioctl(2) operations on the /dev/random device (see random(4)); install a seccomp(2) filter without first having to set the no_new_privs thread attribute; modify allow/deny rules for device control groups; employ the ptrace(2) PTRACE_SECCOMP_GET_FILTER operation to dump tracee‘s seccomp filters; employ the ptrace(2) PTRACE_SETOPTIONS operation to suspend the tracee‘s seccomp protections (i.e., the PTRACE_O_SUSPEND_SECCOMP flag); perform administrative operations on many device drivers. Modify autogroup nice values by writing to /proc/[pid]/autogroup (see sched(7)). |
注意: 此功能过载; 请参阅下面的内核开发人员说明。 执行一系列系统管理操作, 包括: quotactl(2), mount(2), umount(2), pivot_root(2), swapon(2), swapoff(2), sethostname(2)和setdomainname(2); 执行特权的syslog(2)操作(从Linux 2.6.37开始, 应使用CAP_SYSLOG允许此类操作); 执行VM86_REQUEST_IRQ vm86(2)命令; 对任意System V IPC对象执行IPC_SET和IPC_RMID操作; 覆盖RLIMIT_NPROC资源限制; 对可信和安全扩展属性执行操作(请参阅xattr(7)); 使用lookup_dcookie(2) ; 使用ioprio_set(2)分配IOPRIO_CLASS_RT和(在Linux 2.6.25之前)IOPRIO_CLASS_IDLE I/O调度类; 通过UNIX域套接字传递套接字凭证时伪造PID; 超过/ proc/sys/fs/file-max, 即系统范围内打开文件数量的限制, 在打开文件的系统调用中(例如accept(2), execve(2), open(2), pipe( 2)); 使用CLONE_ *标志创建带有clone(2)和unshare(2)的新名称空间 (但是, 从Linux 3.8开始, 创建用户名称空间不需要任何功能); 调用perf_event_open(2) ; 访问特权PERF事件信息; 调用setns(2)(在目标 名称空间中需要CAP_SYS_ADMIN); 调用highlight_init(2) ; 致电bpf(2) ; 执行特权KEYCTL_CHOWN和KEYCTL_SETPERM keyctl(2)操作; 执行madvise(2) MADV_HWPOISON操作; 使用TIOCSTI ioctl(2)将字符插入到呼叫者控制终端以外的终端的输入队列中; 使用过时的nfsservctl(2)系统调用; 使用过时的bdflush(2)系统调用; 执行各种特权块设备ioctl(2)操作; 执行各种特权文件系统ioctl(2)操作; 在/ dev/random 设备上执行特权ioctl(2)操作(请参阅random(4)); 安装seccomp(2)过滤器, 而无需首先设置 no_new_privs线程属性; 修改设备控制组的允许/拒绝规则; 使用ptrace(2) PTRACE_SECCOMP_GET_FILTER操作来转储Tracee的seccomp过滤器; 使用ptrace(2) PTRACE_SETOPTIONS操作来挂起跟踪的seccomp保护(即 PTRACE_O_SUSPEND_SECCOMP标志); 在许多设备驱动程序上执行管理操作。 通过写入/ proc/[pid]/autogroup来修改autogroup nice值 (请参阅sched(7))。 |
允许配置安全注意密钥。 允许管理随机设备。 允许检查和配置磁盘配额。 允许配置内核的syslog(printk行为)。 允许设置域名。 允许设置主机名。 允许调用bdflush()。 允许mount()和umount(),建立新的smb连接。 允许一些autofs根ioctl。 允许nfsservctl。 允许vm86_request_irq。 允许在alpha上读写pci配置。 在mips(setstacksize)上允许irix_prctl。 允许刷新m68k上的所有缓存(sys_cacheflush)。 允许删除信号量。用于代替cap_chown来“阻塞” ipc消息队列,信号量和共享内存。 允许锁定/解锁共享内存段。 允许打开/关闭交换。 允许在套接字凭据传递中使用伪造的pid。 允许在块设备上设置预读和刷新缓冲区。 允许在软驱中设置几何。 允许在xd驱动程序中打开/关闭dma。 允许管理md设备(大多数情况下,但还有一些额外的ioctl)。 允许调整ide驱动程序。 允许访问nvram设备。 允许管理apm_bios,串行和bttv(tv)设备。 允许在isdn capi支持驱动程序中使用制造商命令。 允许读取pci配置空间的非标准化部分。 允许在sbpcd驱动程序上进行ddi调试ioctl。 允许设置串行端口。 允许发送原始的qic–117命令。 允许在scsi控制器上启用/禁用标记队列并发送任意scsi命令。 允许在回送文件系统上设置加密密钥。 允许设置区域回收策略。 |
除其他外(这是一种包罗万象的功能选择), cap_sys_admin授予了挂载/卸载文件系统的能力. 因此, 您可以在现有文件系统上绑定安装新文件系统, 以后门系统上的任何二进制文件. 似乎没有对此操作进行任何dac检查, 因此功能本身就足够了. cap_sys_admin还授予对/ dev/tty(我们不拥有的tty)使用tiocsti ioctl并将命令注入到管理员外壳中的能力, 该外壳将在无需任何交互的情况下执行. |
cap_sys_boot | Use reboot(2) and kexec_load(2). | 使用reboot(2)和kexec_load(2)。 | 允许使用reboot()允许使用kexec()syscall | 加载新内核以使用kexec_load引导 |
cap_sys_chroot | Use chroot(2); change mount namespaces using setns(2). |
使用chroot(2) ; 使用setns(2)更改安装名称空间。 |
允许使用chroot()。 | 来自julien tinnes/chris evans的文章: 如果您具有与suid根二进制文件相同的文件系统的写访问权, 请使用后门libc设置chroot环境, 然后在chroot中执行硬链接的suid根二进制文件, 并通过后门获得完整的root特权. |
cap_sys_module | Load and unload kernel modules (see init_module(2) and delete_module(2)); in kernels before 2.6.25: drop capabilities from the system-wide capability bounding set. |
加载和卸载内核模块(请参阅init_module(2)和 delete_module(2)); 在2.6.25之前的内核中: 从系统范围的功能边界集中删除功能。 |
插入和删除内核模块–无限修改内核。 | 允许修改内核 |
cap_sys_ptrace | Trace arbitrary processes using ptrace(2); apply get_robust_list(2) to arbitrary processes; transfer data to or from the memory of arbitrary processes using process_vm_readv(2) and process_vm_writev(2); inspect processes using kcmp(2). |
使用ptrace(2)跟踪任意进程; 将get_robust_list(2)应用于任意进程; 使用process_vm_readv(2)和process_vm_writev(2)在任意进程的内存之间传输数据 ; 使用kcmp(2)检查进程。 |
允许任何进程使用ptrace()。 | ptrace跟踪具有所需功能的任何uid的进程, 以poketext/setregs的方式控制流劫持和在全部功能下执行代码的方式. |
cap_sys_rawio | Perform I/O port operations (iopl(2) and ioperm(2)); access /proc/kcore; employ the FIBMAP ioctl(2) operation; open devices for accessing x86 model-specific registers (MSRs, see msr(4)); update /proc/sys/vm/mmap_min_addr; create memory mappings at addresses below the value specified by /proc/sys/vm/mmap_min_addr; map files in /proc/bus/pci; open /dev/mem and /dev/kmem; perform various SCSI device commands; perform certain operations on hpsa(4) and cciss(4) devices; perform a range of device-specific operations on other devices. |
执行I/O端口操作(iopl(2)和ioperm(2)); 访问/ proc/kcore ; 采用FIBMAP ioctl(2)操作; 打开用于访问特定于x86模型的寄存器(MSR, 请参阅 msr(4))的设备; 更新/ proc/sys/vm/mmap_min_addr ; 在/ proc/sys/vm/mmap_min_addr指定的值以下的地址创建内存映射 ; 映射文件在/ proc/bus/pci中; 打开/ dev/mem和/ dev/kmem ; 执行各种SCSI设备命令; 在hpsa(4)和cciss(4) 设备上执行某些操作; 在其他设备上执行一系列特定于设备的操作。 |
允许ioperm / iopl访问. 允许通过/ proc / bus / usb‘将usb消息发送到任何设备 |
允许映射null页, 以利用linux中大量的null指针取消引用. cap_sys_rawio还支持fibmap ioctl的使用, 它可能会通过处理来自不受信任来源的意外输入来处理内核(请参阅: http://lkml.indiana.edu/hypermail/linux .. . /0132.html(因为获得fibmap特权的原因)和http://linux.derkeiler.com/mailing-list ... 07723.html进行了进一步讨论). |
cap_sys_tty_config | Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. | 使用vhangup(2) ; 在虚拟终端上使用各种特权的ioctl(2)操作。 | 允许配置tty设备。 允许tty的vhangup()。 |
暂时通过kdsetkeycode ioctl更改管理员tty的键盘映射, 以导致执行与预期不同的命令(2.4版本中以前仅受suser()保护(本质上是uid == 0检查), 但在grsecurity中除外) |
cap_fsetid | Don‘t clear set-user-ID and set-group-ID mode bits when a file is modified; set the set-group-ID bit for a file whose GID does not match the filesystem or any of the supplementary GIDs of the calling process. |
修改文件时, 请勿清除set-user-ID和set-group-ID模式位。 将GID与文件系统或调用过程的任何补充GID不匹配的文件的set-group-ID位置1。 |
覆盖以下限制,即在该文件上设置s_isuid和s_isgid位时,有效用户id必须与文件所有者id相匹配;当在文件上设置s_isgid位时,有效组id(或补充组id之一)应与文件所有者id相匹配;从chown(2)成功返回时未清除s_isuid和s_isgid位(未实现)。 | 可以升级为gid =0. 如果内核是作为root编译的, 则内核源代码树中的某些目录/文件在默认情况下似乎可写为gid 0(在我的ubuntu 10.10测试系统上). 这可以允许内核后门. 在基于debian的系统上, 您可以升级为gid = staff, 这允许对/ usr/local中的任何二进制文件进行后门操作(或基本上所有其他没有其完整路径的二进制文件都进行后门操作, 因为/ usr/local通常在$ path中首先出现). 正如蒂姆·布朗(tim brown)所述: 由于gid = staff, 因此可以在/ usr/local/lib中放置一个特洛伊木马库, 在重建缓存后, 该木马库将比其他库搜索路径中的木马库更受青睐, 从而可以完全控制非木马程序中运行的代码. 静态suid根二进制文件. |
cap_ipc_owner | Bypass permission checks for operations on System V IPC objects. | 绕过权限检查对System V IPC对象的操作。 | 覆盖ipc所有权检查。 | 通过能够利用其ipc是私有的假设, 损害ipc的特权用户 |
cap_kill | Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT operation. | 绕过许可检查以发送信号(请参阅kill(2))。这包括使用ioctl(2) KDSIGACCEPT操作。 | 超越了以下限制:发送信号的进程的真实或有效用户id必须与接收信号的进程的真实或有效用户id相匹配。 | 如果网络服务是通过大于1024的非标准端口运行的, 则可以使用cap_kill来定位现有进程, 然后非root用户可以在其位置启动木马服务以在某些情况下窃取凭据, 或者剥削客户. 与cap_net_bind_service结合使用, 可以在任何端口上完成此操作. |
cap_setgid | Make arbitrary manipulations of process GIDs and supplementary GID list; forge GID when passing socket credentials via UNIX domain sockets; write a group ID mapping in a user namespace (see user_namespaces(7)). |
任意处理进程GID和补充GID列表; 通过UNIX域套接字传递套接字凭证时, 伪造GID; 在用户名称空间中编写组ID映射(请参阅 user_namespaces(7))。 |
允许setgid(2)操作。 允许setgroups(2)。 允许通过套接字凭证的伪造gid。 |
与cap_fsetid相同. |
cap_lease (2.4) |
Establish leases on arbitrary files (see fcntl(2)). | 在任意文件上建立租约 | 允许租借文件。 | |
cap_audit_write (2.6.11) |
Write records to kernel auditing log. | 将记录写入内核审核日志。 | 允许发出审核消息。 | |
cap_mac_admin (2.6.25) |
Allow MAC configuration or state changes. Implemented for the Smack Linux Security Module (LSM). | 允许MAC配置或状态更改。为Smack Linux安全模块(LSM)实现。 | 允许mac配置或状态更改。基本内核不需要mac配置。 lsm可以强制执行mac策略,如果这样做,它会选择基于对策略的修改或维护该策略所需数据的检查来实施功能,这就是它应该使用的功能。 | |
cap_mac_override (2.6.25) |
Override Mandatory Access Control (MAC). Implemented for the Smack LSM. | 覆盖强制访问控制(MAC)。为Smack LSM实施。 | 覆盖mac访问。基本内核不执行任何mac策略。 lsm可能会强制执行mac策略,如果确实如此,并且它选择实现该策略基于能力的替代,这就是它应该使用的能力。 | |
cap_syslog (2.6.37) |
Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege. View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the value 1. (See the discussion of the kptr_restrict in proc(5).) |
执行特权的syslog(2)操作。有关哪些操作需要特权的信息, 请参见syslog(2)。 通过暴露视图内核地址/ PROC和其他接口时 的/ proc/SYS /内核/ kptr_restrict具有值1(见的讨论kptr_restrict在PROC(5) 。) |
允许配置内核的syslog(printk行为)。 | |
cap_wake_alarm (3.0) |
Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers). | 触发一些会唤醒系统的事件(设置 CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM计时器)。 | 允许触发将唤醒系统的操作。 | |
cap_audit_read (3.16) |
Allow reading the audit log via a multicast netlink socket. | 允许通过多播netlink套接字读取审核日志。 | ||
cap_block_suspend (3.5) |
Employ features that can block system suspend (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock). | 使用可以阻止系统挂起的功能 (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock). | ||
cap_ipc_lock | Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). | 锁定内存 | 允许锁定共享内存段。 允许mlock和mlockall(与ipc无关)。 |
|
cap_linux_immutable | Set the FS_APPEND_FL and FS_IMMUTABLE_FL inode flags (see ioctl_iflags(2)). | 设置FS_APPEND_FL和FS_IMMUTABLE_FL inode标志 | 允许修改s_immutable和s_append文件属性。 | cap_linux_immutable很有趣. 不可变的标志禁止"mv”, 也禁止"chmod”和"chown”(chattr联机帮助页中未提及)以及通过">”和">>”进行重定向. 这意味着在没有"set -e”的shell脚本中, 这些操作将无提示地失败, 并且脚本继续. 发生非常频繁, 但这需要一些相当特殊的脚本才能被利用. 例如. 一个防火墙框架, 该框架可动态创建带有"iptables”指令的shell脚本. 在这种情况下, 实际上可以停用防火墙. |
cap_net_bind_service | Bind a socket to Internet domain privileged ports (port numbers less than 1024). | 将套接字绑定到Internet域特权端口(端口号小于1024)。 | 允许绑定到1024以下的tcp / udp套接字。 允许绑定到32以下的atm vci。 |
(如果服务已经在inaddr_any上进行侦听, 那么我无法绑定到特定接口是不正确的) |
cap_net_broadcast | (Unused) Make socket broadcasts, and listen to multicasts. | (未使用)进行套接字广播, 并收听多播。 | 允许广播,收听多播。 | |
cap_sys_nice | Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes; set real-time scheduling policies for calling process, and set scheduling policies and priorities for arbitrary processes (sched_setscheduler(2), sched_setparam(2), sched_setattr(2)); set CPU affinity for arbitrary processes (sched_setaffinity(2)); set I/O scheduling class and priority for arbitrary processes (ioprio_set(2)); apply migrate_pages(2) to arbitrary processes and allow processes to be migrated to arbitrary nodes; apply move_pages(2) to arbitrary processes; use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2). |
提高进程的nice值(nice(2), setpriority(2))并为任意进程更改nice值; 为调用进程设置实时调度策略, 并为任意进程设置调度策略和优先级(sched_setscheduler(2), sched_setparam(2), sched_setattr(2)); 为任意进程设置CPU关联性(sched_setaffinity(2)); 为任意进程设置I/O调度类和优先级(ioprio_set(2)); 将migration_pages(2)应用到任意进程, 并允许将进程迁移到任意节点; 将move_pages(2)应用于任意进程; 在mbind (2)和 move_pages(2)中使用MPOL_MF_MOVE_ALL标志。 |
允许提高优先级并为其他(不同的uid)进程设置优先级。 允许在自己的进程上使用fifo和循环调度(实时),并设置另一个进程使用的调度算法。 允许在其他进程上设置cpu亲和力。 |
cap_sys_nice应该更容易发起密码加密程序的边信道攻击. 可以迫使受害者和分析程序在同一cpu内核上单独存在. 然后, 您可以确定分支预测和缓存仅受您要分析的程序的影响. 如果可以降低受害者的优先级(=由于省电, cpu时钟速度在负载下不会增加)并且攻击者拥有一个cpu(具有较高的cpu时钟), 则可以轻松利用种族条件. 对于具有超线程的cpu, 可以将辅助程序放在第二个虚拟处理器(受害者是第一个虚拟处理器)上, 该程序通过使用cpu进一步降低受害者的性能, 并导致二级缓存命中率下降. |
cap_sys_pacct | Use acct(2). | 使用acct(2)。 | 允许配置过程记帐。 | |
cap_sys_resource | Use reserved space on ext2 filesystems; make ioctl(2) calls controlling ext3 journaling; override disk quota limits; increase resource limits (see setrlimit(2)); override RLIMIT_NPROC resource limit; override maximum number of consoles on console allocation; override maximum number of keymaps; allow more than 64hz interrupts from the real-time clock; raise msg_qbytes limit for a System V message queue above the limit in /proc/sys/kernel/msgmnb (see msgop(2) and msgctl(2)); allow the RLIMIT_NOFILE resource limit on the number of "in-flight" file descriptors to be bypassed when passing file descriptors to another process via a UNIX domain socket (see unix(7)); override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the F_SETPIPE_SZ fcntl(2) command; use F_SETPIPE_SZ to increase the capacity of a pipe above the limit specified by /proc/sys/fs/pipe-max-size; override /proc/sys/fs/mqueue/queues_max limit when creating POSIX message queues (see mq_overview(7)); employ the prctl(2) PR_SET_MM operation; set /proc/[pid]/oom_score_adj to a value lower than the value last set by a process with CAP_SYS_RESOURCE. |
在ext2文件系统上使用保留空间; 进行ioctl(2)调用以控制ext3日记记录; 覆盖磁盘配额限制; 增加资源限制(请参阅setrlimit(2)); 覆盖RLIMIT_NPROC资源限制; 在控制台分配中覆盖最大控制台数; 覆盖最大按键映射数; 允许来自实时时钟的超过64hz的中断; 将System V消息队列的msg_qbytes限制提高到/ proc/sys/kernel/msgmnb中的限制(请参阅msgop(2)和 msgctl(2)); 当通过UNIX域套接字将文件描述符传递到另一个进程时, 允许绕过“运行中”文件描述符数量的RLIMIT_NOFILE资源限制(请参见 unix(7)); 使用F_SETPIPE_SZ fcntl(2) 命令设置管道的容量时, 请覆盖/ proc/sys/fs/pipe-size-max限制; 使用F_SETPIPE_SZ将管道的容量增加到超过/ proc/sys/fs/pipe-max-size指定的限制; 创建POSIX消息队列时, 请覆盖/ proc/sys/fs/mqueue/queues_max限制(请参阅mq_overview(7)); 使用prctl(2) PR_SET_MM操作; 将/ proc/[pid]/oom_score_adj设置为小于使用CAP_SYS_RESOURCE的进程最后设置的值。 |
覆盖资源限制。设置资源限制。覆盖配额限制覆盖ext2文件系统上的保留空间修改ext3文件系统上的数据日记模式(使用日记资源)。注意:ext2在检查资源覆盖时会使用fsuid,因此您也可以使用fsuid覆盖。覆盖ipc消息队列的大小限制。允许来自实时时钟的超过64hz的中断。在控制台分配上覆盖最大控制台数。覆盖键映射的最大数量。 | |
cap_sys_time | Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. | 设置系统时钟(settimeofday(2), stime(2), adjtimex(2)); 设置实时(硬件)时钟。 | 允许操纵系统时钟。 在mips上允许irix_stime。 允许设置实时时钟。 |
2. 例子:
https://wiki.archlinux.org/index.php/Capabilities
能力(capability) (POSIX 1003.1e, capabilities(7))用更小的粒度控制超级管理员权限,可以避免使用 root 权限。软件开发者应该为二进制文件赋予最小权限,而不是使用强大的setuid。
很多软件包用了能力, 比如 iputils提供的ping 使用的CAP_NET_RAW(能力的一种) 。例如ping可以被普通用户执行(和setuid模式一样),同时减少了ping的潜在安全隐患。
在linux中,能力是通过命名空间security下的extended attributes (xattr(7))实现。主流linux都支持扩展属性,包括Ext2,Ext3,Ext4,Btrfs,JFS,XFS,和Reiserfs。 下面的例子展示了用getcap显示ping命令的能力,然后通过使用getfattr显示相同的编码后的数据。
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /usr/bin/ping
getfattr: Removing leading ‘/‘ from absolute path names
# file: usr/bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
扩展属性可以通过cp -a自动复制, 但是其他的命令需要一个特别的参数,比如: rsync -X。
在Arch中, 能力可以通过包安装脚本iputils.install设置。
2.1 更多示例
以下软件包没有具有setuid属性的文件,但需要root特权才能工作。通过启用某些功能,普通用户可以在没有特权提升的情况下使用该程序。
$ sudo setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
$ sudo setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
$ sudo setcap cap_net_raw+ep /usr/bin/iftop
$ sudo setcap cap_net_admin+ep /usr/bin/mii-tool
$ sudo setcap cap_net_raw+ep /usr/bin/mtr-packet
$ sudo setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
https://wiki.archlinux.org/index.php/Nginx
$ sudo setcap ‘cap_net_bind_service=+ep‘ $JAIL/usr/bin/nginx
https://wiki.archlinux.org/index.php/Tor#Kernel_capabilities
$ sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
$ getcap /usr/bin/nethogs
$ sudo setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
$ getcap /usr/bin/nethogs
/usr/bin/nethogs = cap_net_admin,cap_net_raw+ep
2.2 Useful commands
Find setuid-root files:
$ find /usr/bin /usr/lib -perm /4000 -user root
/usr/bin/su
/usr/bin/incrontab
/usr/bin/unix_chkpwd
/usr/bin/pkexec
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/expiry
/usr/bin/screen-4.8.0
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/fusermount
/usr/bin/fusermount3
/usr/bin/chfn
/usr/bin/sudo
/usr/bin/ksu
/usr/bin/chsh
/usr/bin/chage
/usr/bin/sg
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib/xf86-video-intel-backlight-helper
/usr/lib/Xorg.wrap
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
^[[B/usr/lib/mail-dotlock
/usr/lib/chromium/chrome-sandbox
/usr/lib/virtualbox/VBoxNetDHCP
/usr/lib/virtualbox/VirtualBoxVM
/usr/lib/virtualbox/VBoxHeadless
/usr/lib/virtualbox/VBoxSDL
/usr/lib/virtualbox/VBoxNetNAT
/usr/lib/virtualbox/VBoxNetAdpCtl
Find setgid-root files:
$ find /usr/bin /usr/lib -perm /2000 -group root
/usr/bin/unix_chkpwd
3. 更多参考
错误边界和任意代码执行 2002-02-20
https://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271
I‘ll use a system of mine as illustration of what real-world applications this affects. Here‘s a list of applications that need at least one of the root-equivalent capabilities after startup (even more would need them prior to that point, CAP_NET_BIND_SERVICE especially):
我将使用我的系统来说明这会影响哪些实际应用程序。 这是启动后至少需要一种与根等效的功能的应用程序列表 (在此之前, 甚至更多人将需要它们, 尤其是 cap_net_bind_service):
rsyslogd/syslogd (CAP_SYS_ADMIN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH)
cron (CAP_SETUID, CAP_SETGID)
login (CAP_SETUID, CAP_SETGID, CAP_FSETID, CAP_CHOWN)
cvs (CAP_DAC_OVERRIDE, CAP_SETUID, CAP_FSETID)
postfix (CAP_DAC_OVERRIDE, CAP_KILL, CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT)
apache (CAP_KILL, CAP_SETUID, CAP_SETGID)
sshd (CAP_KILL, CAP_SYS_TTY_CONFIG, CAP_SETUID, CAP_SETGID, CAP_CHOWN)
xinetd (CAP_SETUID, CAP_SETGID)
procmail (CAP_SETUID, CAP_SETGID, CAP_DAC_OVERRIDE)