다른 사람들이 당신의 요점을 놓친 것 같습니다. 왜냐하면 변경 된 뿌리를 사용하는 이유, 물론 당신이 이미 이미 알고있는 것, 또는 당신이 aæides에서 달리는 것에 대해 명확하게 알고있을 때, 당신은 dæmons에 제한을두기 위해 할 수있는 다른 것이 아닙니다. 권한이없는 사용자 계정; 그러나 왜 응용 프로그램 내 에서이 작업을 수행해야합니까 ? 실제로 그 이유에 대한 예가 상당히 있습니다.
httpdDaniel 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/ straceC 또는 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, 등.)
추가 자료