
CVE-2022-0847 usado para obter escape de contêiner utilizando CVE-2022-0847 (Dirty Pipe) para realizar escape de contêiner
CVE-2022-0847 usado para obter escape de contêiner (sobrescrever qualquer arquivo somente leitura no host)
Slides (em chinês) disponíveis aqui
利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸(效果为覆写宿主机上任意只读文件)
中文汇报PPT在这里
Se o kernel for vulnerável ao CVE-2022-0847, o atacante pode sobrescrever arquivos somente leitura (não persistente! Visite https://dirtypipe.cm4all.com/ para mais detalhes). Contudo, um contêiner só pode acessar arquivos dentro do próprio contêiner. Felizmente, quando é concedida a capacidade CAP_DAC_READ_SEARCH, o atacante pode sobrescrever arquivos no host!
Conforme explicado em https://dirtypipe.cm4all.com/, para sobrescrever um arquivo somente leitura, devemos usar splice() para enviá-lo a um pipe. Para usar splice(), primeiro precisamos abrir o arquivo alvo com a flag O_RDONLY para obter um descritor de arquivo.
Foi aí que pensei no CAP_DAC_READ_SEARCH. De acordo com o manual do Linux, quando é concedido CAP_DAC_READ_SEARCH, o atacante dentro do contêiner pode:
Com a capacidade CAP_DAC_READ_SEARCH, podemos pesquisar o sistema de arquivos do host e usar open_by_handle_at(2) para abrir como somente leitura qualquer arquivo no host a partir do contêiner, obtendo seu descritor de arquivo (Visite http://stealth.openwall.net/xSports/shocker.c para mais detalhes).
Agora que temos o descritor de arquivo do arquivo alvo no host, podemos, claro, usar splice() para enviar o conteúdo do arquivo alvo para um pipe e depois sobrescrevê-lo!
cp /etc/password . # backup do /etc/password
gcc dp.c -o dp
docker run --rm -it -v $(pwd):/exp --cap-add=CAP_DAC_READ_SEARCH ubuntu
/exp/dp /etc/passwd 1 ootz: # sobrescreve /etc/password no host a partir do offset 1
/etc/dp /etc/passwd # exibe /etc/passwd no host
Primeiro, crie um arquivo somente leitura /home/vagrant/flag.txt pelo usuário root no host, com conteúdo hello world:

Em seguida, inicie um contêiner com a capacidade CAP_DAC_READ_SEARCH. Primeiro, tente exibir /home/vagrant/flag.txt no host, obtemos hello world:

depois, tente sobrescrever o arquivo alvo a partir do offset 1 com o conteúdo abcdefghij:

exiba o arquivo alvo novamente; agora o conteúdo é habcdefghij! Saia do contêiner e verifique /home/vagrant/flag.txt no host; seu conteúdo é habcdefghij.

Sim, acabamos de sobrescrever um arquivo no host a partir de um contêiner!