Linux 시스템에서 실행 플래그를 전복합니다. 왜 이것이 가능합니까?


23

이것을 읽는 동안 다음과 같은 익스플로잇을 발견했습니다.

% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)

이 스 니펫은 일반적인 권한이없는 사용자로서 파일 시스템의 실행 권한을 사소하게 회피 할 수 있음을 보여줍니다. 우분투 12.04에서 이것을 실행했습니다.

Linux 로더는 file (1)에 따른 공유 객체이지만 직접 실행할 수있는 진입 점도 있습니다. 이런 방식으로 실행되면 Linux 로더는 ELF 바이너리에 대한 인터프리터 역할을합니다.

그러나 내 OpenBSD 컴퓨터에서는 로더를 프로그램으로 실행할 수 없기 때문에이 악용은 효과적이지 않습니다. OpenBSD 매뉴얼 페이지는 "ld.so 자체가 커널에 의해 처음로드 된 공유 객체입니다"라고 말합니다.

Solaris 9에서 이것을 시도하면 segfault가 나타납니다. 다른 곳에서 어떤 일이 발생하는지 잘 모르겠습니다.

내 질문은 따라서 :

  • 왜 (직접 실행) 리눅스 로더는 않습니다 하지 엘프 바이너리를 해석하기 전에 파일 시스템 속성을 확인?
  • 파일이 너무나 사소한 경우 파일 실행을 금지하도록 설계된 메커니즘을 구현하는 이유는 무엇입니까? 내가 놓친 것이 있습니까?

1
정당한 이유는 없지만 시스템을 삭제 한 적이 있다면 libc(아치 상자를 업그레이드 한 적이 있음)이 작은 기발한 점에 감사드립니다.
새로운 123456

1
@ new123456 맙소사, 그 업그레이드 후 IRC 채널은 고통 스러웠습니다.
Rob

그것은이다 로더 가 아닌 링커.
Monica Harming 중지

답변:


33

execute권한 의 목적은 일반적으로 실행을 막는 것이 아닙니다 . (1) 프로그램에게 어떤 파일이 실행되어야하는지 알려주고 (2) setuid 비트 등이 지정된 경우 권한있는 사용자로 실행하지 못하도록 하는 것 입니다.

링커 핵은 생각보다 악용이 적습니다. 더 쉽게 읽을 수있는 권한이있는 실행 파일이 아닌 파일을 실행할 수 있습니다.

$ cp unexecutable_file ~/runme
$ chmod +x ~/runme
$ ~/runme

Arch Linux 포럼에서이 토론을 참조하십시오 .

요약해서 말하자면:

실행해야 할 파일 표시

쉘 스크립트를 작성할 때로 실행 가능으로 표시 할 수 있습니다 chmod +x. 이것은 쉘이 실행 가능하도록 의도한다는 것을 암시합니다 (그렇지 않으면 모든 쉘이 알고있는 다른 평범한 텍스트 파일입니다). 그런 다음을 입력하면 쉘이 탭 완성에이를 표시 할 수 있습니다 ./Tab.

마찬가지로 something.d디렉토리 (예 init.d:)에는 일반적으로 데몬에 의해 자동으로 실행되는 시작 또는 제어 쉘 스크립트가 포함됩니다. 디렉토리에 주석 또는 README 파일을 일반 텍스트 파일로 넣을 수 있습니다. 또는 스크립트 중 하나를 일시적으로 비활성화 할 수 있습니다. 해당 특정 파일의 실행 비트를 지우면됩니다. 데몬이 건너 뛰도록 지시합니다.

권한있는 실행 방지

setuid비트 수단이 파일을 실행할 때, 그것은 특정 사용자 (예 : root)로 실행됩니다.

포럼 게시물에 잘 설명되어 있습니다.

일부 사용자에 대해 실행 파일을 setuid로 만들고 싶지만 특정 그룹의 사용자 만 setuid로 실행할 수 있기를 원합니다. 여전히 복사하여 실행할 수 있지만 setuid 플래그가 손실되므로 원본 파일을 소유 한 사용자가 아니라 자체적으로 실행됩니다.


2
감사합니다-사용자가 읽을 수있는 모든 파일을 복사하여 임의의 권한을 선택할 수 있다는 사실을 간과했습니다.
Edd Barrett

실행 권한은 있지만 읽기 권한이없는 파일은 어떻습니까?
Lie Ryan

@LieRyan 그들 어때요?
복원 Monica Monica

@BrendanLong : 당신은 분명히 그것들을 복사 할 수 없으므로 권한을 변경할 수 없습니다. (그러나 당신이 원하는 이유는 말할 수 없습니다-어쨌든 사본으로 할 수있는 유일한 것은 실행 권한을 삭제하는 것입니다)
MSalters

9

파일에 대한 읽기 액세스 권한이 있으면 언제든지 파일을 복사 할 수 있습니다.

개인 복사본을 만들 수 있으면 언제든지 해당 복사본을 실행 가능으로 표시 할 수 있습니다.

이것은 ld-linux의 bahaviour를 설명하지는 않지만 매우 유용한 보안 허점이 아닐 수도 있음을 나타냅니다.

더 엄격한 보안을 원한다면 SELinux를 고려하십시오


이것은 매우 사실입니다.
Edd Barrett

그것은 단지 개념적 질문이었습니다. 파일 시스템에서도 nonexec를 설정할 수 있다고 가정합니다.
Edd Barrett

2

질문을 조금 다르게 보면 Mechanical Snail이 말했듯이 파일에 대한 실행 권한은 실행을 막기위한 것이 아닙니다. 그러나 파일 시스템 옵션 "noexec"는 실행을 막아서 쉽게 우회되지는 않습니다 (모든 파일 시스템에서 지원되는 것은 아니지만 가장 널리 사용되는 Linux 시스템에서는 지원되지 않음). 관리자가 사용자가 자신의 프로그램을 실행하지 못하도록하려면 home 및 tmp 디렉토리 및 사용자가 파일을 작성할 수있는 다른 디렉토리에서 noexec 옵션을 지정할 수 있습니다.

$ mount -o noexec /dev/sdd1 /test
$ cd /test
$ cp /usr/bin/id .
$ ./id
-bash: ./id: Permission denied

분명히 질문에 언급 된 로더 트릭을 사용하여 noexec 옵션을 우회 할 수 있었지만 커널에서 몇 가지 버전으로 수정되었습니다.

에서 http://linux.die.net/man/8/mount :

noexec

마운트 된 파일 시스템에서 바이너리를 직접 실행하지 마십시오. (최근까지는 /lib/ld*.so / mnt / binary와 같은 명령을 사용하여 바이너리를 실행할 수있었습니다.이 기법은 Linux 2.4.25 / 2.6.0부터 실패합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.