샌드박스 처리된 API 설명

Sandboxed API (SAPI)는 잘 구축된 Sandbox2 프로젝트를 기반으로 합니다. 이 페이지에서는 SAPI의 설계 아키텍처와 주요 개념을 설명합니다.

개요

SAPI는 개발자에게 샌드박스용 C/C++ 라이브러리 준비 도구뿐만 아니라 샌드박스 처리된 C/C++ 라이브러리 버전과의 통신에 필요한 API도 제공하도록 설계되었습니다.

다음 다이어그램은 SAPI 샌드박스 처리된 C/C++ 라이브러리의 아키텍처를 보여줍니다.

SAPI 다이어그램

또한 SAPI는 SAPI 라이브러리와 호스트 코드 간의 수동 및 자동 (맞춤 포인터 속성 기반) 메모리 동기화 (배열, 구조)를 위한 프리미티브를 제공합니다.

마지막으로 상위 수준의 트랜잭션 API는 SAPI 라이브러리 모니터링을 사용 설정하고 보안 위반, 비정상 종료 또는 리소스 소진 등으로 인해 실패할 경우 SAPI 라이브러리를 다시 시작합니다.

Sandbox2

오픈소스 프로젝트 Sandbox2는 Google 보안 엔지니어가 개발하고 유지 관리하며 SAPI에서 사용하는 핵심 샌드박스 기술입니다. Sandbox2에는 샌드박스 정책, Executor, Sandboxee라는 세 가지 주요 구성요소가 포함되어 있습니다.

샌드박스 정책

샌드박스 정책은 샌드박스 처리된 라이브러리의 제한된 실행 환경을 정의합니다. 이는 어떤 syscall을 실행할 수 있는지를 명확히 하면 달성됩니다. SAPI는 Sandbox2와 동일한 메커니즘을 사용합니다. 샌드박스 정책을 설계하고 정의하는 방법은 Sandbox2의 샌드박스 정책 섹션시작하기 페이지를 참고하세요.

SAPI는 기본 정책을 사용합니다. 또는 sandbox.h 헤더 파일에 정의하고 이를 sapi_library 빌드 규칙에 인수로 전달하여 전용 샌드박스 정책을 사용할 수 있습니다.

샌드박스화된 라이브러리

Sandbox2에서 제공하는 제한된 샌드박스 환경에서 실행될 샌드박스 처리된 C/C++ 라이브러리입니다. 궁극적으로 샌드박스 라이브러리는 호스트 코드에서 사용할 수 있는 필수 기능을 노출합니다.

샌드박스 라이브러리는 제한된 실행 환경을 정의하는 맞춤설정된 샌드박스 정책을 지정할 수 있는 sapi_library 빌드 규칙으로 빌드됩니다. 라이브러리에 따라 래퍼 또는 스텁 코드 (libcurl 참고)를 작성해야 할 수 있지만 SAPI 버전을 준비하는 동안에는 C/C++ 라이브러리의 소스 코드를 변경하지 않아도 됩니다.

SAPI 객체 및 RPC 스텁

SAPI 객체는 샌드박스 라이브러리의 API를 노출하는 C++ 객체입니다. SAPI 라이브러리에 샌드박스화된 라이브러리와 함께 삽입된 RPC 스텁으로 호출을 전달합니다.

이 두 요소는 sapi_library() 빌드 규칙을 사용하여 빌드 시스템에서 자동으로 생성됩니다. SAPI는 Google의 BazelCMake라는 두 가지 빌드 시스템을 지원합니다.

호스트 코드

호스트 코드는 SAPI 라이브러리에서 제공하는 로직을 구현합니다. 이렇게 하지 않았다면 샌드박스 처리되지 않은 C/C++ 라이브러리 버전을 사용합니다. 따라서 호스트 코드는 SAPI 라이브러리에서 내보낸 함수를 호출하여 샌드박스에 데이터를 전달하고 샌드박스에서 데이터를 수신합니다.

SAPI 라이브러리를 사용하도록 호스트 코드를 조정해야 합니다. 특히 라이브러리가 별도의 샌드박스 프로세스에 상주하므로 라이브러리의 함수를 호출할 수 없습니다. 따라서 SAPI는 SAPI 라이브러리 호출을 프록시하는 SAPI 객체를 만드는 도구를 제공합니다.

개념

Bazel 빌드 규칙

SAPI 프로젝트는 C/C++ 라이브러리를 샌드박싱하기 위한 두 가지 Bazel 빌드 규칙을 제공합니다.

  • sapi_library(): C/C++ 라이브러리가 Sandbox2 Sandboxee로 샌드박스화되는 데 필요한 모든 출력을 만듭니다. 빌드 출력은 호스트 코드 바이너리를 빌드하는 데 사용되는 cc_binary() 규칙의 종속 항목으로 사용할 수 있습니다.
  • sapi_interface() – 호스트 코드 바이너리에 포함될 수 있는 헤더를 자동으로 생성합니다.

빌드 규칙에 관한 더 자세한 설명은 빌드 규칙을 참고하세요.

변수

SAPI는 SAPI 유형이라는 여러 특수 유형을 제공하며, 호스트 코드에서 이러한 유형을 사용하는 것이 좋습니다. SAPI 유형이 필요한 주된 이유는 호스트 코드와 샌드박스 라이브러리 간의 프로세스, 즉 메모리 격리 때문입니다.

이 주제에 대한 자세한 설명과 일반적으로 사용되는 몇 가지 SAPI 유형에 대한 개요는 변수를 참조하세요.

거래

위에서 설명한 것처럼 샌드박스 처리된 라이브러리에 대한 모든 API 호출은 RPC 레이어를 통해 전달됩니다. 이 레이어의 장애를 처리하려면 적절한 오류 처리를 구현해야 합니다. SAPI 트랜잭션 모듈은 샌드박스 처리된 라이브러리에 대한 모든 호출이 RPC 수준 문제 없이 완료되거나 관련 오류와 함께 반환되도록 하는 데 필요한 메커니즘을 제공합니다.

이 주제에 대한 자세한 설명은 트랜잭션을 참조하세요.

시작하기

시작하기 페이지에서 첫 번째 샌드박스 API 프로젝트를 설정해 보세요.