개요
Google Play에서는 다양한 시나리오에서 Sandbox2를 사용하는 방법과 정책을 작성하는 방법을 보여주는 몇 가지 예시를 준비했습니다.
//sandboxed_api/sandbox2/examples에서 확인할 수 있습니다. 자세한 설명은 아래를 참조하세요.
CRC4
CRC4 예는 의도적으로 CRC4 체크섬을 계산한 것으로, 다른 프로그램을 샌드박스에 배포하는 방법과 이 프로그램과 통신하는 방법을 보여줍니다.
- crc4bin.cc: 샌드박스 처리할 프로그램 (예: Sandboxee)
- crc4sandbox.cc: 실행할 샌드박스 프로그램 (실행자).
설문 조사 진행 방법:
- 실행자는
::sandbox2::GetDataDependencyFilePath()
를 사용하여 파일 경로에서 샌드박스를 시작합니다. - 실행자는
SendBytes()
를 사용하여 통신 채널Comms
를 통해 샌드박스 대상에게 입력을 전송합니다. - 샌드박스는 CRC4를 계산하고
RecvUint32()
를 사용하여 수신하는 통신 채널Comms
를 통해 실행자에 응답을 다시 전송합니다.
프로그램이 통신 (read()
및 write()
) 이외의 syscall을 실행하면 정책 위반으로 인해 종료됩니다.
정적
정적 예는 정적으로 연결된 바이너리(예: 소스가 없는 서드 파티 바이너리)를 샌드박스 처리하는 방법을 보여줍니다. 즉, 이 바이너리가 샌드박스 처리된다는 사실을 인식하지 못합니다.
- static_bin.cc: Sandboxee는 ASCII 텍스트를 표준 입력에서 대문자로 변환하는 정적 C 바이너리입니다.
- static_sandbox.cc: 정책, 제한, Sandboxee 입력을 위한 파일 설명자를 사용하는 실행자
설문 조사 진행 방법:
- 실행자는 CRC4와 마찬가지로
GetDataDependencyFilepath
를 사용하여 파일 경로에서 Sandboxee를 시작합니다. - 제한을 설정하고
/proc/version
에서 파일 설명자를 열고MapFd
를 사용하여 Sandboxee에서 매핑되도록 표시합니다. - 이 정책은 일부 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
: SandboxeeSTDOUT_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_bin.cc: 샌드박스 처리할 프로그램 (Sandboxee)입니다.
- network_sandbox.cc: 실행할 샌드박스 프로그램 (예: 실행자)
network_proxy
이 예에서는 네트워크 네임스페이스를 처리하는 다른 방법을 보여줍니다. 내부적으로는 위의 예와 정확히 동일한 방식으로 작동하지만, 더 편리한 API로 노출됩니다.
Sandboxee는 다음 두 가지 방법으로 네트워크 연결을 설정할 수 있습니다.
- automatic – 자동 핸들러를 설치한 다음 일반 연결 호출을 실행합니다.
- manual:
NetworkProxyClient
를 가져오고NetworkProxyClient::Connect
를 직접 사용합니다.
이 예에서는 두 메서드를 모두 보여줍니다. connect_with_handler
플래그가 설정된 경우 자동 모드가 사용되고, 그렇지 않으면 수동 모드가 사용됩니다.
- network_bin.cc: 샌드박스 처리할 프로그램 (Sandboxee)입니다.
- network_sandbox.cc: 실행할 샌드박스 프로그램 (실행자)입니다.