
Tutte le fasi di esplorazione della CVE-2021-4034 di polkit utilizzando codeql
** Panoramica Questo repository esamina il bug di polkit pkexec usando CodeQL. Contiene
Questi sono stati completati:
Ancora da fare:
** Il Bug Il bug di 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)]] parte da un errore di limiti dell'array rispetto ad argv e si sviluppa su quello. La parte fuori dai limiti del problema è qualcosa che possiamo esaminare con la libreria di analisi degli intervalli di codeql.
La funzione main() di pkexec in polkit/src/programs/pkexec.c ha la struttura #+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
Idee principali:
Versioni da controllare:
Tutte le versioni di Polkit dal 2009 in poi sono vulnerabili; la prima versione è di maggio 2009 (commit c8c3d83, "Add a pkexec(1) command").
possiamo ottenere /a/ database [[https://lgtm.com/projects/g/freedesktop/polkit/ci/#ql][da lgtm]], quello attuale <2022-02-11 Fri> è =...srcVersion_a6bedfd...= ma questo è già oltre la patch di 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 possiamo vedere che il problema è stato corretto: #+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);
Quindi abbiamo bisogno del [[https://gitlab.freedesktop.org/polkit/polkit.git][codice sorgente]] e di creare i nostri database, uno pre-patch, uno post.
La sezione successiva illustra i passaggi di creazione, usando un container Docker.
** Creare polkit e il DB CodeQL Abbiamo bisogno della configurazione di build per polkit prima di poter ottenere un database codeql.
Opzioni di sistema operativo per la creazione:
macOS vale la pena provarlo, ma diventa complicato presto. Usare =brew= per ottenere le dipendenze funziona fino a un certo punto, ma la dipendenza =mozjs-78= è una versione specifica di spidermonkey e creare /quella/ non è pratico. #+BEGIN_SRC sh # autoconf... un po' complicato su un mac brew install autoconf automake libtool gtk-doc export PATH="/usr/local/opt/libtool/libexec/gnubin:$PATH" ./autogen.sh
# Usare meson?
brew install meson ninja intltool glib gobject-introspection
#+END_SRC
Linux è l'ambiente nativo per polkit, ma quale? La dipendenza mozjs-78 è una versione specifica di spidermonkey; inoltre, polkit non è usato da tutte le distribuzioni:
Ubuntu 22.04 può essere eseguito in diversi modi, su hardware, una VM (vmware, virtualbox, multipass, ecc.), o un container docker su un altro host. Per questo problema, possiamo usare un container Docker e includere anche gli strumenti da riga di comando codeql.
La definizione del container è in ./Dockerfiles, ecco la sequenza di creazione: #+BEGIN_SRC shell # Immagine di base per configurare il container qlbuild docker pull ubuntu:jammy docker images docker run --cpus 4 -m 8GB -ti ubuntu:jammy
# Immagine da personalizzare
docker build -t qlbuild .
#+END_SRC Nota: quando si usa docker desktop su windows e mac, i limiti di memoria e cpu devono essere aumentati lì. Una volta impostati, la sequenza di esecuzione del container è semplicemente #+BEGIN_SRC sh # Eseguire come daemon così rimane attivo anche quando ci si disconnette. docker run -d -p 127.0.0.1:2020:22 --cpus 8 -m 16GB qlbuild
# E connettersi
ssh -p 2020 test@localhost
#+END_SRC
Creazione su Ubuntu 22.04
#+BEGIN_SRC sh
# ---------------------------------
# Configurazione/installazione di sistema, come 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 versione a2bf5c9c di polkit richiede anche alcuni extra
apt install duktape duktape-dev
# meson più vecchio in /usr/local/bin
pip3 install meson==0.60.3
# Oppure ottenere il sorgente e usare quello:
# wget https://github.com/mesonbuild/meson/archive/refs/tags/0.60.3.tar.gz
# tar zxf 0.60.3.tar.gz
# ecc.
# ---------------------------------
# configurazione codeql -- ancora root
# prendi -- recupera ed estrai cli e libreria codeql
# Uso: grab versione piattaforma prefisso
grab() {
version=$1; shift
platform=$1; shift
prefix=$1; shift
mkdir -p $prefix/codeql-$version &&
cd $prefix/codeql-$version || return
# Ottieni cli
wget "https://github.com/github/codeql-cli-binaries/releases/download/$version/codeql-$platform.zip"
# Ottieni lib
wget "https://github.com/github/codeql/archive/refs/tags/codeql-cli/$version.zip"
# Correggi gli attributi
if [ `uname` = Darwin ] ; then
xattr -c *.zip
fi
# Estrai
unzip -q codeql-$platform.zip
unzip -q $version.zip
# Rinomina la directory della libreria per VS Code
mv codeql-codeql-cli-$version/ ql
# Rimuovi gli archivi
rm codeql-$platform.zip
rm $version.zip
}
grab v2.7.6 linux64 /opt
grab v2.6.3 linux64 /opt
# ---------------------------------
# Come utente test:
# Ottieni il sorgente di polkit
cd /tmp && git clone https://gitlab.freedesktop.org/polkit/polkit.git
# Crea la versione 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