
यह रिपॉजिटरी अंतिम रिपोर्ट और निम्नलिखित के लिए पुनरुत्पादन कलाकृतियों को शामिल करती है:
CVE-2018-1058: अनियंत्रित सर्च पथ के माध्यम से PostgreSQL में विशेषाधिकार वृद्धि
उद्देश्य एक सुरक्षित स्थानीय Docker वातावरण का उपयोग करके CVE-2018-1058 के पीछे के सर्च-पथ विश्वास विफलता को प्रदर्शित करना है।
डेमो सटीक ऐतिहासिक pg_dump निष्पादन पथ को पुन: उत्पन्न नहीं करता है। इसके बजाय, यह PostgreSQL मार्गदर्शन में वर्णित उसी मूल कारण को पुन: उत्पन्न करता है: एक हमलावर-लेखनीय स्कीमा में एक समान दिखने वाली वस्तु होती है, और दूसरा सत्र एक अयोग्य नाम को उस वस्तु पर हल करता है।
.
├── report.pdf
├── docker-compose.yml
├── README.md
└── scripts/
├── init.sql
├── init_safe.sql
├── exploit.sql
├── victim_query.sql
├── verify_qualify.sql
└── fix.sql
अंतिम रिपोर्ट report.pdf है। इसमें लिखित विश्लेषण और नीचे अपेक्षित आउटपुट के अनुरूप स्क्रीनशॉट शामिल हैं।
किसी Dockerfile की आवश्यकता नहीं है। प्रोजेक्ट आधिकारिक postgres इमेज का उपयोग करता है।
स्क्रीनशॉट सीधे report.pdf में एम्बेडेड हैं, इसलिए उन्हें अलग इमेज फ़ाइलों के रूप में प्रदान नहीं किया गया है।
इंस्टॉल करें:
psql क्लाइंट, वैकल्पिक लेकिन अनुशंसितडेमो दो PostgreSQL कंटेनरों का उपयोग करता है:
सुनिश्चित करें कि पोर्ट 15432 और 15433 खाली हैं।
अपेक्षित निष्पादन क्रम है:
attacker के रूप में exploit.sql चलाएँ।victim के रूप में victim_query.sql चलाएँ और CVE-2018-1058 DEMO: उपसर्ग देखें।victim के रूप में verify_qualify.sql चलाएँ और सामान्य लोअरकेस आउटपुट देखें।postgres के रूप में fix.sql चलाएँ।victim_query.sql फिर से चलाएँ और सामान्य लोअरकेस आउटपुट देखें।15433 पर exploit.sql फिर से चलाएँ और permission denied for schema public संदेश देखें।docker compose up -d pg_vulnerable
docker compose ps
अपेक्षित परिणाम: सेवा pg_vulnerable चल रही होनी चाहिए और पोर्ट 15432 पर मैप होनी चाहिए।
PostgreSQL संस्करण जाँचें:
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "SELECT version();"
अपेक्षित परिणाम: PostgreSQL 10.2।
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "\du"
अपेक्षित भूमिकाएँ:
postgresattackervictimहमलावर PostgreSQL सुपरयूज़र नहीं है।
हमलावर स्क्रिप्ट चलाएँ:
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
अपेक्षित आउटपुट:
CREATE TABLE
GRANT
GRANT
CREATE FUNCTION
यह बनाता है:
public.exploit_log तालिका;public.lower(varchar) फ़ंक्शन।PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
अपेक्षित आउटपुट:
CVE-2018-1058 DEMO: Alice Demo
CVE-2018-1058 DEMO: Bob Demo
यह दर्शाता है कि पीड़ित की सामान्य क्वेरी ने lower(...) को हमलावर-नियंत्रित फ़ंक्शन पर हल कर दिया।
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-c "TABLE public.exploit_log;"
अपेक्षित परिणाम: public.exploit_log में कम से कम दो पंक्तियाँ, पीड़ित क्वेरी द्वारा संसाधित प्रत्येक पंक्ति के लिए एक।
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/verify_qualify.sql
अपेक्षित आउटपुट:
alice demo
bob demo
यह काम करता है क्योंकि pg_catalog.lower(...) PostgreSQL को बिल्ट-इन फ़ंक्शन का उपयोग करने के लिए मजबूर करता है।
PGPASSWORD='postgres' \
psql -h 127.0.0.1 -p 15432 -U postgres -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/fix.sql
अपेक्षित आउटपुट में शामिल हो सकता है:
DROP FUNCTION
DROP TABLE
REVOKE
REVOKE
फिर पीड़ित क्वेरी फिर से चलाएँ:
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
अपेक्षित आउटपुट:
alice demo
bob demo
हमलावर-नियंत्रित फ़ंक्शन चला गया है, और क्वेरी सामान्य लोअरकेस स्ट्रिंग लौटाती है।
docker compose up -d pg_fixed
docker compose ps
संस्करण जाँचें:
docker exec -it cve1058_pg_fixed psql -U postgres -d demo_cve1058 -c "SELECT version();"
अपेक्षित परिणाम: PostgreSQL 10.3।
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15433 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
अपेक्षित आउटपुट:
ERROR: permission denied for schema public
इसका मतलब है कि हमलावर public में नकली फ़ंक्शन नहीं बना सकता, इसलिए नाम समाधान से पहले हमला श्रृंखला रुक जाती है।
कंटेनरों को रोकने के लिए:
docker compose down
वॉल्यूम हटाने और प्रोजेक्ट को पूरी तरह रीसेट करने के लिए:
docker compose down -v
यह डेमो जानबूझकर हानिरहित है। यह डेटा चोरी नहीं करता, फ़ाइलों तक पहुँच नहीं बनाता, या ऑपरेटिंग-सिस्टम कमांड निष्पादित नहीं करता।
एक्सप्लॉइट एक दृश्य स्ट्रिंग उपसर्ग और एक लॉग तालिका का उपयोग करता है ताकि साबित हो सके कि PostgreSQL ने एक अयोग्य फ़ंक्शन नाम को हमलावर-नियंत्रित वस्तु पर हल किया।
आधिकारिक CVE pg_dump और अन्य क्लाइंट एप्लिकेशन से संबंधित है। यह रिपॉजिटरी एक सुरक्षित और पुनरुत्पादनीय कक्षा सेटिंग में उसी सर्च-पथ विश्वास विफलता को प्रदर्शित करती है।
यदि कोई पोर्ट पहले से उपयोग में है, तो किसी भी स्थानीय PostgreSQL सेवा को रोकें या docker-compose.yml में होस्ट पोर्ट बदलें।
यदि आउटपुट अपेक्षित परिणामों से मेल नहीं खाता है, तो निम्नलिखित से वातावरण रीसेट करें:
docker compose down -v
docker compose up -d pg_vulnerable
यदि psql स्थानीय रूप से स्थापित नहीं है, तो संस्करण और भूमिका निरीक्षण कमांड अभी भी कंटेनरों के अंदर docker exec के साथ चलाए जा सकते हैं।
यदि pg_vulnerable पर एक्सप्लॉइट विफल होता है, तो सुनिश्चित करें कि डेटाबेस रीसेट किया गया था और scripts/exploit.sql को scripts/fix.sql से पहले निष्पादित किया जा रहा है।
| सेवा | संस्करण | कंटेनर नाम | होस्ट पोर्ट | उद्देश्य |
|---|
pg_vulnerable | PostgreSQL 10.2 | cve1058_pg_vulnerable | 15432 | कमजोर प्रदर्शन |
pg_fixed | PostgreSQL 10.3 | cve1058_pg_fixed | 15433 | पैच/सुदृढ़ तुलना |