Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
codeql-sample-polkit — Tutte le fasi di esplorazione della CVE-2021-4034 di polkit utilizzando codeql | Kitploit
Strumenti/GitHubGitHub/hohn/codeql-sample-polkit
Analisi StaticaAnalisi delle VulnerabilitàAnalisi del CodicePaper e RicercaApprendimento e Formazione
GitHubhohn/codeql-sample-polkit

codeql-sample-polkit

Tutte le fasi di esplorazione della CVE-2021-4034 di polkit utilizzando codeql

Vedi Repository
24 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

-- coding: utf-8 --

  • Il bug di polkit pkexec

** Panoramica Questo repository esamina il bug di polkit pkexec usando CodeQL. Contiene

  • istruzioni per la creazione dei database
  • i database risultanti
  • una sequenza di query che illustrano un approccio per trovare questo bug

Questi sono stati completati:

  • la creazione del sorgente / database di polkit
  • query codeql per il sorgente vulnerabile
  • illustrazione del CFG

Ancora da fare:

  • miglioramenti alla query codeql per gestire anche il sorgente corretto
  • istruzioni da riga di comando

** 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:

  • Usare una semplice analisi degli intervalli su argc.
  • Limitare rhs / lhs delle espressioni a quelle che coinvolgono argc.

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

    root@kitploit:~
      jsauthority: port to mozjs-91
    

    commit a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Author: Jan Rybar [email protected] Date: Tue Jan 25 17:21:46 2022 +0000

    root@kitploit:~
      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

    root@kitploit:~
      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;

    • if (argc < 1)
    • {
    • root@kitploit:~
       exit(126);
      
    • }
    • /* Disable remote file access from GIO. */ setenv ("GIO_USE_VFS", "local", 1); #+END_SRC
  • 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

    root@kitploit:~
    # 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:

    • Debian usa PolicyKit, non polkit.
    • Ubuntu:
      • 18.04 manca anche di mozjs78 (solo mozjs52)
      • 22.04 ha mozjs78

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

root@kitploit:~
 # 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

root@kitploit:~
 # 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

root@kitploit:~
 # 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

 # ---------------------------------
 # Crea il database codeql per la versione 0.119 
 cd /tmp/polkit
 git checkout 0.119 
 git clean -fxd

 # Esegui il passaggio di configurazione come al solito, senza codeql
 cd /tmp/polkit && rm -fR builddir
 meson setup builddir

 # Esegui il passaggio di build sotto codeql
 export CODEQL=/opt/codeql-v2.7.6/codeql/codeql
 $CODEQL --version

 $CODEQL database create  --language=cpp -s . -j 8 -v \
         polkit-0.119.db \
         --command='meson compile -C builddir'

 # Attendi 
 # TRAP import complete (10.2s).
 # Successfully created database at /tmp/polkit/polkit-0.119.db.

 # E un rapido controllo per assicurarsi che pkexec sia stato visto:
 unzip -v polkit-0.119.db/src.zip |grep pkexec
 : 29713  Defl:N     8477  72% 2022-02-14 20:12 bb39f235  tmp/polkit/src/programs/pkexec.c

 # ---------------------------------
 # Crea il database codeql per la versione a2bf5c9c, la versione corretta (e usando ancora
 # mozjs-78)
 cd /tmp/polkit
 git checkout a2bf5c9c 
 git clean -fxd

 # Esegui il passaggio di configurazione come al solito, senza codeql
 cd /tmp/polkit && rm -fR builddir
 /usr/local/bin/meson setup builddir

 # Con meson 0.61, la configurazione incontra l'errore
 #   actions/meson.build:3:5: ERROR: Function does not take positional arguments.
 # una rapida ricerca porta a 
 #   https://lore.kernel.org/all/20220111222135.693a88f2@windsurf/T/
 # e da lì a
 #   [1/1] package/gobject-introspection: bump to version 1.70.0

 # Esegui il passaggio di build sotto codeql
 export CODEQL=/opt/codeql-v2.7.6/codeql/codeql
 $CODEQL --version

 $CODEQL database create  --language=cpp -s . -j 8 -v \
         polkit-a2bf5c9c.db \
         --command='/usr/local/bin/meson compile -C builddir'

 # Attendi 
 # TRAP import complete (7.2s).
 # Successfully created database at /tmp/polkit/polkit-a2bf5c9c.db.

 # E un rapido controllo per assicurarsi che pkexec sia stato visto:
 unzip -v polkit-a2bf5c9c.db/src.zip |grep pkexec
 :   30136  Defl:N     8647  71% 2022-02-14 21:27 6af18604  tmp/polkit/src/programs/pkexec.c

#+END_SRC

Copia il db in un luogo permanente sull'host #+BEGIN_SRC sh # Copia dal container mkdir -p ~/local/polkit && cd ~/local/polkit scp -rq -P 2020 test@localhost:/tmp/polkit/polkit-0.119.db . scp -rq -P 2020 test@localhost:/tmp/polkit/polkit-a2bf5c9c.db .

root@kitploit:~
 # Conserva gli originali
 zip -rq polkit-0.119.zip polkit-0.119.db 
 zip -rq polkit-a2bf5c9c.zip polkit-a2bf5c9c.db

#+END_SRC

TODO

Spingi il container per il riutilizzo, vedi [[https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images][documentazione]]

#+BEGIN_SRC sh

docker login ghcr.io -u USERNAME

docker push ghcr.io/OWNER/IMAGE_NAME:latest

docker pull ghcr.io/OWNER/IMAGE_NAME

#+END_SRC

Prossimo passo, la configurazione per lo sviluppo delle query.

** Configurazione per lo sviluppo delle query Le query possono essere esplorate tramite la cli codeql da sola, o usando la cli codeql + il plugin VS Code. In entrambi i casi, installa la cli (vedi la funzione =grab()= sopra), ed estrai i database da [[./db]] o creali come fatto in [[*Build polkit and codeql db][Crea polkit e il db codeql]]

In quanto segue, assumiamo questa struttura di directory per i database: #+BEGIN_SRC text . ├── polkit-0.119.db │   ├── codeql-database.yml │   ├── db-cpp │   ├── log │   └── src.zip ├── polkit-0.119.zip ├── polkit-a2bf5c9c.db │   ├── codeql-database.yml │   ├── db-cpp │   ├── log │   └── src.zip └── polkit-a2bf5c9c.zip #+END_SRC

** La query La query è sviluppata in modo incrementale in [[./argv-out-of-bounds-*.ql]].

I primi passi in [[./argv-out-of-bounds-0.ql]] usano l'AST e i riferimenti alle variabili per restringere i risultati alle parti note del problema, come nel seguente.

#+BEGIN_SRC text dichiarazione | 435 main (int argc, char *argv[]) | 436 { | ... init altra var; | 534 for (n = 1; confronto con argc | n < (guint) argc; aggiorna altra var | n++) | 535 { | ... | 568 } | ... lettura indicizzata| 610 path = g_strdup (argv[n]); | ... | 629 if (path[0] != '/') | 630 { | ... | 632 s = g_find_program_in_path (path); | ... scrittura indicizz.| 639 argv[n] = path = s; | 640 } #+END_SRC

L'esplorazione dei valori inizia in [[./argv-out-of-bounds-1.ql]] con un tentativo di usare la libreria =SimpleRangeAnalysis= tramite #+begin_src javascript lowerBound(cmp.getLeftOperand().getFullyConverted()), "left lower bound", lowerBound(cmp.getRightOperand().getFullyConverted()), "right lower bound" #+end_src I limiti sono corretti per i tipi, ma troppo generali -- includono i possibili risultati dell'iterazione. Siamo interessati solo ai limiti iniziali che sono staticamente determinati, quelli prima che avvenga qualsiasi iterazione.

In altre parole, questo non è un problema generale di flusso di dati; vogliamo solo controllare la propagazione dei valori iniziali lungo determinati percorsi di esecuzione. Il ciclo =for= complica questo, così come le operazioni al suo interno.

Vogliamo davvero vedere i percorsi di esecuzione che bypassano del tutto il ciclo. Questo viene fatto nelle parti successive di [[./argv-out-of-bounds-1.ql]], usando una =SsaDefinition=.

La query [[./argv-out-of-bounds-2.ql]] ripulisce l'esplorazione da [[./argv-out-of-bounds-1.ql]] e identifica correttamente tutte le posizioni che usano =n= con un valore di indice noto =n > 0=.

Questa query riporta risultati sulla versione vulnerabile del codice, =polkit-0.119.db=. Successivamente, deve essere controllata e migliorata così che riporti nulla sulla versione corretta, =polkit-a2bf5c9c.db=.

TODO

** Eseguire la query dalla riga di comando

#+BEGIN_SRC sh

# Esegui una query sul database, salvando i risultati nella sottodirectory results/

# della directory del database per ulteriori elaborazioni.

codeql database run-queries -j8 --ram=20000 -- $DB $SRCDIR/example.ql

# Ottieni informazioni generali sui risultati disponibili

codeql bqrs info --format=text -- $DB/results/cpp-sample/example.bqrs

# Formatta i risultati usando bqrs decode.

codeql bqrs decode --output=cpp-simple.csv \

--format=csv --entities=all -- \

$DB/results/cpp-sample/example.bqrs

#+END_SRC

Scarica lo strumento