chgrp가 "setuid 비트"를 지우는 것을 방지하는 방법은 무엇입니까?

chgrp가 "setuid 비트"를 지우는 것을 방지하는 방법은 무엇입니까?

우리는 RH 기반 Linux 이미지를 가지고 있습니다. 이를 우리 제품의 최신 개발 버전으로 업그레이드하려면 일부 "특수 아카이브"를 "적용"해야 합니다.

아카이브를 만든 사람은 기본 이미지의 일부 권한이 잘못되었다고 생각하여 실행하라는 지시를 받았습니다.

sudo chgrp -R nobody /whatever

나중에 애플리케이션을 실행했을 때 몇 가지 이해할 수 없는 문제가 발생했습니다.

나중에 알았어: 전화chgrp~ 할 것이다분명한/whatever의 바이너리 파일에 대한 Setuid 비트 정보입니다.

실제 문제는 다음과 같습니다. 일부 바이너리~ 해야 하다올바른 작동을 위해 setuid 비트를 설정하십시오.

간단히 말해서: "chgrp" 명령을 실행할 수 있는 방법이 있습니까?아니요내 setuid 비트를 죽여볼까?

방금 로컬 Ubuntu에서 다음 명령을 실행하여 동일한 결과를 얻었습니다.

mkdir sticky
cd sticky/
touch blub
chmod 4755 blub 
ls -al blub 

--> 빨간색 배경으로 파일 이름 표시 --> 예, setuid입니다.

chgrp -R myuser .
ls -al blub 

--> 빨간색 배경 없이 파일 이름 표시 --> setuid가 사라짐

답변1

chgrp -R nobody /whateversetuid 비트를 유지하면서 이를 달성 하려면 다음 두 find명령을 사용할 수 있습니다.

find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
                                      -exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +

find ... -perm 04000옵션은 setuid 비트가 설정된 파일을 선택합니다. 그런 다음 첫 번째 명령은 a를 적용한 chgrp다음 a를 적용하여 chmod취소된 setuid 비트를 복원합니다. 두 번째는 chgrpsetuid 비트가 없는 모든 파일에 적용됩니다.

chgrp어떤 상황에서도 호출 하거나 심볼릭 링크를 사용 하고 싶지 않습니다. chmod이는 대상에 영향을 미치므로 ! -type l.

답변2

에서 SUID 및 SGID 비트를 지우는 chgrp(또는 ) 것이 완벽합니다. chown이는 보안 문제를 방지하기 위한 보안 조치입니다. 실행 파일에 있는 SGID의 경우유효한 그룹 소유자 그룹으로 이 프로그램을 실행하세요..

그룹 소유자를 변경하면 보안 및 액세스 제어 측면에서 완전히 달라집니다. 즉, uvw이제 프로그램은 유효 그룹 대신 유효 그룹으로 실행됩니다 xyz.

따라서 소유권이 변경되면 SUID 또는 SGID 비트를 명시적으로 복원해야 합니다.

부록: chgrp(또는 chown)가 SGID(또는 SUID)만 지워야 한다는 주장

chowning 또는 ing을 사용하면 chgrp실행 파일의 보안 설정을 변경할 수 있으며 이는 모든 권한 에스컬레이션 속성을 지우는 데 충분합니다. 유닉스의 힘은 개념의 단순성에서 나오는데, 유닉스의 보안은 이미 상당히 까다롭다. 이러한 이유로 소유권 변경 시 SUID 및 SGID를 제거하는 것은 단지 안전망일 뿐입니다. 결국 Unix/Linux 역사상 잘못된 SUID 또는 SGID 설정으로 인해 취약점이 꽤 많이 있었습니다.

그러므로 유닉스가 지금처럼 행동하는 더 깊은 이유는 없습니다. 그것은 단지 보수적인 디자인 결정일 뿐입니다.

답변3

setuid비디렉토리 비트 지우기(적어도 Linux에서는)는 커널 자체가 아닌 시스템 호출을 완료할 때 커널에 의해 수행 setgid됩니다 . 따라서 유일한 방법은 나중에 회복하는 것입니다.chown()chgrpchgrp

또한 보안 기능도 삭제됩니다.

따라서 GNU Linux에서는:

chown_preserve_sec() (
  newowner=${1?}; shift
  for file do
    perms=$(stat -Lc %a -- "$file") || continue
    cap=$(getfattr -m '^security\.capability$' --dump -- "$file") || continue
    chown -- "$newowner" "$file" || continue
    [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr --restore=-
    chmod -- "$perms" "$file"
  done
)

그리고 다음을 실행합니다(예 root: ):

chown_preseve_sec :newgroup file1 file2...

권한을 유지하면서 그룹을 변경하세요.

재귀적으로 다음을 수행할 수 있습니다.

# save permissions (and ACLs). Remove the "# owner" and "# group" lines
# to prevent them being restored!
perms=$(getfacl -RPn . | grep -vE '^# (owner|group): ')
# save capabilities
cap=$(getfattr -Rhm '^security\.capability$' --dump .)

chgrp -RP nobody .

# restore permissions, ACLs and capabilities
printf '%s\n' "$perms" | setfacl --restore=-
[ -z  "$cap" ] || printf '%s\n' "$cap" | setfattr -h --restore=-

(이것은 동시에 파일을 손상시키는 다른 것이 없다고 가정합니다).

답변4

늘 그렇듯, 관리에 있어서 갈 수 있는 방법은 많습니다.

제가 생각해낸 해결책은 이렇습니다.

cd /home/me
getfacl -R /whatever > whatever-permissions.org 2> /dev/null

# A) change lines starting with      # group: root
# to                                 # group: whatineed
sed 's/^# group: root/# group: whatineed/g' whatever-permissions.org > whatever-permissions.new

# B) change lines with               group::x.y
# to                                 group::xwy
# (where x, y mean: whatever was there before)
sed 's/^group::\(.\).\(.\)/group::\1w\2/g' whatever-permissions.new > whatever-permissions.new

cd /
setfacl --restore /home/me/whatever-permissions.new

관련 정보