이것을 읽는 동안 다음과 같은 익스플로잇을 발견했습니다.
% 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가 나타납니다. 다른 곳에서 어떤 일이 발생하는지 잘 모르겠습니다.
내 질문은 따라서 :
- 왜 (직접 실행) 리눅스 로더는 않습니다 하지 엘프 바이너리를 해석하기 전에 파일 시스템 속성을 확인?
- 파일이 너무나 사소한 경우 파일 실행을 금지하도록 설계된 메커니즘을 구현하는 이유는 무엇입니까? 내가 놓친 것이 있습니까?
libc
(아치 상자를 업그레이드 한 적이 있음)이 작은 기발한 점에 감사드립니다.