샌드박스2 설명

Sandbox2 설계는 잘 알려진 기술, 정책 프레임워크, 그리고 샌드박스 실행자와 샌드박스라는 두 가지 프로세스를 기반으로 합니다.

관련 기술

다음 섹션에서는 Sandbox2의 기반 레이어를 빌드하는 기술을 다룹니다.

Linux 네임스페이스

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

  • IPC: 프로세스 간 통신
  • 네트워크 (PolicyBuilder::AllowUnrestrictedNetworking()를 호출하여 명시적으로 사용 중지하지 않은 경우)
  • 마운트 (파일 시스템 트리의 맞춤 뷰 사용)
  • PID
  • 사용자 (PolicyBuilder::AllowUnsafeKeepCapabilities()를 호출하여 명시적으로 사용 중지하지 않은 경우)
  • UTS

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

IPC: 프로세스 간 통신

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

Seccomp-BPF

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

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

Ptrace

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

샌드박스 정책

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

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

기본 Syscall 정책

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

확장 Syscall 정책

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

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

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

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

네임스페이스 설정

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

명령줄 플래그

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

샌드박스 실행자

샌드박스 실행자는 자체 샌드박스 처리되지 않은 프로세스입니다. Sandboxee에 연결되는 ptrace 트레이서 프로세스 (ptrace tracee 프로세스)입니다. 또한 샌드박스 실행자는 Sandboxee를 추적하고 상태 정보를 제공하는 Monitor 인스턴스를 설정하고 실행합니다.

Sandbox2에서는 독립형, Sandbox2 Forkserver, Custom Forkserver의 세 가지 실행 모드를 사용할 수 있습니다. 포크 서버를 사용하는 경우 Sandboxee가 샌드박스 실행자의 하위 프로세스로 생성됩니다. 이러한 모드는 여기에 자세히 설명되어 있습니다.

샌드박스

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