2010-07-17 2 views
3

dlopen과 친구들을 통해 동적으로 링크 된 라이브러리를 샌드 박싱 할 수 있는지 궁금합니다. 목표는 예를 들어 SEGFAULT 등 전체 애플리케이션을 해체하지 않고 라이브러리 내의 오류를 복구하는 것입니다.C++ Sandboxing 동적 라이브러리

누구든지이 분야에 경험이 있습니까?

답변

1

일반적으로 예외 처리는 고도로 운영 체제에 따라 다릅니다. 나는 몇 가지 가정을하고 몇 가지 일반적인 지침을 제공하려고합니다. 이것이 완전한 회신은 아니지만 시작하기위한 장소로 봉사해야한다는 것을 알아 주시기 바랍니다.

나는 그것을 가정합니다 :

대부분의 경우
  1. , 당신은 메모리 누수에 대한 보호에 관심이 있습니다.

  2. 당신은 dlopen을 언급 한 이후 (전체 다른 볼 오브 왁스) 윈도우에 관심이없는 (그렇지 않으면에서 LoadLibrary 말한 것)이 연결의 뉘앙스 알고

  3. C + + 기호. 당신이 mini howto on dlopen c++

에서 그것을 읽을하지 않는 경우 일반적으로 데이터를 제공하는 전문 운영 체제를 포함하지 않고 기술 문제에 대한 일반적인 해결책이 없습니다

을 말하고있다 코드 세그먼트 모래 복싱 신뢰할 수있는 시스템 및이를 수행 할 수있는 특수 운영 체제 커널이지만 좋은 오래된 nix 또는 Windows 환경에서이 작업을 수행한다고 가정합니다.

컴파일러 항목으로 인해 문제가 더 복잡해집니다. C++ 컴파일러는 약한 기호를 기본적으로 생성합니까 (일반적으로 발생합니까?) 이것은 try-catch에서 예외 처리가 수행되는 방식에 영향을줍니다. 신호를 발생

간단한 운영 체제 예외 처리 (SIGSEGV, SIGFPE 등) : POSIX 시스템에서

는 지원 은 sigaction ...

의 당신이 같은 일반적인 것들로부터 보호하고 싶은 말은하자 잘못된 메모리 주소 지정. 라이브러리를 dlopen (.init 함수로부터 보호하기) 전에 sigaction을 사용하여 SIGSEG를 트랩 한 다음 라이브러리 내의 함수를 호출하기 전에 신호 검사를 수행하십시오. SA_STACK을 사용하여 핸들러가 잘 제어 할 수있는 스택으로 점프하는지 확인하고, SA_SIGINFO를 사용하여 핸들러가 소스에 대한 정보를 얻는 지 확인하십시오.부드러운 예외을 잡기 위해 사용 래퍼와 시도 - 캐치와

시도 { foo는();

이에서 시작하는 좋은 장소 ++ C 아래에서 Signal handling on GNU libc manual

에있다 좀 더 구체적인 요구가있는 경우 } 캐치() { 는 뭔가 }

foo는 약한 심볼이 DLL에 함수를 가리키는입니다

see c++ dlopen mini-howto for a lot more examples and details on loading classes etc.

, 그들을 게시, 내가 볼 // 않습니다 내가 더 많은 정보를 제공 할 수 있다면.

건배

4

라이브러리를 호출하기 전에 fork()을 수 있습니다. 그런 다음 결과를 마더 프로세스에 전달하십시오. 어머니 프로세스가 자식으로부터 데이터를 기다리도록하거나, 충돌이 발생하면 오류를보고합니다.

+0

감사합니다. 그러나 나는이 방법을 고려해 보았습니다. 그러나 이것은 꽤 무거운 손으로 접근했고 좀 더 우아한 해결책을 기대했습니다. – Corvusoft

+2

라이브러리 코드를 링크하면 메모리가 함께 공유되므로 오류가 segfault 일뿐만 아니라 메모리를 가비지로 덮어 쓸 수도 있습니다. 이를 막으려면 프로세스 분리가 가장 좋은 방법입니다. – che

+0

포크는 완전히 새로운 컨텍스트를 생성하기 때문에 적절한 방법이 아닙니다. (본질적으로 동일하지만 여전히 복사본입니다) 좋아하는 라이브러리의 사용 횟수를 늘리는 것만 큼 간단합니다. " –

0

은 어떻게 당신의 응용 프로그램과 문제의 동적 라이브러리에서 세그먼트 폴트를 차별화 할 ? 설명 된대로 라이브러리를 차단하는 별도의 프로세스를 만드는 것이 가장 좋은 방법입니다.

편집 :

는 휴대 성을 원하는 경우 SIGSEGV 처리기에서 복귀하지 하자는 CERT advisory 가리키는 this 관련 질문을 발견했다.

+0

sigaction SA_SIGINFO를 사용하면 시그널이 보내지는 컨텍스트를 결정할 수 있습니다. 프로그램 적으로 백 트레이스를하면 실제로 시그널을 발생시킨 함수를 알아낼 수 있고, 그것이 라이브러리 내의 함수인지 여부를 판단 할 수 있습니다. 신호를 잡으면, 당신은 제대로 이력서를하실 수 있습니다. fork()를 수행하는 것은 라이브러리의 복원력을 결정하는 좋은 방법이 아닙니다 ... –

관련 문제