
आत्म-पराजयकारी ऑडिट: एक पुनरुत्पादनीय लैब जो दर्शाती है कि निम्न-विशेषाधिकार वाली PostgreSQL भूमिका ट्रिगर-आधारित ऑडिटर को प्रतिवर्ती रूप से अंधा कर सकती है + एट्रिब्यूशन को दूषित कर सकती है (PG14/16), सुरक्षा उपायों के साथ। सिंथेटिक डेटा; CVE-2018-1058 प्रिमिटिव्स उद्धृत।
License: MIT (code) / CC BY 4.0 (docs)
रक्षात्मक-सुरक्षा अनुसंधान जो जाँचता है कि क्या निम्न-विशेषाधिकार (low-privilege), केवल-इंजेक्शन (injection-only) डेटाबेस भूमिका एक ट्रिगर-आधारित ऑडिटर को प्रतिवर्ती रूप से अंधा (reversibly blind) कर सकती है और स्टॉक PostgreSQL पर आरोपण (attribution) को दूषित कर सकती है — और कौन-सी सुरक्षाएँ इसे वास्तव में रोकती हैं। सब कुछ डिस्पोजेबल, स्थानीय Docker कंटेनरों में पूर्णतः सिंथेटिक डेटा (RFC 5737 दस्तावेज़ीकरण IPs, काल्पनिक पहचान) के साथ चलता है। कोई वास्तविक सिस्टम, क्रेडेंशियल या डेटा शामिल नहीं है।
प्रयोगशाला संक्षिप्त विवरण self-defeating-audits-lab.md में देखें।
व्यापक रूप से कॉपी किए गए PostgreSQL wiki "ऑडिट ट्रिगर" पीड़ित को बनाता है, फिर PostgreSQL 14 और 16 पर व्यवहार्यता मैट्रिक्स (feasibility matrix) को सेल-दर-सेल काम करता है — बैंड के बाहर (out of band) मापते हुए — कि क्या प्रत्येक हमला वेक्टर वास्तव में किसी राइट को ऑडिट होने से रोकता है, क्या वह शून्य अवशेष (zero residue) के साथ प्रतिवर्ती है, और कौन-सी सुरक्षाएँ उसे मार देती हैं।
cd scripts
./00_up.sh 16 # bring up postgres:16-alpine on localhost:55432
./run_matrix.sh 16 # run every matrix cell + defenses -> ../results/RESULTS_pg16.md
docker rm -f sda_pg16 # free the port between versions
./00_up.sh 14
./run_matrix.sh 14 # -> ../results/RESULTS_pg14.md
./teardown.sh # remove all lab containers
Docker आवश्यक है। -alpine इमेज का उपयोग करता है (कार्यात्मक रूप से समान इंजन)।
अध्ययन को दो और इंजन परिवारों पर दोहराया गया है। MySQL परिवार (MariaDB,
DEFINER-ट्रिगर मॉडल) scripts/mysql/ के अंतर्गत:
cd scripts/mysql
./00_up.sh 10.11 && ./run_matrix_mysql.sh 10.11 # -> results/RESULTS_mariadb_10.11.md
docker rm -f sda_maria_10_11 && ./00_up.sh 10.6 && ./run_matrix_mysql.sh 10.6
SQL Server (स्वामित्व-श्रृंखला (ownership-chaining) मॉडल) scripts/mssql/ के अंतर्गत — स्थानीय
LocalDB इंस्टेंस पर होस्ट sqlcmd के माध्यम से चलता है (Docker नहीं; निम्न-विशेषाधिकार हमलावर को
EXECUTE AS USER प्रतिरूपण (impersonation) से मॉडल किया गया है):
cd scripts/mssql
./run_matrix_mssql.sh # -> results/RESULTS_mssql.md ; then ./teardown.sh
प्रतिलिपि-योग्यता चेतावनी (SQL Server)। Docker इंजनों के विपरीत, SQL Server तीसरे भाग में होस्ट निर्भरता है: यह स्थानीय SQL Server LocalDB इंस्टेंस पर
sqlcmdके माध्यम से चलता है (पथrun_matrix_mssql.shमें हार्डकोड किया गया है), इसलिए यह केवल Windows है और किसी इमेज डाइजेस्ट पर पिन नहीं किया जा सकता। निम्न-विशेषाधिकार हमलावर कोEXECUTE AS USERप्रतिरूपण से मॉडल किया गया है (LocalDB केवल Windows-प्रमाणीकरण है)। इंजन-व्यवहार निष्कर्ष (DISABLE शून्य-अवशेष; DDL गार्ड DISABLE को नहीं पकड़ता) सत्र प्रकार से स्वतंत्र हैं और वास्तविक लॉगिन के लिए मान्य होंगे; ऑब्जेक्ट-अनुदान (object-grant) निष्कर्ष प्रतिरूपण द्वारा ईमानदारी से लागू किए गए हैं। यह तीनों इंजनों में सबसे कम पोर्टेबल है — ईमानदारी से नोट किया गया है।
मुख्य क्रॉस-इंजन परिणाम: search_path छाया (shadow) वर्ग (1A/1B) न तो
MySQL में और न ही SQL Server में स्थानांतरित होता है (कोई search_path नहीं), लेकिन ट्रिगर-प्रतिस्थापन, निष्क्रिय
बाईपास (dormant bypass) और आरोपण विषाक्तता (attribution poisoning) होते हैं। MySQL का DEFINER-विशेषाधिकार बंधन अंधापन को
अधिक पता लगाने योग्य बनाता है; SQL Server, PostgreSQL की तरह, बाइट-परिपूर्ण पुनर्स्थापन की अनुमति देता है और एक
शून्य-अवशेष DISABLE TRIGGER आदिम जोड़ता है जिसे उसका अपना DDL बचाव नहीं पकड़ता। पूर्ण तीन-इंजन
तुलना FINDINGS.md में।
CREATE SCHEMA नहीं कर सकती), नहीं क्योंकि "pg_catalog जीतता है"। पहले से लिखने-योग्य public में रोपण वास्तव में छाया डालता है: 1S (समान-हस्ताक्षर, स्कीमा-क्रम) और 1T (सटीक ओवरलोड बिल्ट-इन को pg_catalog पहले होने पर भी हरा देता है — प्रकार-विशिष्टता को पृथक करता है) दोनों अंधा (payload-नल) करते हैं।row_to_json ओवरलोड — ऑडिटर को तब अंधा करता है जब
public लिखने-योग्य हो और ट्रिगर search_path पिन न हो। स्टॉक PostgreSQL ≤14 पर सुलभ; 15+ पर misconfiguration-गेटेड। search_path पिन करना इसे हर जगह पराजित करता है।pgaudit/) + ऐसी सुरक्षाएँ हैं जो सेट को बंद करती हैं।अनामीकृत/सिंथेटिक डेटा के साथ स्थानीय प्रयोगशाला में स्टॉक PostgreSQL पर दोहराया गया।
हमला SQL यहाँ निर्मित प्रयोगशाला स्कीमा तक सीमित है; यह एक व्यवहार्यता/बचाव अध्ययन है, न कि
शस्त्रीकृत पेलोड। अंतर्निहित आदिम पहले से सार्वजनिक हैं (CVE-2018-1058;
SECURITY DEFINER search_path escalation) — योगदान संयोजन और बचाव मूल्यांकन है। कोई वास्तविक सिस्टम पहचाना नहीं गया है।
| Path | What |
|---|
scripts/00_up.sh | version-pinned throwaway container (PostgreSQL) |
scripts/mysql/ | MySQL-family (MariaDB) victim, attacks, defenses, and orchestrator |
scripts/mssql/ | SQL Server (LocalDB) victim, attacks, defenses, and orchestrator |
results/RESULTS_mariadb_*.md | MySQL-family feasibility + defense matrices |
results/RESULTS_mssql.md | SQL Server feasibility + defense matrix |
scripts/10_victim.sql | the wiki-pattern audit victim (SECURITY DEFINER trigger); knobs: pub_create, pin_path, app_owns |
scripts/20_attacks.sql | all attack vectors (1A/1B/1C, GUC dormant, attribution poison), one \if-guard per cell |
scripts/30_defenses.sql | DDL event-trigger guard + hash-chained append-only sink |
scripts/40_snapshot.sql | catalog snapshot for the RQ2 object-diff |
scripts/run_matrix.sh | orchestrator: builds each cell, measures, writes results/RESULTS_pg<VER>.md |
scripts/teardown.sh | remove containers |
results/RESULTS_pg14.md, results/RESULTS_pg16.md | filled feasibility + defense matrices per version |
results/_evidence_pg*.log, results/_snap_1C_*.txt | raw command/output evidence |
FINDINGS.md | plain-English RQ1–RQ5 verdict, defense×attack matrix, novelty positioning, abstract |
log_statement