首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根用户和其他用户究竟有什么区别?

根用户和其他用户究竟有什么区别?
EN

Unix & Linux用户
提问于 2016-03-02 18:56:24
回答 2查看 2.5K关注 0票数 6

一些任意的帐户和root之间的根本区别是什么?仅仅是UID不是零吗?

那么,su二进制到底是做什么的,它如何将用户提升为根呢?我知道用户首先必须是sudo组的一部分,通过我们在/etc/sudoers中的发现。

代码语言:javascript
运行
复制
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

查看一下su可执行文件的权限,我们找到-rwsr-xr-x或4755 (即设置了setuid )。

是su二进制文件读取此配置文件并检查请求根权限的用户是否属于组sudo或admin?如果是这样的话,二进制程序是否将另一个shell派生为根(考虑setuid位),假设用户是预期组的一部分,并且知道要替换的适当用户密码(特别是.e.g根)?

tl;dr是特权提升的行为依赖于su二进制中的setuid位,还是有其他机制来改变当前进程的UID?对于前者,似乎只有EUID会更改UID != EUID。这有问题吗?

与此相关的是,在Android环境中,这一切是如何模仿的?据我所知,对root的访问已经完全取消--尽管进程仍然在这个特权级别上运行。

如果我们删除了sudosu,这是否足以阻止权限的提升,或者安卓是否采取了进一步的措施?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2016-03-03 01:02:52

根是用户0

关键是用户ID 0。内核中有许多地方检查调用进程的用户ID,并授予只在用户ID为0的情况下执行某些操作的权限。

用户名是不相关的;内核甚至不知道用户名。

Android的权限机制在内核级别是相同的,但在应用程序级别则完全不同。Android有根用户(UID 0),就像其他基于Linux内核的系统一样。但是Android没有用户帐户,而且大多数设置都不允许用户(如人工操作和拥有设备)作为根用户执行操作。“根”Android是允许设备所有者/用户以root用户身份执行操作的设置。

setuid如何工作

塞图德可执行文件以拥有可执行文件的用户身份运行。例如,su是setuid,由root拥有,所以当任何用户运行它时,运行su的进程都会作为根用户运行。su的任务是验证调用它的用户是否允许使用根帐户,如果验证成功,则运行指定的命令(如果没有指定命令,则运行shell ),如果验证失败,则退出。例如,su可能要求用户证明他们知道根密码。

更详细地说,进程具有三个用户ID:有效UID,用于安全检查;实际UID,用于几个特权检查,但主要用作原始用户ID的备份;保存的用户ID允许进程将其有效UID临时切换到实际用户ID,然后返回到以前的有效UID (例如,当setuid程序需要以原始用户身份访问文件时)。运行setuid可执行文件将有效的UID设置为可执行文件的所有者,并保留实际的UID。

运行setuid可执行文件(以及类似的机制,例如setgid)是提升进程权限的唯一方法。几乎所有其他事情都只能降低进程的权限。

超越了传统的Unix

直到现在,我还描述了传统的Unix系统。在现代Linux系统中,所有这些都是正确的,但是Linux带来了一些额外的复杂性。

Linux有一个能力系统。还记得我说过内核有很多只允许以用户ID 0运行的进程的检查吗?实际上,每个检查都有自己的功能(不完全,有些检查使用相同的功能)。例如,有访问原始网络套接字的功能,还有重新启动系统的功能。每个进程在其用户和组侧都有一组功能。如果进程以用户0的身份运行,或者它具有与检查相对应的功能,则该进程将通过检查。需要特定权限的进程可以以非根用户的身份运行,但具有必要的功能;如果进程存在安全漏洞,这将限制其影响。一个可执行文件可以设置为一个或多个功能:这类似于setuid,但是可以使用进程的功能集而不是进程的用户ID。例如,ping只需要原始网络套接字,所以它可以是setcap CAP_NET_RAW而不是setuid。

Linux有几个安全模块,最著名的是SELinux。安全模块引入了额外的安全检查,甚至可以应用于以根用户身份运行的进程。例如,这是可能的(不容易!)设置SELinux以便以用户ID 0的形式运行一个进程,但是有太多的限制,以至于它实际上无法执行任何操作

Linux有用户命名空间。在内核中,用户实际上不仅仅是一个用户ID,而是由一个用户ID和一个命名空间组成的一对。名称空间形成层次结构:子名称空间细化其父空间内的权限。强大的用户是根命名空间中的用户0。名称空间中的用户0仅在该命名空间中具有权限。例如,用户名称空间中的用户0可以模拟该名称空间的任何用户;但从外部看,该名称空间中的所有进程都是作为同一个用户运行的。

票数 13
EN

Unix & Linux用户

发布于 2016-03-02 21:06:19

一般来说,有效的uid是0。可执行文件上的"setuid“位实际上设置了进程的有效uid。如果有效uid不是零,而实际uid不是零,则程序是以“非特权”用户的身份运行的。以下规定适用于:

非特权进程只能将有效用户ID设置为实际用户ID、有效用户ID或保存的集用户ID。非特权用户只能将实际用户ID设置为实际用户ID或有效用户ID。

就安卓系统而言,不,我认为删除sudosu是不够的--如果任何程序都可以设置seteuid位,那么该程序可能会以uid = 0运行。如果有可能在任何时候以根用户的身份访问内部文件系统,则可以引入这样的程序,并且根访问是可行的。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/267153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档