완료할 수 없는 프로세스를 시작하는 방법어느미리 생성된 FIFO를 읽고 쓰는 것 이외의 파일 IO(파일 열기/닫기, 파일 생성/삭제, 파일 읽기/쓰기 등)?
( chroot
프로세스가 중단될 수 있으므로 작동하지 않지만 커널 등을 조작/수정하는 것은 괜찮습니다)
그런데: 실행 중인 프로그램을 수정할 수 없습니다.
답변1
만약에
- 신뢰할 수 없는 코드 이전에 원하는 시스템 호출을 수행하도록 프로그램을 수정할 수 있습니다(이 작업은 다음을 통해 수행할 수 있습니다).LD_예압), 그리고
exit()
sigreturn()
프로그램은 , 이외의 시스템 호출을 수행할 필요가 없습니다.read()
write()
그럼 당신은 사용할 수 있습니다보안 컴퓨팅(위키피디아 기사). 더 많은 시스템 호출을 허용하기 위해 seccomp-bpf가 있습니다.버클리 패킷 필터허용되는 시스템 호출을 결정합니다. 이것libseccomp라이브러리는 seccomp-bpf를 단순화하므로 (예를 들어) 시스템 호출을 허용하려는 경우 close()
:
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);
또는 비슷하지만 깨질 수 없는 경우 chroot
시도해 볼 수 있습니다.Linux 컨테이너,오픈VZ또는리눅스 가상 서버.
답변2
가장 좋은 방법은 권한이 없는 사용자로 문제를 실행하는 것입니다. FIFO에 올바른 권한을 부여합니다.
즉, 권한이 없는 사용자는 권한이 없는 다른 사용자가 소유하는 모든 파일에 액세스할 수 있습니다.
더 많은 작업을 수행하려면 파일 시스템의 항목을 심각하게 수정해야 합니다. 하지만:
chmod o-rwx/-R
확실히 물건을 잠급니다. 하지만 다른 사용자도 아무것도 읽을 수 없습니다.
제가 스스로에게 묻고 싶은 더 중요한 질문은 "왜 이 제한이 필요한가요?"입니다. 어쩌면 목표를 달성하는 더 좋은 방법이 있을까요?
답변3
올바르게 수행된 경우, 즉 자체 사용자 ID로 프로세스를 실행함으로써(즉, chroot 외부의 프로세스가 동일한 사용자로 실행되어서는 안 됨) 프로세스는 chroot를 떠날 수 없습니다.
프로세스가 쓸 수 없고 FIFO만 포함하는 디렉터리로 프로세스를 루트로 이동합니다. 실행 파일과 필요한 라이브러리 및 데이터 파일을 해당 chroot에 넣거나 루트로 프로세스를 시작한 다음 chroot를 시작한 다음 사용자 ID를 변경해야 합니다.
루트를 포함할 수 없는 경우 다음을 사용할 수 있습니다.네임스페이스, 그러나 최신 커널(≥3.8)이 필요합니다. 먼저사용자 네임스페이스, 그런 다음 chroot하고 필요한 권한 없이 네임스페이스 내의 사용자 ID로 변경합니다.
또는 SELinux 또는 AppArmor와 같은 보안 프레임워크를 통해 루트로 작업할 수 있습니다. , , 및 를 제외한 모든 파일 시스템 관련 시스템 호출을 비활성화하고 open
FIFO 가 포함된 디렉터리 로 read
제한합니다 . 그것도 비활성화 하십시오 .write
close
lseek
open
ptrace