개요

Google Play에서는 다양한 시나리오에서 Sandbox2를 사용하는 방법과 정책을 작성하는 방법을 보여주는 몇 가지 예시를 준비했습니다.

//sandboxed_api/sandbox2/examples에서 확인할 수 있습니다. 자세한 설명은 아래를 참조하세요.

CRC4

CRC4 예는 의도적으로 CRC4 체크섬을 계산한 것으로, 다른 프로그램을 샌드박스에 배포하는 방법과 이 프로그램과 통신하는 방법을 보여줍니다.

  • crc4bin.cc: 샌드박스 처리할 프로그램 (예: Sandboxee)
  • crc4sandbox.cc: 실행할 샌드박스 프로그램 (실행자).

설문 조사 진행 방법:

  1. 실행자는 ::sandbox2::GetDataDependencyFilePath()를 사용하여 파일 경로에서 샌드박스를 시작합니다.
  2. 실행자는 SendBytes()를 사용하여 통신 채널 Comms를 통해 샌드박스 대상에게 입력을 전송합니다.
  3. 샌드박스는 CRC4를 계산하고 RecvUint32()를 사용하여 수신하는 통신 채널 Comms를 통해 실행자에 응답을 다시 전송합니다.

프로그램이 통신 (read()write()) 이외의 syscall을 실행하면 정책 위반으로 인해 종료됩니다.

정적

정적 예는 정적으로 연결된 바이너리(예: 소스가 없는 서드 파티 바이너리)를 샌드박스 처리하는 방법을 보여줍니다. 즉, 이 바이너리가 샌드박스 처리된다는 사실을 인식하지 못합니다.

  • static_bin.cc: Sandboxee는 ASCII 텍스트를 표준 입력에서 대문자로 변환하는 정적 C 바이너리입니다.
  • static_sandbox.cc: 정책, 제한, Sandboxee 입력을 위한 파일 설명자를 사용하는 실행자

설문 조사 진행 방법:

  1. 실행자는 CRC4와 마찬가지로 GetDataDependencyFilepath를 사용하여 파일 경로에서 Sandboxee를 시작합니다.
  2. 제한을 설정하고 /proc/version에서 파일 설명자를 열고 MapFd를 사용하여 Sandboxee에서 매핑되도록 표시합니다.
  3. 이 정책은 일부 syscall (open)이 정책 위반으로 인해 종료되지 않고 오류 (ENOENT)를 반환하도록 허용합니다. 이는 생성된 syscall을 수정할 수 없는 서드 파티 프로그램을 샌드박스 처리할 때 유용할 수 있으므로 적절하게 실패하도록 만들 수 있습니다.

도구

이 도구 예시는 자체 정책을 개발하고 Sandbox2 API를 실험하는 도구이며 기능을 시연합니다.

  • sandbox2tool.cc: 다음을 보여주는 실행자입니다.
    • 샌드박스 처리된 또 다른 바이너리를 실행하는 방법,
    • 파일 시스템 검사를 설정하는 방법
    • 실행자가 Sandboxee를 비동기식으로 실행하여 출력을 점진적으로 읽는 방법

직접 해 보세요.

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + 닌자

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

플래그:

  • --sandbox2tool_resolve_and_add_libraries: Sandboxee에 필요한 라이브러리를 확인하고 마운트합니다.
  • --sandbox2tool_additional_bind_mounts <PATHS>: Sandboxee에 추가 디렉터리를 사용할 수 있습니다.
  • --sandbox2tool_keep_env: 현재 환경 변수 유지
  • --sandbox2tool_redirect_fd1: Sandboxee STDOUT_FILENO (1)를 수신하고 로컬에서 출력합니다.
  • CPU 제한 시간(초) 설정: --sandbox2tool_cpu_timeout
  • --sandbox2tool_walltime_timeout: 실제 경과 시간 제한 시간(초) 설정
  • --sandbox2tool_file_size_creation_limit: 생성된 파일의 최대 크기 설정
  • --sandbox2tool_cwd: 샌드박스의 현재 작업 디렉터리를 설정합니다.

custom_fork

custom_fork 예시는 바이너리를 초기화한 다음 상위 실행자로부터 오는 fork() 요청을 기다리는 샌드박스를 만드는 방법을 보여줍니다.

이 모드는 다른 유형의 샌드박스와 관련하여 잠재적으로 향상된 성능을 제공합니다. 여기에서 Sandboxee의 새 인스턴스를 만들 때 새 바이너리를 실행할 필요가 없으며 기존 바이너리를 포크하기만 하면 됩니다.

  • custom_fork_bin.cc: 맞춤 포크 서버로서 새 샌드박스 사용자를 생성하기 위해 Client::WaitAndFork를 통해 fork()에 대한 요청을 수신합니다.
  • custom_fork_sandbox.cc: 맞춤 포크 서버를 시작하는 실행자입니다. 그런 다음 새 실행자를 통해 새 샌드박스 대상으로 요청을 전송하여 fork()를 통해 새 샌드박스 사용자를 생성합니다.

네트워크

기본적으로 사용되는 네트워크 네임스페이스는 샌드박스 처리된 프로세스가 외부 세계에 연결되지 않도록 차단합니다. 이 예는 이 문제를 처리하는 방법을 보여줍니다.

연결은 실행자 내에서 초기화되고 결과 소켓은 ::sandbox2::Comms::SendFD()를 통해 전달됩니다. Sandboxee는 ::sandbox2::Comms::RecvFD()를 사용하여 소켓을 수신한 다음 이 소켓을 사용하여 평소와 같이 데이터를 교환할 수 있습니다.

network_proxy

이 예에서는 네트워크 네임스페이스를 처리하는 다른 방법을 보여줍니다. 내부적으로는 위의 예와 정확히 동일한 방식으로 작동하지만, 더 편리한 API로 노출됩니다.

Sandboxee는 다음 두 가지 방법으로 네트워크 연결을 설정할 수 있습니다.

  • automatic – 자동 핸들러를 설치한 다음 일반 연결 호출을 실행합니다.
  • manual: NetworkProxyClient를 가져오고 NetworkProxyClient::Connect를 직접 사용합니다.

이 예에서는 두 메서드를 모두 보여줍니다. connect_with_handler 플래그가 설정된 경우 자동 모드가 사용되고, 그렇지 않으면 수동 모드가 사용됩니다.