루트 사용자와 다른 사용자의 차이점은 무엇입니까?

루트 사용자와 다른 사용자의 차이점은 무엇입니까?

일부 임의 계정과 의 근본적인 차이점은 무엇입니까 root? 0 이 UID아닌 다른 것입니까?

그렇다면 그것은 무엇을 하는가?바이너리하다사용자를 루트로 승격시키는 방법은 무엇입니까? 나는 사용자가 먼저 sudo우리가 에서 찾은 콘텐츠를 통해 그룹의 일부가 되어야 한다는 것을 이해합니다 /etc/sudoers.

# 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설정되어 있음)

예 혹은 아니오이 구성 파일을 읽고 루트 권한을 요청하는 사용자가 두 그룹 중 하나에 속하는지 확인하는 바이너리스도또는행정? 그렇다면 바이너리는 다른 쉘을 루트로 생성합니까(고려하여)설정값비트) 사용자가 예상 그룹의 일부이고 교체하려는 적절한 사용자의 비밀번호를 알고 있다고 가정합니다(예:뿌리, 특히)?


너무 길어요. 권한 상승 동작은 다음 setuid사항에 의존합니까?바이너리입니까, 아니면 현재 프로세스의 UID를 변경하는 다른 메커니즘이 있습니까? 전자의 경우 EUID만 변경되어 UID != EUID가 남습니다. 이것이 문제입니까?

관련된 이 모든 것이 Android 환경에서 어떻게 시뮬레이션됩니까? 내가 아는 한, 프로세스는 여전히 이 권한 수준에서 실행되고 있지만 루트에 대한 액세스는 완전히 제거되었습니다.

을 제거하면 sudo권한 su상승을 방지하기에 충분합니까, 아니면 Android가 추가 조치를 취합니까?

답변1

루트는 사용자 0입니다.

키는 사용자 ID 0입니다. 커널에는 호출 프로세스의 사용자 ID를 확인하는 곳이 많이 있으며, 사용자 ID가 0인 경우에만 특정 작업을 수행할 수 있는 권한이 부여됩니다.

사용자 이름은 중요하지 않습니다. 커널은 사용자 이름조차 모릅니다.

Android의 권한 메커니즘은 커널 수준에서는 동일하지만 애플리케이션 수준에서는 완전히 다릅니다. Android에는 Linux 커널 기반의 다른 시스템과 마찬가지로 루트 사용자(UID 0)가 있습니다. Android에는 사용자 계정이 없으며 대부분의 설정에서 사용자(예: 장치를 운영하고 소유하는 사람)가 루트로 작업을 수행하는 것을 허용하지 않습니다. "루팅" Android는 기기 소유자/사용자가 루트로 작업을 수행할 수 있도록 하는 설정입니다.

setuid 작동 방식

설정값실행 파일은 실행 파일을 소유한 사용자로 실행됩니다. 예를 들어, susetuid이고 루트가 소유하므로 사용자가 이를 실행하면 실행 중인 프로세스가 su루트로 실행됩니다. 그 작업은 su이를 호출하는 사용자가 루트 계정에 대한 액세스 권한을 가지고 있는지 확인하고, 확인에 성공하면 지정된 명령(또는 명령이 지정되지 않은 경우 셸)을 실행하고, 확인에 실패하면 종료하는 것입니다. 예를 들어, su사용자는 루트 비밀번호를 알고 있음을 증명하라는 요청을 받을 수 있습니다.

좀 더 자세히 말하자면, 프로세스는사용자 ID 3개: 이것효과적인보안 검사에 사용되는 UID입니다.진짜UID는 일부 권한 확인에 사용되지만 주로 원래 사용자 ID의 백업으로 사용되며, 저장된 사용자 ID로 사용되어 프로세스가 일시적으로 유효 UID를 실제 사용자 ID로 전환한 다음 이전 유효 UID로 되돌릴 수 있습니다. UID(예를 들어 setuid 프로그램이 원래 사용자로 파일에 액세스해야 하는 경우 유용합니다.) setuid 실행 파일을 실행하면 유효 UID가 실행 파일 소유자로 설정되고 실제 UID가 유지됩니다.

setuid 실행 파일(및 setgid와 같은 유사한 메커니즘)을 실행하는 것은 프로세스의 권한을 높이는 유일한 방법입니다. 그 밖의 거의 모든 것은 프로세스의 권한을 감소시킵니다.

전통적인 유닉스를 넘어서

지금까지 나는 전통적인 Unix 시스템을 설명했습니다. 이 모든 것은 최신 Linux 시스템에 적용되지만 Linux는 몇 가지 추가적인 복잡성을 가져옵니다.

리눅스에는능력체계. 커널에는 사용자 ID 0에서 실행되는 프로세스만 허용되는 많은 검사가 있다고 말했던 것을 기억하십니까? 실제로 각 검사에는 고유한 기능이 있습니다. 정확히는 아니지만 일부 검사에서는 동일한 기능을 사용합니다. 예를 들어 원시 네트워크 소켓에 액세스하는 기능과 시스템을 재부팅하는 기능이 있습니다. 각 프로세스에는 해당 사용자 및 그룹과 관련된 일련의 기능이 있습니다. 프로세스가 사용자 0으로 실행되거나 검사에 해당하는 기능이 있으면 검사를 통과합니다. 특정 권한이 필요한 프로세스는 루트가 아닌 사용자로 실행될 수 있지만 필요한 기능이 있으므로 프로세스에 보안 취약성이 있는 경우 영향이 제한됩니다. 실행 파일은 하나 이상의 기능으로 설정될 수 있습니다. 이는 setuid와 유사하지만 프로세스의 사용자 ID가 아닌 프로세스의 기능 세트에 적용됩니다. 예를 들어 ping에는 원시 네트워크 소켓만 필요하므로 CAP_NET_RAWsetuid 루트 대신 setcap을 사용할 수 있습니다 .

리눅스에는 여러 가지보안 모듈, 가장 유명한 것은SELinux. 보안 모듈은 루트로 실행되는 프로세스에도 적용할 수 있는 추가 보안 검사를 도입합니다. 예를 들어 SELinux를 설정하는 것이 가능합니다(쉽지 않습니다!).사용자 ID 0으로 프로세스를 실행하지만 제한 사항이 너무 많아 실제로는 아무것도 할 수 없습니다..

리눅스는사용자 네임스페이스. 커널 내에서 사용자는 실제로 단순한 사용자 ID가 아니라 사용자 ID와 네임스페이스로 구성된 쌍입니다. 네임스페이스는 계층 구조를 형성합니다. 하위 네임스페이스는 상위 네임스페이스 내의 권한을 구체화합니다. 전체 사용자는 루트 네임스페이스의 사용자 0입니다. 네임스페이스의 사용자 0은 해당 네임스페이스 내에서만 권한을 갖습니다. 예를 들어 사용자 네임스페이스의 사용자 0은 해당 네임스페이스의 모든 사용자를 가장할 수 있지만 외부에서는 해당 네임스페이스의 모든 프로세스가 동일한 사용자로 실행됩니다.

답변2

Linux에는 4개의 UID가 있습니다.루이드(진짜),EU 사용자 ID(효과적인),수에이드(저장됨),FSUID(파일 시스템).

이는 프로세스의 속성인 숫자일 뿐이며 커널 프로세스 테이블의 제어 블록에 저장됩니다.

UID는 일반적으로 액세스가 제한되지 않는 '0'사용자를 나타낸다는 점에서 특별한 특성을 갖습니다 root.

susudo새로운 하위 프로세스를 시작하고 SetUID 비트를 통해 EUID를 새 UID로 설정하여 사용자의 유효 액세스 권한을 변경하는 프로그램 입니다 su. 그런 다음 이 su 프로세스는 새 하위 프로세스에서 새 쉘을 다시 생성하고 4개의 UID를 새 UID 값으로 설정합니다.

다음 예제에서는 이를 보여줍니다. 사용자가 rdaSSH 터미널을 통해 로그인한다고 가정합니다. ps fax다음 프로세스가 표시됩니다.

472 ?        Ss     0:00 /usr/sbin/sshd -D
9151 ?        Ss     0:00  \_ sshd: rda [priv]
9153 ?        S      0:00  |   \_ sshd: rda@pts/1
9154 pts/1    Ss+    0:00  |       \_ -bash

4개 프로세스, ssh 데몬, ssh 세션(및 터미널?)을 위한 2개 프로세스, 마지막 프로세스는 로그인 셸( -이전에는 a로 표시됨 bash) 입니다.

ps faw -eo euser,ruser,suser,fuser,f,comm프로세스의 UID가 표시됩니다.

EUSER    RUSER    SUSER    FUSER    F COMMAND
...
root     root     root     root     4 sshd
root     root     root     root     4  \_ sshd
rda      rda      rda      rda      5  |   \_ sshd
rda      rda      rda      rda      0  |       \_ bash

인증 성공 후 호출되면 su다음과 같은 결과가 발생합니다.

EUSER    RUSER    SUSER    FUSER    F COMMAND
...
root     root     root     root     4 sshd
root     root     root     root     4  \_ sshd
rda      rda      rda      rda      5  |   \_ sshd
rda      rda      rda      rda      0  |       \_ bash
root     rda      root     root     4  |           \_ su
root     root     root     root     4  |               \_ bash

'0''bash' 프로세스는 SetUID 비트에 의해 (루트) 로 설정된 EUID를 사용하여 새로운 'su' 하위 프로세스를 시작 하고 RUID는 여전히 rda의 UID로 설정됩니다. "su" 프로세스는 새 셸을 사용하여 새 하위 프로세스를 다시 시작하여 사용자에게 루트 액세스 권한을 부여합니다(RUID '0'도 이제 다음으로 설정됨). 사용자는 자신의 작업 디렉토리에 남아 있으며 새 셸은 상위 셸과 동일한 환경을 사용합니다. 예를 들면 다음과 같습니다.

server:/home/rda# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
server:/home/rda# pwd
/home/rda

을 사용하여 셸을 닫을 수 exit있으며 사용자는 원래 액세스 권한을 가진 상위 셸로 들어갑니다.

"su"가 하이픈 인수와 함께 호출되면 상황이 달라집니다 '-'.

rda@server:~$ su -
Password:
server:~# echo $PATH
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
server:~# pwd
/root

새 쉘은 로그인 쉘이기 때문에 쉘 환경이 변경되었습니다. 참조 '-su': 몇 가지 추가 구성 스크립트를 실행합니다.

 9151 ?        Ss     0:00  \_ sshd: rda [priv]
 9153 ?        S      0:00  |   \_ sshd: rda@pts/1
 9154 pts/1    Ss     0:00  |       \_ -bash
 9613 pts/1    S      0:00  |           \_ su -
 9614 pts/1    S+     0:00  |               \_ -su

로그인 쉘은 off 로 사용해야 합니다 logout.

이론적으로는 사용자가 터미널, SSH 등을 통해 시스템에 직접 로그인하고 장치에 물리적으로 액세스하지 못하도록 하여 sudo사용자가 높은 권한을 얻는 것을 방지 할 수 있다고 생각합니다 .su

고쳐 쓰다:Android의 루트 프로세스

자세히 설명했듯이여기, Android 기기를 루팅할 수 있는 방법은 다음에 따라 다릅니다.부트 로더그리고안드로이드 시스템 속성 ro.secure.

목표는 항상 동일합니다. 즉, su바이너리를 설치 /system하고 setuid(0).

잠금 해제된 부트로더가 있는 기기:

dd장치에서 기본 ROM을 추출하고, 추가하고 su, 다시 압축하고(또는 수정된 ROM을 다운로드하고), 플래시 모드에서 장치를 재부팅하고 수정된 ROM을 플래시합니다.

ro.secure=0인 장치:

이 시스템 속성은 입력한 명령이 루트( ) 또는 권한 없는 사용자( ) adb shell로 실행되는지 여부를 제어합니다 . 값은 부팅 시 루트 사용자만 액세스할 수 있으므로 안전한 디렉터리 의 파일 에서 설정됩니다.ro.secure=0ro.secure=1ro.securedefault.proproot

대부분의 경우 ro.secure로 설정되어 있지만 1일부 제조업체에서는 로 설정합니다 0. 기기의 터미널 에뮬레이터 또는 adb 셸에서 명령을 실행 하여 getprop ro.secure이를 확인할 수 있습니다. 루트 로 설정하면 0쉽습니다. 컴퓨터에 연결하고, 실행하고 , 읽기-쓰기로 adb마운트하고 , 설치합니다 ./systemsu

부트로더가 잠긴 기기:

이러한 장치의 복구 기능에서는 제조업체가 서명하지 않은 맞춤형 ROM 플래싱을 허용하지 않습니다. 이 상황에서 루트 액세스 권한을 얻는 유일한 방법은 실행 중인 시스템 프로세스 중 하나(권한 모드에서 실행 중)의 보안 취약점을 악용하고 이를 공격하여 "임의 코드" 실행을 허용하는 것입니다. 이 코드는 일반적으로 영구적으로 마운트 /system및 설치됩니다 su.

답변3

일반적으로 말하면 유효 uid만 0입니다. 실행 파일의 "setuid" 비트가 실제로 설정되었습니다.효과적인프로세스의 UID입니다. 유효 uid가 0이 아니고 실제 uid가 0이 아니면 프로그램은 "권한이 없는" 사용자로 실행되고 있는 것입니다. 다음이 적용됩니다:

권한이 없는 프로세스는 유효 사용자 ID를 실제 사용자 ID, 유효 사용자 ID 또는 저장된 세트 사용자 ID로만 설정할 수 있습니다. 권한이 없는 사용자는 실제 사용자 ID를 실제 사용자 ID 또는 유효한 사용자 ID로만 설정할 수 있습니다.

Android에 관한 한, 아니요, 제거 sudo하면 su충분하다고 생각합니다. 어떤 프로그램이 seteuid 비트를 설정할 수 있다면 해당 프로그램은 아마도 uid=0으로 실행될 것입니다. 내부 파일 시스템은 언제든지 루트로 사용할 수 있으며, 그런 다음 이러한 프로그램을 도입하고 루트 액세스가 가능합니다.

관련 정보