리소스가 제한된 시스템에서 실행 중이고 실행 중인 애플리케이션에 10개 이상의 파일이 열려 있지 않은지 확인하고 싶다고 가정해 보겠습니다.모두.
예를 들어 를 사용하여 이 작업을 수행하려고 하면 setrlimit
다음과 같습니다.
if (fork() == 0) {
struct rlimit l = { 10, 10 };
setrlimit(RLIMIT_NOFILE, &l);
execl(EVIL_PROGRAM, args);
}
그러면 EVIL_PROGRAM
10개의 열린 파일 설명자 제한이 상속됩니다. 그러나 악성/잘못 코딩된 응용 프로그램이 X 하위 프로세스(모두 10개의 파일이 열려 있음)를 생성하는 것을 중지하는 방법은 무엇입니까? (이것은 실제 시나리오입니다).
limits.conf
나는 열린 파일 수에 대한 합리적인 제한을 설정하기 위해 자식 프로세스가 생성되는 것을 완전히 방지하고 싶지 않습니다(이는 global 로 관리되어야 함 ).
이 목적으로 cgroup을 사용하는 방법에 대한 참조를 찾았지만 이 기능을 사용하려면 루트 사용자여야 한다고 생각했습니다.
답변1
특히setrlimit
다음은 탐색하고 싶은 몇 가지 유용한 명령 옵션입니다 man
.
RLIMIT_NOFILE
프로세스가 열 수 있는 최대 파일 설명자 수보다 1 큰 값을 지정하십시오.
RLIMIT_NPROC
호출 프로세스의 실제 사용자 ID에 대해 생성할 수 있는 최대 프로세스 수(더 정확하게는 Linux에서는 스레드)입니다. 이 제한 사항에 직면했을 때
RLIMIT_SIGPENDING
호출 프로세스의 실제 사용자 ID에 대해 대기할 수 있는 신호 수에 대한 제한을 지정합니다. 이 제한을 확인하기 위해 표준 신호와 실시간 신호가 모두 계산됩니다.
설정할 수 있는 다른 정말 멋진 제한이 있는 것 같습니다. 따라서 흐름을 제어하기 위한 또 다른 도구를 보여 주는 귀하의 질문을 접하게 되어 감사드립니다.
일반 유닉스/리눅스
귀하가 찾고 있는 응용 프로그램 제한 도구의 일반적인 용어는 " Sandbox
for UNIX" 라고 생각합니다.계약자그리고승객Raspberry Pi B+v2 또는 듀얼 코어 넷북과 같은 제한된 시스템에서 Docker
보고 KVM
사용해 본 Linux를 위한 확실한 선택입니다 . Firejail
대부분의 샌드박스 작업에는 가상화 가능 시스템과 커널이 필요합니다. 최신 CyonagenMod ROM에서 작동하는 것을 본 Android와 같은 시스템에서 Selinux
chroot 앱을 사용하고 싶다면 약간 실망스러울 것입니다. 하지만 Ubuntu를 실행한 일부 시스템에서는 오류가 발생합니다. Apparmor
새로 설치된 프로그램을 실행 하려고 하면 작동이 멈춥니다.집에 전화 해지속적인 연결을 유지하세요. 특정 프로그램이나 프로그램 그룹이 수행할 수 있는 작업, 보거나 통신할 수 있는 작업, 사용할 수 있는 CPU 및 GPU 리소스의 양을 제어하는 많은 옵션이 있다고만 말하면 충분합니다.
작동하게 할 수 있다면(ARMhf 바이너리가 작동하도록 개발자와 계속 협력하고 있기 때문에 약간 확신할 수 없음) 개발자 홈페이지에 호스팅된 가이드에서 Firejail을 다룰 수 있으므로 사용 사례에 가장 적합한 것은 Firejail이 될 것입니다. 듀얼 게임 장치에 대한 요구 사항에 맞게. 언급된 다른 것보다 메모리 사용량이 적으며(내가 본 것에서) 프로세스가 액세스할 수 있는 파일과 지속성이 허용되는지 여부를 고도로 구성할 수 있습니다. 반복 가능하고, 사용자 정의가 가능하며, 필요에 따라 궁극적으로 삭제할 수 있는 작업 환경이 제공되므로 테스트에 적합합니다.
전체 가상화를 지원하지 않는 시스템의 경우 selinux는 읽기 및 쓰기 권한을 유지하기 위해 기존 user
/ 권한 설정에 대한 group
더 엄격한 규칙을 정의하는 데 자주 사용됩니다. 이 단어를 검색해 Linux name space permissions
보니 많이 나오더라구요숨겨진사람들은 움직이는 방식을 제한할 수 있지만 가장 큰 것은구멍이러한 모든 옵션과 마찬가지로 root
잘 구성된 chroot 감옥에서도 감옥이나 샌드박스 내에서 루트 권한을 얻을 수 있는 방법이 있다면 감옥에 있는 프로세스가 실행 중인 사용자 ID로 에스컬레이션하는 방법이 있습니다.
기본적으로 프로세스는 여러 계층을 통과해야 합니다. 즉, 웹 서버의 경우 제한적인 방화벽 규칙 세트, 규칙을 동적으로 추가하고 방화벽 설정을 변경하는 로그 리더(사용자 정의 작업 및 스크립트가 포함된 Fail2ban), chroot를 설정합니다. 디렉터리 구조에서 웹 서버에 필요한 종속성만 포함하여 감옥에 넣고, 소켓 바인딩에 대한 루트 수준 권한을 요청하지도 않도록 1024보다 높은 포트에 바인딩하고, 가상 샌드박스(아마도 Firejail)에 래핑합니다. , 호스트는 해당 감옥 tripwire
과 같은 침투 탐지 조치를 실행합니다. honeyd
이 모든 것은 .php
공개 서버에서 수정되어서는 안 되는 유사한 코드가 수신을 받도록 하기 위한 것입니다.접촉불량이는 무시되고 백업 IP가 재할당되며 위반자는 향후 액세스가 금지됩니다.
예제 코드에서는 네트워킹에 많은 작업을 수행하는 것처럼 보이지 않지만 다른 스크립트나 함수에서 호출할 가능성이 높으며 분명히 하위 프로세스를 호출하므로 어떻게 해야 하는지 알아내야 합니다. 입력을 삭제하고 모든 단계에서 오류를 포착하고(이유를 알아보려면 Kill Chrome 링크를 찾으세요), 권한 있는 사용자가 삭제되지 않은 입력을 읽거나 방해할 수 없도록 보장합니다( shell-shock
Firefox에 브라우저 ID를 추가하는 방법을 찾아보세요). 이유를 알아보세요)), 호출 또는 반환 출력이 네트워크와 관련된 경우 프로세스가 바인딩된 포트는 권한이 없는 포트에 있어야 합니다(웹 애플리케이션인 경우 전달을 위해 iptables/방화벽을 사용합니다). 고려해야 할 시스템 서비스 잠금 옵션은 많지만, 코드의 파괴 가능성을 테스트하는 옵션도 많이 있는 것 같습니다. Metasploit
이는 drone.io
이전에 수행하고 싶을 수도 있는 꽤 잘 알려진 두 가지 침투 테스트 및 코드 테스트 옵션입니다. 누군가가 당신을 위해 그것을 해준다. 조사를 좀 해라.