
جميع مراحل استكشاف ثغرة polkit CVE-2021-4034 باستخدام CodeQL
** نظرة عامة يفحص هذا المستودع خطأ polkit pkexec باستخدام 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
الأفكار الرئيسية:
الإصدارات التي يجب فحصها:
جميع إصدارات 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
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 ويمكننا أن نرى أن المشكلة قد أُصلحت: #+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);
لذا نحتاج إلى [[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
# Use meson?
brew install meson ninja intltool glib gobject-introspection
#+END_SRC
Linux هي البيئة الأصلية لـ polkit، لكن أي توزيعة؟ تبعية mozjs-78 هي إصدار محدد من spidermonkey؛ أيضًا، polkit لا تستخدمه جميع التوزيعات:
يمكن تشغيل 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
# 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
# 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
# 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.