다른 사람들이 당신의 요점을 놓친 것 같습니다. 왜냐하면 변경 된 뿌리를 사용하는 이유, 물론 당신이 이미 이미 알고있는 것, 또는 당신이 aæides에서 달리는 것에 대해 명확하게 알고있을 때, 당신은 dæmons에 제한을두기 위해 할 수있는 다른 것이 아닙니다. 권한이없는 사용자 계정; 그러나 왜 응용 프로그램 내 에서이 작업을 수행해야합니까 ? 실제로 그 이유에 대한 예가 상당히 있습니다.
httpd
Daniel J. Bernstein의 공개 파일 패키지에있는 dæmon 프로그램 의 디자인을 고려하십시오 . 가장 먼저하는 일은 루트를 명령 인수와 함께 사용하도록 지시 된 루트 디렉토리로 변경 한 다음 두 환경 변수에 전달 된 권한이없는 사용자 ID 및 그룹 ID에 대한 권한을 삭제하는 것입니다.
Dæmon 관리 도구 세트에는 루트 디렉토리 변경 및 권한이없는 사용자 및 그룹 ID 로의 드롭과 같은 전용 도구가 있습니다. Gerrit Pape의 runit은 chpst
. 내 nosh 툴셋에는 chroot
및이 setuidgid-fromenv
있습니다. Laurent Bercot의 s6에는 s6-chroot
및이 s6-setuidgid
있습니다. 웨인 마샬의 Perp는 runtool
및 runuid
. 기타 등등. 실제로, 그들은 모두 setuidgid
선행사로서 M. 번스타인의 데몬 툴 툴셋을 가지고 있습니다.
httpd
그러한 전용 툴 에서 기능을 추출하여 사용할 수 있다고 생각할 것입니다 . 그런 다음 구상 할 때 서버 프로그램의 어떤 부분도 수퍼 유저 권한으로 실행 되지 않습니다 .
문제는 직접적인 결과로서 변경된 루트를 설정하기 위해 훨씬 더 많은 작업을 수행해야하며, 이는 새로운 문제를 노출 시킨다는 것입니다.
Bernstein 이있는 상태에서 루트 디렉토리 트리에 httpd
있는 유일한 파일과 디렉토리는 세계에 공개 될 것입니다. 나무 에는 전혀 아무것도 없습니다 . 또한, 대한 이유가 없다 어떤 실행 프로그램 이미지 파일이 그 나무에 존재하는.
그러나 체인 로딩 프로그램 (또는 systemd)로 루트 디렉토리 변경을 이동에 갑자기 프로그램 이미지 파일 httpd
, 어떤 공유 라이브러리 그것은 그 부하 및 특수 파일 /etc
, /run
및 /dev
프로그램 로더 또는 C 라이브러리 액세스 런타임 것을 프로그램을 초기화하는 동안 (당신이 truss
/ strace
C 또는 C ++ 프로그램 이라면 상당히 놀랄 수도 있습니다 ), 변경된 루트에 있어야합니다. 그렇지 않으면 httpd
연결할 수 없으며로드 / 실행되지 않습니다.
이 서버는 HTTP (S) 컨텐츠 서버입니다. 변경된 루트에서 (세계가 읽을 수있는) 파일을 제공 할 수 있습니다. 여기에는 공유 라이브러리, 프로그램 로더 및 운영 체제에 대한 다양한 로더 / CRTL 구성 파일 사본이 포함됩니다. 그리고 일부 (우연한) 컨텐츠 서버가 쓰기 작업에 액세스 할 수있는 경우 손상된 서버가 httpd
자체적으로 또는 시스템의 프로그램 로더에 대한 프로그램 이미지에 대한 쓰기 액세스 권한을 얻을 수 있습니다 . (지금의 두 개의 평행 한 세트가 기억 /usr
, /lib
, /etc
, /run
, 및 /dev
디렉토리 보안을 유지하기를.)
httpd
루트를 변경하고 권한 자체를 삭제 하는 경우는 없습니다.
따라서 감사하기 쉽고 httpd
프로그램 시작시 바로 실행되는 수퍼 유저 권한으로 실행되는 소량의 권한있는 코드를 거래했습니다 . 변경된 루트 내에서 파일 및 디렉토리의 공격 영역이 크게 확장되었습니다.
이것이 서비스 프로그램 외부에서 모든 것을 수행하는 것만 큼 간단하지 않은 이유입니다.
그럼에도 불구하고 이것은 httpd
그 자체의 최소한의 기능 입니다. 예를 들면 처음에 그 환경 변수에 넣어 사용자 ID 및 그룹 ID에 대한 운영 체제의 계정 데이터베이스의 모습으로 일을 수행하는 코드의 모든 입니다 받는 외부 httpd
와 같은 간단한 독립 감사 명령에 프로그램 envuidgid
. (이 코드의 어느 것도 관련 TCP 포트 (들) 또는 연결을 허용하는 방법에 듣지을 포함, 그래서 물론 그것은 UCSPI 도구입니다 같은 명령의 도메인 인 그 tcpserver
, tcp-socket-listen
, tcp-socket-accept
, s6-tcpserver4-socketbinder
, s6-tcpserver4d
, 등.)
추가 자료