샌드박스2 설명

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

관련 기술

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

Linux 네임스페이스

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

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

Wikipedia 또는 관련 도움말 페이지에서 Linux 네임스페이스에 대해 자세히 알아보세요.

IPC: 프로세스 간 통신

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

Seccomp-BPF

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

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

Ptrace

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

샌드박스 정책

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

  • 시스템 호출 정책
  • 네임스페이스 설정

기본 시스템 호출 정책

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

확장된 시스템 호출 정책

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

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

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

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

네임스페이스 설정

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

명령줄 플래그

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

샌드박스 실행기

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

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

Sandboxee

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