
CTF-शैली Docker लैब CVE-2026-41651 (Pack2TheRoot) के लिए: PackageKit permissive-polkit स्थानीय विशेषाधिकार वृद्धि
एक Dockerised, CTF-शैली स्थानीय-विशेषाधिकार-वृद्धि (local-privilege-escalation) लैब, जो Pack2TheRoot सलाहकार (CVE-2026-41651) के इर्द-गिर्द बनाई गई है — यह PackageKit डेमॉन में 12 साल पुरानी खामी है, जिसे Deutsche Telekom की Red Team ने 22 अप्रैल 2026 को खुलासा किया।
लैब में तीन कंटेनर शामिल हैं: एक permissive-polkit CTF चुनौती, एक hardened तुलनात्मक लक्ष्य, और एक पूर्ण TOCTOU एक्सप्लॉइट पुनरुत्पादन जो स्रोत से कमजोर PackageKit बनाता है और वास्तविक CVE-2026-41651 रूट-कारण एक्सप्लॉइट चलाता है।
| कंटेनर | पोर्ट | भूमिका | एक्सप्लॉइट परिणाम |
|---|---|---|---|
pack2theroot-vuln | tcp/2222 (ssh) | PackageKit ≤ 1.3.4 + permissive polkit नियम | रूट crafted RPM के माध्यम से |
pack2theroot-patched | tcp/2223 (ssh) | समान, लेकिन polkit hardened | एक्सप्लॉइट विफल |
pack2theroot-exploit | — | स्रोत से निर्मित कमजोर PackageKit 1.3.4 | रूट TOCTOU D-Bus रेस के माध्यम से |
इसके अतिरिक्त:
docs/CHALLENGE.md)docs/HINTS.md)docs/SOLUTION.md)docs/diagrams/)pk-transaction.c में तीन श्रृंखलाबद्ध बगएक्सप्लॉइट एक ही ट्रांज़ैक्शन पर दो async D-Bus InstallFiles() कॉल भेजता है: पहले SIMULATE के साथ (polkit बायपास करता है, GLib idle कॉलबैक कतारबद्ध करता है), फिर तुरंत NONE + दुर्भावनापूर्ण पैकेज के साथ (idle फायर होने से पहले कैश्ड फ्लैग/पथ अधिलेखित करता है)। GLib की प्राथमिकता क्रम व्यवस्था गारंटी देती है कि दोनों D-Bus संदेश idle कॉलबैक से पहले डिस्पैच हो जाएँ — यह इसे नियतात्मक बनाता है, न कि टाइमिंग रेस।
ज्ञात IOC (सलाहकार से):
journalctl --no-pager -u packagekit | grep -iE 'emitted_finished|pk_transaction_finished_emit|pk-transaction\.c:514'
git clone https://github.com/dinosn/pack2theroot-lab.git
cd pack2theroot-lab
docker compose build
docker compose up -d
ssh labuser@localhost -p 2222 # पासवर्ड: labuser
# फिर docs/CHALLENGE.md के माध्यम से काम करें
फ्लैग /root/flag.txt पर है (मोड 0400 root:root)। प्रारूप:
PACK2THEROOT{...}
# बिल्ड और रन — ऑटो-मोड तुरंत एक्सप्लॉइट निष्पादित करता है:
docker compose run --rm exploit
# या मैनुअल मोड:
docker compose run --rm --entrypoint /entrypoint.sh exploit
# फिर कंटेनर के अंदर:
su - victim -c /exploit/cve-2026-41651
एक्सप्लॉइट C में दो .deb पैकेज बनाता है (कोई बाहरी टूल आवश्यक नहीं), दो-कॉल D-Bus रेस भेजता है, और /tmp/.suid_bash पर एक SUID bash बनाता है। पूर्ण तकनीकी वॉकथ्रू के लिए docs/SOLUTION.md देखें।
टियर डाउन:
docker compose down -v
pack2theroot-lab/
├── README.md
├── docker-compose.yml
├── docs/
│ ├── CHALLENGE.md # खिलाड़ी ब्रीफ
│ ├── HINTS.md # क्रमिक संकेत (दोनों पथ)
│ ├── SOLUTION.md # पूर्ण वॉकथ्रू + फ्लैग
│ ├── references.md # प्राथमिक और द्वितीयक स्रोत
│ ├── threat-model.md # हमलावर/डिफेंडर धारणाएँ
│ └── diagrams/ # एक्सप्लॉइट प्रवाह के SVG दृश्य आरेख
│ ├── 01-docker-build.svg
│ ├── 02-container-startup.svg
│ ├── 03-exploit-execution.svg
│ ├── 04-dbus-race-sequence.svg
│ ├── 05-attack-overview.svg
│ └── 06-auto-mode-full-run.svg
├── exploit/
│ ├── Dockerfile # स्रोत से कमजोर PackageKit 1.3.4 बनाता है
│ ├── entrypoint.sh # dbus + polkitd + packagekitd शुरू करता है
│ ├── Makefile
│ └── src/
│ └── cve-2026-41651.c # TOCTOU एक्सप्लॉइट (सार्वजनिक PoC)
├── vulnerable/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── policy/
│ └── 10-pack2theroot-lab-misconfig.rules # CTF चुनौती
├── patched/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── local/ # यहाँ 1.3.5 बैकपोर्ट RPM डालें (वैकल्पिक)
│ └── policy/
│ └── 10-pack2theroot-lab-hardened.rules # समाधान
└── scripts/
├── exploit-check.sh # संस्करण, polkit, D-Bus, IOC जाँचता है
├── check-version.sh # VULNERABLE बनाम PATCHED निर्णय
├── check-preconditions.sh # pkcon / polkit / D-Bus सैनिटी जाँच
├── monitor-ioc.sh # सलाहकार IOC के लिए journal टेल करता है
├── compare-env.sh # दोनों कंटेनरों का अंतर
└── apply-polkit-mitigation.sh # अनपैच्ड होस्ट के लिए अंतरिम हार्डनिंग
docs/diagrams/ निर्देशिका में एक्सप्लॉइट प्रवाह दिखाने वाले SVG आरेख हैं। इन्हें किसी भी ब्राउज़र में खोलें:
docs/CHALLENGE.md देखें। संक्षेप में:
labuser के रूप में SSH करें (पासवर्ड labuser)।rpm-build, rpmdevtools स्थापित हैं)।pkcon install-local --allow-untrusted के साथ स्थापित करें।%post स्क्रिप्टलेट रूट के रूप में चलता है। /root/flag.txt पढ़ें।अटक गए? docs/HINTS.md में क्रमशः अधिक स्पष्ट संकेत हैं। docs/SOLUTION.md केवल तभी खोलें जब आपने इसे हल कर लिया हो या वास्तव में राइट-अप की आवश्यकता हो।
किसी भी कंटेनर के अंदर, किसी भी उपयोगकर्ता के रूप में:
/opt/lab/check-version.sh # VULNERABLE या PATCHED निर्णय
/opt/lab/check-preconditions.sh # एक्सपोज़र स्व-जाँच
/opt/lab/exploit-check.sh # संस्करण + polkit + D-Bus + IOC जाँच
/opt/lab/monitor-ioc.sh # IOC के लिए journal टेल करें
होस्ट से, साथ-साथ:
./scripts/compare-env.sh
कमजोर कंटेनर पर अंतरिम polkit शमन लागू करें:
docker exec pack2theroot-vuln /opt/lab/apply-polkit-mitigation.sh
# फिर एक्सप्लॉइट दोबारा आज़माएँ — अब विफल होना चाहिए।
patched इमेज PackageKit संस्करण स्थिति को ईमानदारी से संभालती है:
/etc/pack2theroot-banner) प्रदर्शित करती है जो बताता है कि स्थापित संस्करण वास्तविक पैच है या डिस्ट्रो प्लेसहोल्डर।एक बार आपका डिस्ट्रो बैकपोर्ट प्रकाशित कर दे, तो संस्करण-पूर्ण पैच्ड इमेज बनाने के लिए RPM(s) को patched/local/ में डालें और पुनर्निर्माण करें:
docker compose build --build-arg USE_LOCAL_RPM=1 patched
--privileged की आवश्यकता होती है। इसे केवल पृथक वातावरण में चलाएँ।labuser) जानबूझकर कमज़ोर है। इसे कभी पुनः उपयोग न करें।प्राथमिक स्रोत:
CVE-2026-41651:
https://nvd.nist.gov/vuln/detail/CVE-2026-4165176cfb675:
https://github.com/PackageKit/PackageKit/commit/76cfb675fb31acc3ad5595d4380bfff56d2a8697द्वितीयक कवरेज और वितरण ट्रैकर्स के लिए docs/references.md देखें।
MIT — LICENSE देखें।
| फ़ील्ड | मान |
|---|
| CVE | CVE-2026-41651 |
| नाम | Pack2TheRoot |
| वर्ग | स्थानीय विशेषाधिकार वृद्धि (TOCTOU / CWE-367) |
| घटक | PackageKit डेमॉन (pk-transaction.c) |
| कमजोर सीमा | >= 1.0.2 और <= 1.3.4 (12 वर्षों के रिलीज़) |
| इसमें ठीक हुआ | PackageKit 1.3.5 (कमिट 76cfb675, रिलीज़ 2026-04-22) |
| CVSS 3.1 | 8.8 (HIGH) — AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| पूर्व-शर्तें | PackageKit चलाने वाले होस्ट पर स्थानीय अन-विशेषाधिकारित शेल |
| खोजकर्ता | Deutsche Telekom Security GmbH — Red Team |
| बग | स्थान | प्रभाव |
|---|
| BUG 1 | InstallFiles() (~लाइन 4036) | cached_transaction_flags और cached_full_paths को बिना किसी स्टेट गार्ड के अनियंत्रित रूप से अधिलेखित करता है |
| BUG 2 | pk_transaction_set_state() (~लाइन 876–881) | त्रुटि देने के बजाय पिछड़े स्टेट संक्रमणों को चुपचाप छोड़ देता है — फ्लैग पहले ही दूषित हो चुके हैं |
| BUG 3 | pk_transaction_run() (~लाइन 2273–2277) | प्राधिकरण समय पर नहीं, बल्कि डिस्पैच समय पर cached_transaction_flags पढ़ता है |
| बायपास | SIMULATE फ्लैग (~लाइन 2893–2900) | PK_TRANSACTION_FLAG_SIMULATE (0x4) polkit को पूरी तरह से बायपास करता है |
| आरेख | विवरण |
|---|
01-docker-build.svg | दो-चरणीय Docker बिल्ड — कमजोर PackageKit संकलन |
02-container-startup.svg | कंटेनर लॉन्च — dbus, polkitd, packagekitd स्टार्टअप |
03-exploit-execution.svg | एनोटेटेड चरणों के साथ चरण-दर-चरण एक्सप्लॉइट आउटपुट |
04-dbus-race-sequence.svg | D-Bus अनुक्रम आरेख — BUG 1/2/3 GLib प्राथमिकता के साथ कैसे श्रृंखलाबद्ध होते हैं |
05-attack-overview.svg | उच्च-स्तरीय हमला प्रवाह: टाइमलाइन के साथ हमलावर बनाम सिस्टम |
06-auto-mode-full-run.svg | पूर्ण --auto मोड टर्मिनल — कंटेनर स्टार्ट से रूट शेल तक |