
Todas las etapas de exploración de la CVE-2021-4034 de polkit usando codeql
** Resumen Este repositorio examina el bug de polkit pkexec usando CodeQL. Contiene
Lo siguiente está hecho:
Pendiente:
** El Bug El bug de 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)]] comienza con un error de límites de array con respecto a argv y se construye sobre eso. La parte fuera de límites del problema es algo que podemos examinar con la librería de análisis de rangos de codeql.
La función main() de pkexec en polkit/src/programs/pkexec.c tiene la estructura #+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
Ideas principales:
Versiones a comprobar:
Todas las versiones de Polkit desde 2009 en adelante son vulnerables; primera versión en mayo de 2009 (commit c8c3d83, "Add a pkexec(1) command").
podemos obtener /una/ base de datos [[https://lgtm.com/projects/g/freedesktop/polkit/ci/#ql][de lgtm]], la actual <2022-02-11 vie> es =...srcVersion_a6bedfd...= pero esta ya está más allá del parche de 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 Y podemos ver que el problema está corregido: #+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);
Así que necesitamos el [[https://gitlab.freedesktop.org/polkit/polkit.git][código fuente]] y construir nuestras propias bases de datos, una pre-parche y otra post.
La siguiente sección recorre los pasos de construcción, usando un contenedor Docker.
** Construir polkit y la base de datos CodeQL Necesitamos la configuración de compilación de polkit antes de poder obtener una base de datos codeql.
Opciones de sistema operativo para compilar:
macOS vale la pena intentarlo, pero se complica rápidamente. Usar =brew= para obtener dependencias funciona hasta cierto punto, pero la dependencia =mozjs-78= es una versión específica de spidermonkey y compilar /eso/ no es práctico. #+BEGIN_SRC sh # autoconf... un poco complicado en una 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 es el entorno nativo de polkit, pero ¿cuál? La dependencia mozjs-78 es una versión específica de spidermonkey; además, polkit no es usado por todas las distribuciones:
Ubuntu 22.04 se puede ejecutar de varias maneras, en hardware, una VM (vmware, virtualbox, multipass, etc.), o un contenedor docker en otro host. Para este problema, podemos usar un contenedor Docker e incluir también las herramientas de línea de comandos de codeql.
La definición del contenedor está en ./Dockerfiles, aquí está la secuencia de construcción: #+BEGIN_SRC shell # Imagen base para configurar el contenedor qlbuild docker pull ubuntu:jammy docker images docker run --cpus 4 -m 8GB -ti ubuntu:jammy
# Imagen a personalizar
docker build -t qlbuild .
#+END_SRC Nota: al usar docker desktop en windows y mac, los límites de memoria y cpu deben aumentarse allí. Una vez establecidos, la secuencia de ejecución del contenedor es simplemente #+BEGIN_SRC sh # Ejecutar como daemon para que permanezca incluso al desconectarse. docker run -d -p 127.0.0.1:2020:22 --cpus 8 -m 16GB qlbuild
# Y conectar
ssh -p 2020 test@localhost
#+END_SRC
Compilando en Ubuntu 22.04
#+BEGIN_SRC sh
# ---------------------------------
# Configuración/instalación del 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
# la versión a2bf5c9c de polkit también necesita algunos extras
apt install duktape duktape-dev
# meson más antiguo en /usr/local/bin
pip3 install meson==0.60.3
# O obtener el código fuente y usarlo:
# wget https://github.com/mesonbuild/meson/archive/refs/tags/0.60.3.tar.gz
# tar zxf 0.60.3.tar.gz
# etc.
# ---------------------------------
# configuración de codeql -- todavía como root
# obtener -- descargar y extraer cli y librería de codeql
# Uso: grab version url prefix
grab() {
version=$1; shift
platform=$1; shift
prefix=$1; shift
mkdir -p $prefix/codeql-$version &&
cd $prefix/codeql-$version || return
# Obtener cli
wget "https://github.com/github/codeql-cli-binaries/releases/download/$version/codeql-$platform.zip"
# Obtener lib
wget "https://github.com/github/codeql/archive/refs/tags/codeql-cli/$version.zip"
# Corregir atributos
if [ `uname` = Darwin ] ; then
xattr -c *.zip
fi
# Extraer
unzip -q codeql-$platform.zip
unzip -q $version.zip
# Renombrar directorio de la librería para VS Code
mv codeql-codeql-cli-$version/ ql
# Eliminar archivos
rm codeql-$platform.zip
rm $version.zip
}
grab v2.7.6 linux64 /opt
grab v2.6.3 linux64 /opt
# ---------------------------------
# Como usuario test:
# Obtener código fuente de polkit
cd /tmp && git clone https://gitlab.freedesktop.org/polkit/polkit.git
# Compilar versión 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