Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
codeql-sample-polkit — Todas las etapas de exploración de la CVE-2021-4034 de polkit usando codeql | Kitploit
Herramientas/GitHubGitHub/hohn/codeql-sample-polkit
Análisis EstáticoAnálisis de VulnerabilidadesAnálisis de CódigoPapers e InvestigaciónAprendizaje y Educación
GitHubhohn/codeql-sample-polkit

codeql-sample-polkit

Todas las etapas de exploración de la CVE-2021-4034 de polkit usando codeql

Ver Repositorio
25hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

-- coding: utf-8 --

  • El bug de polkit pkexec

** Resumen Este repositorio examina el bug de polkit pkexec usando CodeQL. Contiene

  • instrucciones para construir las bases de datos
  • las bases de datos resultantes
  • una secuencia de consultas que ilustran un enfoque para encontrar este bug

Lo siguiente está hecho:

  • la construcción del código fuente / base de datos de polkit
  • consulta codeql para el código vulnerable
  • ilustración del CFG

Pendiente:

  • mejoras a la consulta codeql para manejar también el código parcheado
  • instrucciones de línea de comandos

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

  • Usar análisis de rangos simple sobre argc.
  • Limitar rhs / lhs de expresiones a aquellas que involucran argc.

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

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

    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
  • 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

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

    • Debian usa PolicyKit, no polkit.
    • Ubuntu:
      • 18.04 también carece de mozjs78 (solo mozjs52)
      • 22.04 tiene mozjs78

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

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

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

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

 # ---------------------------------
 # Construir base de datos codeql para la versión 0.119 
 cd /tmp/polkit
 git checkout 0.119 
 git clean -fxd

 # Ejecutar el paso de configuración como siempre, sin codeql
 cd /tmp/polkit && rm -fR builddir
 meson setup builddir

 # Ejecutar el paso de compilación bajo 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'

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

 # Y una verificación rápida para asegurarse de que pkexec fue 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

 # ---------------------------------
 # Construir base de datos codeql para la versión a2bf5c9c, la versión parcheada (y aún usando
 # mozjs-78)
 cd /tmp/polkit
 git checkout a2bf5c9c 
 git clean -fxd

 # Ejecutar el paso de configuración como siempre, sin codeql
 cd /tmp/polkit && rm -fR builddir
 /usr/local/bin/meson setup builddir

 # Con meson 0.61, la configuración encuentra el error
 #   actions/meson.build:3:5: ERROR: Function does not take positional arguments.
 # una búsqueda rápida lleva a 
 #   https://lore.kernel.org/all/20220111222135.693a88f2@windsurf/T/
 # y de ahí a
 #   [1/1] package/gobject-introspection: bump to version 1.70.0

 # Ejecutar el paso de compilación bajo 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'

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

 # Y una verificación rápida para asegurarse de que pkexec fue 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

Copiar la base de datos a un lugar permanente en el host #+BEGIN_SRC sh # Copiar desde el contenedor 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:~
 # Conservar los originales
 zip -rq polkit-0.119.zip polkit-0.119.db 
 zip -rq polkit-a2bf5c9c.zip polkit-a2bf5c9c.db

#+END_SRC

TODO

Subir contenedor para reutilización, ver [[https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images][documentación]]

#+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

A continuación, la configuración para el desarrollo de consultas.

** Configuración para el desarrollo de consultas Las consultas se pueden explorar mediante el cli de codeql por sí solo, o usando el cli de codeql + el plugin de VS Code. Para ambos casos, instalar el cli (ver la función =grab()= anterior), y extraer las bases de datos de [[./db]] o construirlas como se hizo en [[*Build polkit and codeql db][Build polkit and codeql db]]

A continuación, asumimos esta estructura de directorios para las bases de datos: #+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 consulta La consulta se desarrolla incrementalmente en [[./argv-out-of-bounds-*.ql]].

Los primeros pasos en [[./argv-out-of-bounds-0.ql]] usan el AST y las referencias a variables para reducir los resultados a las partes conocidas del problema, como en lo siguiente.

#+BEGIN_SRC text declaration | 435 main (int argc, char *argv[]) | 436 { | ... init other var; | 534 for (n = 1; compare to argc | n < (guint) argc; update other var | n++) | 535 { | ... | 568 } | ... indexed read | 610 path = g_strdup (argv[n]); | ... | 629 if (path[0] != '/') | 630 { | ... | 632 s = g_find_program_in_path (path); | ... indexed write | 639 argv[n] = path = s; | 640 } #+END_SRC

La exploración de valores comienza en [[./argv-out-of-bounds-1.ql]] con un intento de usar la librería =SimpleRangeAnalysis= mediante #+begin_src javascript lowerBound(cmp.getLeftOperand().getFullyConverted()), "left lower bound", lowerBound(cmp.getRightOperand().getFullyConverted()), "right lower bound" #+end_src Los límites son correctos para los tipos, pero demasiado generales -- incluyen los posibles resultados de la iteración. Solo nos interesan los límites iniciales que son estáticamente determinables, aquellos antes de que ocurra cualquier iteración.

Dicho de otro modo, este no es un problema general de flujo de datos; solo queremos comprobar la propagación de valores iniciales a lo largo de ciertas rutas de ejecución. El bucle =for= complica esto, al igual que las operaciones dentro de él.

Realmente queremos ver rutas de ejecución que omitan el bucle por completo. Eso se hace en las últimas partes de [[./argv-out-of-bounds-1.ql]], usando una =SsaDefinition=.

La consulta [[./argv-out-of-bounds-2.ql]] limpia la exploración de [[./argv-out-of-bounds-1.ql]] e identifica correctamente todas las ubicaciones que usan =n= con un valor de índice conocido =n > 0=.

Esta consulta reporta resultados en la versión vulnerable del código, =polkit-0.119.db=. A continuación, debe verificarse y mejorarse para que no reporte nada en la versión parcheada, =polkit-a2bf5c9c.db=.

TODO

** Ejecutar la consulta desde la línea de comandos

#+BEGIN_SRC sh

# Ejecutar una consulta contra la base de datos, guardando los resultados en el subdirectorio

# results/ del directorio de la base de datos para su posterior procesamiento.

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

# Obtener información general sobre los resultados disponibles

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

# Formatear resultados usando bqrs decode.

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

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

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

#+END_SRC

Descargar herramienta