
Todas as etapas de exploração do polkit CVE-2021-4034 usando codeql
** Visão geral Este repositório examina o bug do polkit pkexec usando CodeQL. Ele contém
Estes itens estão concluídos:
Ainda a fazer:
** O Bug O bug do Polkit pkexec [[https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034][(CVE-2021-4034)]] começa com um erro de limites de array em relação a argv e se desenvolve a partir disso. A parte fora dos limites do problema é algo que podemos examinar com a biblioteca de análise de intervalos do codeql.
A função main() do pkexec em polkit/src/programs/pkexec.c tem a estrutura #+begin_src text 435 main (int argc, char *argv[]) 436 { ... 534 for (n = 1; n < (guint) argc; n++) 535 { ... 568 } ... 610 path = g_strdup (argv[n]); ... #+end_src
Ideias principais:
Versões a verificar:
Todas as versões do Polkit a partir de 2009 são vulneráveis; primeira versão em maio de 2009 (commit c8c3d83, "Add a pkexec(1) command").
podemos obter /um/ banco de dados [[https://lgtm.com/projects/g/freedesktop/polkit/ci/#ql][do lgtm]], o atual <2022-02-11 Fri> é =...srcVersion_a6bedfd...= mas este já está além do patch do polkit: #+BEGIN_SRC text commit a6bedfd09b7bba753de7a107dc471da0db801858 (origin/master, origin/HEAD, master) Author: Xi Ruoyao [email protected] Date: Thu Jan 27 10:16:32 2022 +0000
jsauthority: port to mozjs-91
commit a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Author: Jan Rybar [email protected] Date: Tue Jan 25 17:21:46 2022 +0000
pkexec: local privilege escalation (CVE-2021-4034)
#+END_SRC E podemos ver que o problema está corrigido: #+BEGIN_SRC text commit a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Author: Jan Rybar [email protected] Date: Tue Jan 25 17:21:46 2022 +0000
pkexec: local privilege escalation (CVE-2021-4034)
diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c index f1bb4e1..768525c 100644 --- a/src/programs/pkcheck.c +++ b/src/programs/pkcheck.c @@ -363,6 +363,11 @@ main (int argc, char *argv[]) local_agent_handle = NULL; ret = 126;
exit(126);
Portanto, precisamos do [[https://gitlab.freedesktop.org/polkit/polkit.git][código-fonte]] e construir nossos próprios bancos de dados, um pré-patch, um pós.
A próxima seção percorre as etapas de construção, usando um contêiner Docker.
** Construir polkit e banco de dados CodeQL Precisamos da configuração de build do polkit antes de podermos obter um banco de dados codeql.
Opções de sistema operacional para a construção:
macOS vale a pena tentar, mas isso se torna complicado cedo. Usar =brew= para obter dependências funciona até certo ponto, mas a dependência =mozjs-78= é uma versão específica do spidermonkey e construir /isso/ não é prático. #+BEGIN_SRC sh # autoconf... um pouco complicado em um mac brew install autoconf automake libtool gtk-doc export PATH="/usr/local/opt/libtool/libexec/gnubin:$PATH" ./autogen.sh
# Usar meson?
brew install meson ninja intltool glib gobject-introspection
#+END_SRC
Linux é o ambiente nativo para o polkit, mas qual? A dependência mozjs-78 é uma versão específica do spidermonkey; além disso, o polkit não é usado por todas as distribuições:
O Ubuntu 22.04 pode ser executado de várias maneiras, em hardware, uma VM (vmware, virtualbox, multipass, etc.), ou um contêiner docker em outro host. Para este problema, podemos usar um contêiner Docker e incluir também as ferramentas de linha de comando do codeql.
A definição do contêiner está em ./Dockerfiles, aqui está a sequência de construção: #+BEGIN_SRC shell # Imagem base para configurar o contêiner qlbuild docker pull ubuntu:jammy docker images docker run --cpus 4 -m 8GB -ti ubuntu:jammy
# Imagem a ser personalizada
docker build -t qlbuild .
#+END_SRC Nota: ao usar o docker desktop no windows e mac, os limites de memória e cpu devem ser aumentados lá. Uma vez definidos, a sequência de execução do contêiner é simplesmente #+BEGIN_SRC sh # Executar como daemon para que permaneça ativo mesmo ao desconectar. docker run -d -p 127.0.0.1:2020:22 --cpus 8 -m 16GB qlbuild
# E conectar
ssh -p 2020 test@localhost
#+END_SRC
Construindo no Ubuntu 22.04
#+BEGIN_SRC sh
# ---------------------------------
# Configuração/instalação do sistema, como root:
echo "deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted" >> /etc/apt/sources.list
apt-get update
apt-get install -y zile build-essential git cmake
meson ninja-build
libmozjs-78-0 libmozjs-78-dev
libdbus-1-3 libdbus-1-dev
apt-get build-dep -y policykit-1
apt install unzip
# a versão a2bf5c9c do polkit também precisa de alguns extras
apt install duktape duktape-dev
# meson mais antigo em /usr/local/bin
pip3 install meson==0.60.3
# Ou obter o código-fonte e usar isso:
# wget https://github.com/mesonbuild/meson/archive/refs/tags/0.60.3.tar.gz
# tar zxf 0.60.3.tar.gz
# etc.
# ---------------------------------
# configuração do codeql -- ainda como root
# obter -- baixar e extrair o cli e a biblioteca do codeql
# Uso: grab versão url prefixo
grab() {
version=$1; shift
platform=$1; shift
prefix=$1; shift
mkdir -p $prefix/codeql-$version &&
cd $prefix/codeql-$version || return
# Obter cli
wget "https://github.com/github/codeql-cli-binaries/releases/download/$version/codeql-$platform.zip"
# Obter lib
wget "https://github.com/github/codeql/archive/refs/tags/codeql-cli/$version.zip"
# Corrigir atributos
if [ `uname` = Darwin ] ; then
xattr -c *.zip
fi
# Extrair
unzip -q codeql-$platform.zip
unzip -q $version.zip
# Renomear diretório da biblioteca para VS Code
mv codeql-codeql-cli-$version/ ql
# Remover arquivos
rm codeql-$platform.zip
rm $version.zip
}
grab v2.7.6 linux64 /opt
grab v2.6.3 linux64 /opt
# ---------------------------------
# Como usuário test:
# Obter código-fonte do polkit
cd /tmp && git clone https://gitlab.freedesktop.org/polkit/polkit.git
# Construir versão 0.119
cd /tmp/polkit
git checkout 0.119
git clean -fxd
meson setup builddir
meson compile -C builddir
find builddir -name pkexec -ls
: 139269 76 -rwxr-xr-x 1 test root 76696 Feb 12 03:06 builddir/src/programs/pkexec