샌드박스2 설명

Sandbox2 설계는 잘 알려져 있고 확립된 기술, 정책 프레임워크, 두 가지 프로세스(샌드박스 실행기 및 Sandboxee)를 기반으로 합니다.

관련 기술

다음 섹션에서는 Sandbox2의 기본 레이어를 구성하는 기술을 다룹니다.

Linux 네임스페이스

Linux 네임스페이스는 운영체제 수준의 가상화를 제공하려는 시도입니다. 여러 사용자 공간이 서로 독립적으로 실행되는 것처럼 보이지만 단일 커널 인스턴스를 공유합니다. Sandbox2는 다음과 같은 종류의 네임스페이스를 사용합니다.

  • IPC
  • 네트워크 (PolicyBuilder::AllowUnrestrictedNetworking()을 호출하여 명시적으로 사용 중지하지 않는 한)
  • 마운트 (파일 시스템 트리의 맞춤 뷰 사용)
  • PID
  • 사용자
  • UTS

Wikipedia 또는 관련 설명 페이지에서 Linux 네임스페이스에 관해 자세히 알아보세요.

IPC

Sandbox2를 사용하면 샌드박스 실행기와 신뢰할 수 없는 Sandboxee 간에 임의의 데이터를 교환할 수 있습니다. 토큰과 핸들을 통해 TLV (Type-Length-Value) 메시지, 파일 설명자 전달, 사용자 인증 정보 교환을 지원합니다.

Seccomp-BPF

Sandbox2는 seccomp-bpf를 사용합니다. seccomp-bpf는 BPF (Berkeley Packet Filter) 규칙을 사용하여 syscall을 필터링할 수 있는 보안 컴퓨팅 모드 (seccomp)의 확장 프로그램입니다.

seccomp는 프로세스의 시스템 호출을 exit, sigreturn, read, write만 허용하도록 제한하는 Linux 커널 기능입니다. 프로세스가 다른 syscall을 실행하려고 하면 종료됩니다. seccomp-bpf 확장 프로그램은 seccomp보다 더 많은 유연성을 제공합니다. 고정된 syscall 집합을 허용하는 대신 seccomp-bpf는 syscall 데이터에서 BPF 프로그램을 실행하고 프로그램의 반환 값에 따라 syscall을 실행하거나, syscall을 건너뛰고 더미 값을 반환하거나, 프로세스를 종료하거나, 신호를 생성하거나, 추적기에 알릴 수 있습니다.

Ptrace

ptrace (프로세스 추적) syscall은 추적기 프로세스가 추적 대상 프로세스의 실행을 관찰하고 제어할 수 있는 기능을 제공합니다. 추적기 프로세스는 연결되면 추적 대상 프로세스를 완전히 제어할 수 있습니다. Wikipedia 또는 관련 설명 페이지에서 ptrace 에 관해 자세히 알아보세요.

샌드박스 정책

샌드박스 정책 은 Sandboxee가 실행할 수 있는 작업과 실행할 수 없는 작업을 지정하므로 샌드박스의 가장 중요한 부분입니다. 샌드박스 정책은 두 부분으로 구성됩니다.

  • Syscall 정책
  • 네임스페이스 설정

기본 Syscall 정책

기본 정책은 항상 위험한 syscall을 차단하고 사용자가 제공한 확장 정책보다 우선 적용됩니다.

확장 Syscall 정책

확장 syscall 정책은 PolicyBuilder 클래스를 사용하여 만들 수 있습니다. 이 클래스는 정책의 가독성을 개선하는 데 사용할 수 있는 여러 편의 규칙 (예: AllowStaticStartup, AllowDynamicStartup, AllowOpen)을 정의합니다.

대부분의 경우 일반적인 단일 스레드 라이브러리의 기준 정책으로 사전 구성된 PolicyBuilder를 반환하고 추가 규칙 (예: .AllowDynamicStartup() 및 .AddLibrariesForBinary() 바이너리를 샌드박스 처리할 때)으로 추가 맞춤설정할 수 있는 DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder())로 시작하는 것이 좋습니다. 샌드박스 처리된 API (SAPI)에서 DefaultPolicyBuilder()는 sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables(), sapi::Sandbox2Config::DefaultLimits()와 함께 sapi::SandboxConfig::DefaultConfig()에서 사용됩니다. PolicyBuilder를 직접 구성하는 것은 DefaultPolicyBuilder()를 사용할 수 없거나 정확한 구성이 필요한 경우에만 사용해야 합니다.

syscall을 추가로 제한하거나 더 복잡한 규칙이 필요한 경우 AddPolicyOnSyscall 및 AddPolicyOnSyscalls를 사용하여 원시 BPF 매크로를 지정할 수 있습니다. crc4 예시에서는 이 메커니즘을 사용하여 read, write, close syscall의 인수를 제한합니다.

일반적으로 샌드박스 정책이 더 엄격할수록 좋습니다. 코드 내에 있는 취약점의 악용이 정책에 의해 제한되기 때문입니다. 프로그램의 정상적인 작동에 필요한 syscall과 인수를 정확하게 지정할 수 있다면 코드 실행 취약점을 악용하는 공격자도 동일한 제한을 받습니다.

매우 엄격한 샌드박스 정책은 표준 입력 및 출력 파일 설명자에 대한 읽기 및 쓰기를 제외한 모든 syscall을 거부할 수 있습니다. 이 샌드박스 내에서 프로그램은 입력을 가져와 처리하고 출력을 반환할 수 있습니다. 그러나 프로세스가 다른 syscall을 실행하려고 하면 정책 위반으로 인해 종료됩니다. 따라서 프로세스가 손상된 경우(악의적인 사용자의 코드 실행) 실행기와 다른 사용자가 여전히 올바르게 처리해야 하는 잘못된 출력을 생성하는 것보다 더 악의적인 작업을 할 수 없습니다.

네임스페이스 설정

PolicyBuilder 객체는 파일 시스템의 Sandboxee 개별 뷰를 설정하는 데도 사용됩니다. 단일 파일 (AddFile / AddFileAt), 전체 디렉터리 (AddDirectory / AddDirectoryAt), 임시 저장소 (AddTmpfs) 를 Sandboxee의 환경에 매핑할 수 있습니다. 또한 AddLibrariesForBinary를 사용하여 지정된 동적으로 연결된 실행 파일에 필요한 모든 라이브러리를 자동으로 매핑할 수 있습니다.

명령줄 플래그

다음 명령줄 플래그 중 하나를 지정하여 Sandbox2 정책을 사용 중지할 수 있습니다. 이러한 플래그는 테스트 목적으로 사용됩니다 (예: 확장 syscall 정책을 구체화하는 동안).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

샌드박스 실행기

샌드박스 실행기 는 자체적으로 샌드박스 처리되지 않는 프로세스입니다. Sandboxee (ptrace 추적 대상 프로세스)에 연결되는 ptrace 추적기 프로세스입니다. 샌드박스 실행기는 Sandboxee를 추적하고 상태 정보를 제공하는 모니터 인스턴스를 설정하고 실행합니다.

Sandbox2는 독립형, Sandbox2 Forkserver, 커스텀 Forkserver의 세 가지 실행 모드를 허용합니다. forkserver를 사용하는 경우 Sandboxee는 샌드박스 실행기의 하위 프로세스로 생성됩니다. 이러한 모드는 여기에서 자세히 설명합니다.

Sandboxee

Sandboxee는 샌드박스 정책에 의해 정의된 제한된 샌드박스 처리된 환경에서 실행되는 프로세스입니다. 샌드박스 실행기는 IPC를 통해 정책을 Sandboxee로 전송합니다. 그러면 Sandboxee가 정책을 적용합니다. 정책 위반이 발생하면 달리 구성되지 않는 한 프로세스가 종료됩니다 (샌드박스 정책 참고).