Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
codeql-sample-polkit — جميع مراحل استكشاف ثغرة polkit CVE-2021-4034 باستخدام CodeQL | Kitploit
أدوات/GitHubGitHub/hohn/codeql-sample-polkit
التحليل الثابتتحليل الثغرات الأمنيةتحليل الكودالأوراق والأبحاثالتعلم والتعليم
GitHubhohn/codeql-sample-polkit

codeql-sample-polkit

جميع مراحل استكشاف ثغرة polkit CVE-2021-4034 باستخدام CodeQL

عرض المستودع
25منذ 4 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

-- coding: utf-8 --

  • خطأ polkit pkexec

** نظرة عامة يفحص هذا المستودع خطأ polkit pkexec باستخدام CodeQL. يحتوي على

  • تعليمات لبناء قواعد البيانات
  • قواعد البيانات الناتجة
  • سلسلة من الاستعلامات توضح نهجًا للعثور على هذا الخطأ

تم إنجاز ما يلي:

  • بناء مصدر polkit / قاعدة البيانات
  • استعلام codeql للمصدر المعرض للخطر
  • توضيح CFG

ما زال يتعين إنجازه:

  • تحسينات استعلام codeql للتعامل أيضًا مع المصدر المُصحح
  • تعليمات سطر الأوامر

** الخطأ يبدأ خطأ 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)]] من خطأ في حدود المصفوفة فيما يتعلق بـ argv و يبني على ذلك. الجزء خارج الحدود من المشكلة هو شيء يمكننا النظر إليه باستخدام مكتبة تحليل النطاق codeql.

دالة main() في pkexec في polkit/src/programs/pkexec.c لها البنية #+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

الأفكار الرئيسية:

  • استخدام تحليل النطاق البسيط على argc.
  • قصر rhs / lhs للتعبيرات على تلك التي تتضمن argc.

الإصدارات التي يجب فحصها:

  • جميع إصدارات Polkit منذ 2009 معرضة للخطر؛ أول إصدار كان في مايو 2009 (commit c8c3d83، "Add a pkexec(1) command").

  • يمكننا الحصول على /a/ قاعدة بيانات [[https://lgtm.com/projects/g/freedesktop/polkit/ci/#ql][من lgtm]]، الحالية <2022-02-11 Fri> هي =...srcVersion_a6bedfd...= لكن هذه بالفعل تجاوزت تصحيح 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 ويمكننا أن نرى أن المشكلة قد أُصلحت: #+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
  • لذا نحتاج إلى [[https://gitlab.freedesktop.org/polkit/polkit.git][الكود المصدري]] وبناء قواعد البيانات الخاصة بنا، واحدة قبل التصحيح وأخرى بعده.

يشرح القسم التالي خطوات البناء، باستخدام حاوية Docker.

** بناء polkit وقاعدة بيانات CodeQL نحتاج إلى إعداد البناء لـ polkit قبل أن نتمكن من الحصول على قاعدة بيانات codeql.

خيارات أنظمة التشغيل للبناء:

  • macOS يستحق المحاولة، لكنه يصبح صعبًا في وقت مبكر. استخدام =brew= للحصول على التبعيات يعمل إلى حد ما، لكن تبعية =mozjs-78= هي إصدار محدد من spidermonkey وبناء /ذلك/ ليس عمليًا. #+BEGIN_SRC sh # autoconf... a little tricky on a mac brew install autoconf automake libtool gtk-doc export PATH="/usr/local/opt/libtool/libexec/gnubin:$PATH" ./autogen.sh

    root@kitploit:~
    # Use meson?
    brew install meson ninja intltool glib gobject-introspection 
    

    #+END_SRC

  • Linux هي البيئة الأصلية لـ polkit، لكن أي توزيعة؟ تبعية mozjs-78 هي إصدار محدد من spidermonkey؛ أيضًا، polkit لا تستخدمه جميع التوزيعات:

    • Debian يستخدم PolicyKit، وليس polkit.
    • Ubuntu:
      • 18.04 يفتقر أيضًا إلى mozjs78 (فقط mozjs52)
      • 22.04 يحتوي على mozjs78

يمكن تشغيل Ubuntu 22.04 بعدة طرق، على أجهزة، أو VM (vmware، virtualbox، multipass، إلخ)، أو حاوية docker على مضيف آخر. لهذه المشكلة، يمكننا استخدام حاوية Docker و تضمين أدوات سطر الأوامر codeql أيضًا.

تعريف الحاوية موجود في ./Dockerfiles، إليك تسلسل البناء: #+BEGIN_SRC shell # Base image for setting up the qlbuild container docker pull ubuntu:jammy docker images docker run --cpus 4 -m 8GB -ti ubuntu:jammy

root@kitploit:~
 # To-be-customized image
 docker build -t qlbuild .

#+END_SRC ملاحظة: عند استخدام docker desktop على windows و mac، يجب رفع حدود الذاكرة ووحدة المعالجة المركزية هناك. بمجرد ضبطها، يكون تسلسل تشغيل الحاوية ببساطة #+BEGIN_SRC sh # Run as daemon so it stays around even when disconnecting. docker run -d -p 127.0.0.1:2020:22 --cpus 8 -m 16GB qlbuild

root@kitploit:~
 # And connect
 ssh -p 2020 test@localhost

#+END_SRC

البناء على Ubuntu 22.04 #+BEGIN_SRC sh # --------------------------------- # System setup/install, as 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:~
 # polkit version a2bf5c9c also needs some extras
 apt install duktape duktape-dev
 # older meson into /usr/local/bin
 pip3 install meson==0.60.3
 # Or get the source and use that:
 #     wget https://github.com/mesonbuild/meson/archive/refs/tags/0.60.3.tar.gz
 #     tar zxf 0.60.3.tar.gz
 #     etc.

 # ---------------------------------
 # codeql setup -- still root

 # grab -- retrieve and extract codeql cli and library
 # Usage: grab version url prefix
 grab() {
     version=$1; shift
     platform=$1; shift
     prefix=$1; shift
     mkdir -p $prefix/codeql-$version &&
         cd $prefix/codeql-$version || return

     # Get cli
     wget "https://github.com/github/codeql-cli-binaries/releases/download/$version/codeql-$platform.zip"
     # Get lib
     wget "https://github.com/github/codeql/archive/refs/tags/codeql-cli/$version.zip"
     # Fix attributes
     if [ `uname` = Darwin ] ; then
         xattr -c *.zip
     fi
     # Extract
     unzip -q codeql-$platform.zip
     unzip -q $version.zip
     # Rename library directory for VS Code
     mv codeql-codeql-cli-$version/ ql
     # Remove archives
     rm codeql-$platform.zip
     rm $version.zip
 }    

 grab v2.7.6 linux64 /opt
 grab v2.6.3 linux64 /opt

 # ---------------------------------
 # As user test:
 # Get polkit source
 cd /tmp && git clone https://gitlab.freedesktop.org/polkit/polkit.git

 # Build version 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

 # ---------------------------------
 # Build codeql database for version 0.119 
 cd /tmp/polkit
 git checkout 0.119 
 git clean -fxd

 # Run the configuration step as usual, without codeql
 cd /tmp/polkit && rm -fR builddir
 meson setup builddir

 # Run the build step under 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'

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

 # And a quick check to make sure pkexec was seen:
 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

 # ---------------------------------
 # Build codeql database for version a2bf5c9c, the patched version (and still using
 # mozjs-78)
 cd /tmp/polkit
 git checkout a2bf5c9c 
 git clean -fxd

 # Run the configuration step as usual, without codeql
 cd /tmp/polkit && rm -fR builddir
 /usr/local/bin/meson setup builddir

 # With meson 0.61, configuration runs into the error
 #   actions/meson.build:3:5: ERROR: Function does not take positional arguments.
 # quick search leads to 
 #   https://lore.kernel.org/all/20220111222135.693a88f2@windsurf/T/
 # and from there to
 #   [1/1] package/gobject-introspection: bump to version 1.70.0

 # Run the build step under 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'

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

 # And a quick check to make sure pkexec was seen:
 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

انسخ قاعدة البيانات إلى مكان دائم على المضيف #+BEGIN_SRC sh # Copy from the 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:~
 # Keep originals
 zip -rq polkit-0.119.zip polkit-0.119.db 
 zip -rq polkit-a2bf5c9c.zip polkit-a2bf5c9c.db

#+END_SRC

TODO

Push container for reuse, see [[https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images][documentation]]

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

التالي، الإعداد لتطوير الاستعلام.

** إعداد تطوير الاستعلام يمكن استكشاف الاستعلامات عبر codeql cli بمفرده، أو باستخدام codeql cli + إضافة VS Code. في كلتا الحالتين، قم بتثبيت cli (انظر دالة =grab()= أعلاه)، واستخرج قواعد البيانات من [[./db]] أو قم ببنائها كما تم في [[*Build polkit and codeql db][بناء polkit وقاعدة بيانات codeql]]

فيما يلي، نفترض بنية الدليل هذه لقواعد البيانات: #+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

** الاستعلام يتم تطوير الاستعلام بشكل تدريجي في [[./argv-out-of-bounds-*.ql]].

تستخدم الخطوات الأولى في [[./argv-out-of-bounds-0.ql]] AST ومراجع المتغيرات لتضييق النتائج إلى الأجزاء المعروفة من المشكلة، كما في التالي.

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

يبدأ استكشاف القيم في [[./argv-out-of-bounds-1.ql]] بمحاولة استخدام مكتبة =SimpleRangeAnalysis= عبر #+begin_src javascript lowerBound(cmp.getLeftOperand().getFullyConverted()), "left lower bound", lowerBound(cmp.getRightOperand().getFullyConverted()), "right lower bound" #+end_src الحدود صحيحة لأنواع البيانات، لكنها عامة جدًا -- فهي تشمل النتائج المحتملة للتكرار. نحن مهتمون فقط بالحدود الأولية المحددة ثابتًا، تلك التي تسبق أي تكرار.

بعبارة أخرى، هذه ليست مشكلة تدفق بيانات عامة؛ نريد فقط التحقق من انتشار القيمة الأولية على طول مسارات تنفيذ معينة. حلقة =for= تعقد هذا الأمر، وكذلك العمليات داخلها.

نريد حقًا رؤية مسارات التنفيذ التي تتجاوز الحلقة تمامًا. يتم ذلك في الأجزاء الأخيرة من [[./argv-out-of-bounds-1.ql]]، باستخدام =SsaDefinition=.

ينظف الاستعلام [[./argv-out-of-bounds-2.ql]] الاستكشاف من [[./argv-out-of-bounds-1.ql]] ويحدد بشكل صحيح جميع المواقع التي تستخدم =n= بقيمة فهرس معروفة =n > 0=.

يبلغ هذا الاستعلام عن نتائج على الإصدار المعرض للخطر من الكود، =polkit-0.119.db=. بعد ذلك، يجب التحقق منه وتحسينه بحيث لا يبلغ عن شيء على الإصدار المُصحح، =polkit-a2bf5c9c.db=.

TODO

** Running the query from the command line

#+BEGIN_SRC sh

# Run a query against the database, saving the results to the results/

# subdirectory of the database directory for further processing.

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

# Get general info about available results

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

# Format results using bqrs decode.

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

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

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

#+END_SRC

تنزيل الأداة