mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/linux-hardening/privilege-escalation/euid-ruid-suid.md'
This commit is contained in:
		
							parent
							
								
									4422d1bd19
								
							
						
					
					
						commit
						799440bd88
					
				@ -4,8 +4,8 @@
 | 
			
		||||
 | 
			
		||||
### 用户标识变量
 | 
			
		||||
 | 
			
		||||
- **`ruid`**: **真实用户 ID** 表示发起该进程的用户。
 | 
			
		||||
- **`euid`**: 被称为 **有效用户 ID**,它代表系统用来确定进程权限的用户身份。通常情况下,`euid` 与 `ruid` 相同,除非在执行 SetUID 二进制文件的情况下,`euid` 会采用文件所有者的身份,从而授予特定的操作权限。
 | 
			
		||||
- **`ruid`**: **真实用户 ID** 表示发起进程的用户。
 | 
			
		||||
- **`euid`**: 被称为 **有效用户 ID**,它代表系统用来确定进程权限的用户身份。通常情况下,`euid` 与 `ruid` 相同,除非在执行 SetUID 二进制文件的情况下,`euid` 采用文件所有者的身份,从而授予特定的操作权限。
 | 
			
		||||
- **`suid`**: 这个 **保存的用户 ID** 在高权限进程(通常以 root 身份运行)需要暂时放弃其权限以执行某些任务时至关重要,之后再恢复其最初的提升状态。
 | 
			
		||||
 | 
			
		||||
#### 重要说明
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
- **`setuid`**: 与最初的假设相反,`setuid` 主要修改 `euid` 而不是 `ruid`。具体而言,对于特权进程,它将 `ruid`、`euid` 和 `suid` 与指定用户(通常是 root)对齐,有效地巩固这些 ID,因为 `suid` 的覆盖。详细信息可以在 [setuid man page](https://man7.org/linux/man-pages/man2/setuid.2.html) 中找到。
 | 
			
		||||
- **`setreuid`** 和 **`setresuid`**: 这些函数允许对 `ruid`、`euid` 和 `suid` 进行细致的调整。然而,它们的能力取决于进程的权限级别。对于非 root 进程,修改仅限于当前的 `ruid`、`euid` 和 `suid` 值。相比之下,root 进程或具有 `CAP_SETUID` 能力的进程可以为这些 ID 分配任意值。更多信息可以从 [setresuid man page](https://man7.org/linux/man-pages/man2/setresuid.2.html) 和 [setreuid man page](https://man7.org/linux/man-pages/man2/setreuid.2.html) 中获取。
 | 
			
		||||
 | 
			
		||||
这些功能的设计并不是作为安全机制,而是为了促进预期的操作流程,例如当程序通过更改其有效用户 ID 来采用另一个用户的身份时。
 | 
			
		||||
这些功能并不是作为安全机制设计的,而是为了促进预期的操作流程,例如当程序通过更改其有效用户 ID 来采用另一个用户的身份时。
 | 
			
		||||
 | 
			
		||||
值得注意的是,虽然 `setuid` 可能是提升到 root 权限的常用方法(因为它将所有 ID 对齐到 root),但区分这些函数对于理解和操控不同场景下的用户 ID 行为至关重要。
 | 
			
		||||
 | 
			
		||||
@ -38,21 +38,21 @@
 | 
			
		||||
- **功能**: 与 `execve` 不同,`system` 使用 `fork` 创建一个子进程,并在该子进程中执行命令,使用 `execl`。
 | 
			
		||||
- **命令执行**: 通过 `sh` 执行命令,使用 `execl("/bin/sh", "sh", "-c", command, (char *) NULL);`。
 | 
			
		||||
- **行为**: 由于 `execl` 是 `execve` 的一种形式,它在新子进程的上下文中以类似方式操作。
 | 
			
		||||
- **文档**: 进一步的见解可以从 [`system` man page](https://man7.org/linux/man-pages/man3/system.3.html) 中获得。
 | 
			
		||||
- **文档**: 进一步的见解可以从 [`system` man page](https://man7.org/linux/man-pages/man3/system.3.html) 中获取。
 | 
			
		||||
 | 
			
		||||
#### **带有 SUID 的 `bash` 和 `sh` 的行为**
 | 
			
		||||
 | 
			
		||||
- **`bash`**:
 | 
			
		||||
- 具有 `-p` 选项,影响 `euid` 和 `ruid` 的处理方式。
 | 
			
		||||
- 有一个 `-p` 选项影响 `euid` 和 `ruid` 的处理方式。
 | 
			
		||||
- 如果没有 `-p`,`bash` 会将 `euid` 设置为 `ruid`,如果它们最初不同。
 | 
			
		||||
- 如果有 `-p`,则保留初始的 `euid`。
 | 
			
		||||
- 更多细节可以在 [`bash` man page](https://linux.die.net/man/1/bash) 中找到。
 | 
			
		||||
- **`sh`**:
 | 
			
		||||
- 不具备类似于 `bash` 中的 `-p` 的机制。
 | 
			
		||||
- 关于用户 ID 的行为没有明确提及,除了在 `-i` 选项下,强调保持 `euid` 和 `ruid` 的相等性。
 | 
			
		||||
- 没有类似于 `bash` 中的 `-p` 的机制。
 | 
			
		||||
- 关于用户 ID 的行为没有明确提及,除了在 `-i` 选项下,强调保留 `euid` 和 `ruid` 的相等性。
 | 
			
		||||
- 额外信息可在 [`sh` man page](https://man7.org/linux/man-pages/man1/sh.1p.html) 中找到。
 | 
			
		||||
 | 
			
		||||
这些机制在操作上各不相同,提供了多种执行和程序间转换的选项,具体细节在用户 ID 的管理和保持方面有所不同。
 | 
			
		||||
这些机制在操作上各不相同,为执行和程序之间的转换提供了多种选择,具体细节在用户 ID 的管理和保留方面有所不同。
 | 
			
		||||
 | 
			
		||||
### 测试执行中的用户 ID 行为
 | 
			
		||||
 | 
			
		||||
@ -86,10 +86,10 @@ uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconf
 | 
			
		||||
```
 | 
			
		||||
**分析:**
 | 
			
		||||
 | 
			
		||||
- `ruid` 和 `euid` 初始值分别为 99 (nobody) 和 1000 (frank)。
 | 
			
		||||
- `setuid` 将两者都调整为 1000。
 | 
			
		||||
- `ruid` 和 `euid` 初始值分别为 99(nobody)和 1000(frank)。
 | 
			
		||||
- `setuid` 将两者对齐到 1000。
 | 
			
		||||
- `system` 执行 `/bin/bash -c id`,这是由于 sh 到 bash 的符号链接。
 | 
			
		||||
- `bash` 在没有 `-p` 的情况下,将 `euid` 调整为与 `ruid` 匹配,导致两者都为 99 (nobody)。
 | 
			
		||||
- `bash` 在没有 `-p` 的情况下,将 `euid` 调整为与 `ruid` 匹配,导致两者均为 99(nobody)。
 | 
			
		||||
 | 
			
		||||
#### 案例 2:使用 setreuid 和 system
 | 
			
		||||
 | 
			
		||||
@ -140,7 +140,7 @@ uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_
 | 
			
		||||
```
 | 
			
		||||
**分析:**
 | 
			
		||||
 | 
			
		||||
- `ruid` 保持为 99,但 euid 被设置为 1000,符合 setuid 的效果。
 | 
			
		||||
- `ruid` 保持为 99,但 euid 设置为 1000,符合 setuid 的效果。
 | 
			
		||||
 | 
			
		||||
**C 代码示例 2(调用 Bash):**
 | 
			
		||||
```bash
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user