Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
codeql-sample-polkit — Todas as etapas de exploração do polkit CVE-2021-4034 usando codeql | Kitploit
Ferramentas/GitHubGitHub/hohn/codeql-sample-polkit
Análise EstáticaAnálise de VulnerabilidadesAnálise de CódigoPapers e PesquisaAprendizado e Educação
GitHubhohn/codeql-sample-polkit

codeql-sample-polkit

Todas as etapas de exploração do polkit CVE-2021-4034 usando codeql

Ver Repositório
25há 4 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

-- coding: utf-8 --

  • O bug do polkit pkexec

** Visão geral Este repositório examina o bug do polkit pkexec usando CodeQL. Ele contém

  • instruções para construir os bancos de dados
  • os bancos de dados resultantes
  • uma sequência de consultas ilustrando uma abordagem para encontrar este bug

Estes itens estão concluídos:

  • a construção do código-fonte / banco de dados do polkit
  • consulta codeql para o código vulnerável
  • ilustração do CFG

Ainda a fazer:

  • melhorias na consulta codeql para também tratar o código corrigido
  • instruções de linha de comando

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

  • Usar análise simples de intervalos em argc.
  • Limitar rhs / lhs de expressões àquelas que envolvem argc.

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

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

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

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

    • Debian usa PolicyKit, não polkit.
    • Ubuntu:
      • 18.04 também não tem mozjs78 (apenas mozjs52)
      • 22.04 tem mozjs78

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

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

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

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

 # ---------------------------------
 # Construir banco de dados codeql para versão 0.119 
 cd /tmp/polkit
 git checkout 0.119 
 git clean -fxd

 # Executar a etapa de configuração como de costume, sem codeql
 cd /tmp/polkit && rm -fR builddir
 meson setup builddir

 # Executar a etapa de build sob 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'

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

 # E uma verificação rápida para garantir que pkexec foi 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 banco de dados codeql para versão a2bf5c9c, a versão corrigida (e ainda usando
 # mozjs-78)
 cd /tmp/polkit
 git checkout a2bf5c9c 
 git clean -fxd

 # Executar a etapa de configuração como de costume, sem codeql
 cd /tmp/polkit && rm -fR builddir
 /usr/local/bin/meson setup builddir

 # Com meson 0.61, a configuração encontra o erro
 #   actions/meson.build:3:5: ERROR: Function does not take positional arguments.
 # uma pesquisa rápida leva a 
 #   https://lore.kernel.org/all/20220111222135.693a88f2@windsurf/T/
 # e daí para
 #   [1/1] package/gobject-introspection: bump to version 1.70.0

 # Executar a etapa de build sob 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'

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

 # E uma verificação rápida para garantir que pkexec foi 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 o banco de dados para um local permanente no host #+BEGIN_SRC sh # Copiar do contêiner 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:~
 # Manter originais
 zip -rq polkit-0.119.zip polkit-0.119.db 
 zip -rq polkit-a2bf5c9c.zip polkit-a2bf5c9c.db

#+END_SRC

TODO

Enviar contêiner para reutilização, ver [[https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images][documentação]]

#+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 seguir, a configuração para o desenvolvimento de consultas.

** Configuração para desenvolvimento de consultas As consultas podem ser exploradas via codeql cli sozinho, ou usando o codeql cli + o plugin VS Code. Para ambos os casos, instale o cli (veja a função =grab()= acima), e extraia os bancos de dados de [[./db]] ou construa-os como feito em [[*Build polkit and codeql db][Construir polkit e banco de dados codeql]]

A seguir, assumimos esta estrutura de diretórios para os bancos de dados: #+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

** A consulta A consulta é desenvolvida incrementalmente em [[./argv-out-of-bounds-*.ql]].

Os primeiros passos em [[./argv-out-of-bounds-0.ql]] usam o AST e referências de variáveis para restringir os resultados às partes conhecidas do problema, como a seguir.

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

A exploração de valores começa em [[./argv-out-of-bounds-1.ql]] com uma tentativa de usar a biblioteca =SimpleRangeAnalysis= via #+begin_src javascript lowerBound(cmp.getLeftOperand().getFullyConverted()), "left lower bound", lowerBound(cmp.getRightOperand().getFullyConverted()), "right lower bound" #+end_src Os limites são corretos para os tipos, mas muito gerais -- eles incluem os possíveis resultados da iteração. Estamos interessados apenas em limites iniciais que são estaticamente determinados, aqueles antes de qualquer iteração acontecer.

Em outras palavras, este não é um problema geral de fluxo de dados; queremos apenas verificar a propagação de valores iniciais ao longo de certos caminhos de execução. O loop =for= complica isso, assim como as operações dentro dele.

Realmente queremos ver caminhos de execução que contornam o loop completamente. Isso é feito nas partes finais de [[./argv-out-of-bounds-1.ql]], usando uma =SsaDefinition=.

A consulta [[./argv-out-of-bounds-2.ql]] limpa a exploração de [[./argv-out-of-bounds-1.ql]] e identifica corretamente todos os locais usando =n= com um valor de índice conhecido =n > 0=.

Esta consulta relata resultados na versão vulnerável do código, =polkit-0.119.db=. Em seguida, precisa ser verificada e aprimorada para que relate nada na versão corrigida, =polkit-a2bf5c9c.db=.

TODO

** Executando a consulta a partir da linha de comando

#+BEGIN_SRC sh

# Executar uma consulta contra o banco de dados, salvando os resultados no subdiretório results/

# do diretório do banco de dados para processamento posterior.

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

# Obter informações gerais sobre os resultados disponíveis

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

# Formatar resultados usando bqrs decode.

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

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

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

#+END_SRC

Baixar ferramenta