Explicação sobre o Sandbox2

O design do sandbox2 se baseia em tecnologias conhecidas e estabelecidas, em um framework de políticas e em dois processos: o executor do sandbox e o do sandboxee.

Tecnologias envolvidas

As seções a seguir abordam as tecnologias que criam a camada de fundação do Sandbox2.

Namespaces do Linux

Os namespaces do Linux são uma tentativa de oferecer virtualização no nível do sistema operacional. Embora vários espaços do usuário sejam executados de forma aparentemente independente um do outro, eles compartilham uma única instância do kernel. O sandbox2 usa os seguintes tipos de namespaces:

  • IPC
  • Rede (a menos que seja explicitamente desativada chamando PolicyBuilder::AllowUnrestrictedNetworking())
  • Montar (usando uma visualização personalizada da árvore do sistema de arquivos)
  • PID
  • Usuário (a menos que seja explicitamente desativado chamando PolicyBuilder::AllowUnsafeKeepCapabilities())
  • UTS

Saiba mais sobre namespaces do Linux na Wikipédia ou na página do manual relacionada.

IPC

O sandbox2 permite a troca de dados arbitrários entre o executor do sandbox e o sandboxee não confiável. Ele aceita mensagens TLV, transmitir descritores de arquivos e trocar credenciais por tokens e identificadores.

Seccomp-BPF

O sandbox2 usa o seccomp-bpf, que é uma extensão do Secure Computing Mode (seccomp) que permite usar regras do Berkeley Packet Filter (BPF) para filtrar chamadas do sistema.

O seccomp é um recurso do kernel do Linux que restringe as chamadas do sistema de um processo para permitir apenas exit, sigreturn, read e write. Se um processo tentar executar outra chamada do sistema, ele será encerrado. A extensão seccomp-bpf permite mais flexibilidade do que seccomp. Em vez de permitir um conjunto fixo de chamadas do sistema, o seccomp-bpf executa um programa BPF nos dados da chamada do sistema e, dependendo do valor de retorno, pode executar a chamada do sistema, ignorar a chamada do sistema e retornar um valor fictício, encerrar o processo, gerar um sinal ou notificar o rastreador.

Ptrace

A syscall ptrace (rastreamento de processo) fornece uma funcionalidade que permite que o processo do rastreador observe e controle a execução do processo de trace. O processo do rastreador tem controle total sobre ele depois de anexado. Leia mais sobre ptrace na Wikipédia ou na página do manual relacionada.

Política de sandbox

A política de sandbox é a parte mais importante dele, porque especifica as ações que o sandboxee pode ou não executar. Uma política de sandbox tem duas partes:

  • Política Syscall
  • Configuração do namespace

Política padrão do Syscall

A política padrão bloqueia chamadas do sistema que são sempre perigosas e têm precedência sobre a política estendida fornecida pelo usuário.

Política estendida de Syscall

A política de chamada do sistema estendida pode ser criada usando nossa classe PolicyBuilder. Essa classe define várias regras de conveniência (por exemplo, AllowStaticStartup, AllowDynamicStartup, AllowOpen) que podem ser usadas para melhorar a legibilidade da sua política.

Se você quiser restringir ainda mais as chamadas do sistema ou exigir regras mais complexas, especifique as macros brutas de BPF com AddPolicyOnSyscall e AddPolicyOnSyscalls. O exemplo do crc4 (link em inglês) usa esse mecanismo para restringir argumentos para as chamadas do sistema read, write e close.

Em geral, quanto mais rígida a Política de sandbox, melhor, porque a exploração de qualquer vulnerabilidade presente no código será limitada pela política. Se você conseguir especificar exatamente quais syscalls e argumentos são necessários para a operação normal do programa, qualquer invasor que explore uma vulnerabilidade de execução de código também ficará restrito aos mesmos limites.

Uma política de sandbox muito restrita pode negar todas as chamadas do sistema, exceto leituras e gravações em descritores de arquivo de entrada e saída padrão. Dentro desse sandbox, um programa pode receber entradas, processá-las e retornar a saída. No entanto, se o processo tentar fazer qualquer outra chamada do sistema, ele será encerrado devido a uma violação da política. Portanto, se o processo for comprometido (execução de código por um usuário malicioso), ele não poderá fazer nada mais prejudicial do que produzir uma saída ruim (que o executor e outros ainda precisam processar corretamente).

Configuração do namespace

O objeto PolicyBuilder também é usado para configurar a visualização individual do sistema de arquivos de um Sandboxee. Arquivos individuais (AddFile / AddFileAt), diretórios inteiros (AddDirectory / AddDirectoryAt) e o armazenamento temporário (AddTmpfs) podem ser mapeados para o ambiente do sandboxee. Além disso, AddLibrariesForBinary pode ser usado para mapear automaticamente todas as bibliotecas necessárias para o executável especificado vinculado dinamicamente.

Sinalizações de linha de comando

Qualquer política do Sandbox2 pode ser desativada especificando uma das flags de linha de comando a seguir. Essas sinalizações são destinadas para fins de teste (por exemplo, ao refinar a política de Syscall estendida).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Executor do sandbox

O Executor de sandbox é um processo que não fica no sandbox. É o processo do rastreador de ptrace que é anexado ao sandboxee (processo de rastreamento de ptrace). O Executor do sandbox também configura e executa uma instância de Monitor que rastreia o Sandboxee e fornece informações de status.

O sandbox2 permite três modos de execução: independente, sandbox2 Forkserver e Custom Forkserver. Se você usar um servidor de bifurcação, o sandboxee será criado como um processo filho do executor do sandbox. Esses modos são explicados em detalhes aqui.

Sandboxee

O sandboxee é o processo executado em um ambiente restrito e em sandbox, definido pela política do sandbox. O executor do sandbox envia a política ao sandboxee via IPC. Em seguida, o sandboxee aplica a política. Qualquer violação da política resultará no encerramento do processo, a menos que configurado de outra forma (consulte a Política de sandbox).