FlawOpen

flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023

● Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

MOVEit Transfer: SQL इंजेक्शन और बड़े पैमाने पर डेटा चोरी

CVE-2023-34362, MOVEit Transfer में बिना प्रमाणीकरण SQL injection की कमज़ोरी थी। Mandiant ने 27 मई 2023 से इसका दुरुपयोग देखा, जिसके बाद LEMURLOOT web shell लगाए गए और डेटा चुराया गया।[4], [3]

💡 आसान भाषा में (ELI5)

एक फ़ॉर्म में “फ़ोल्डर नंबर” का फ़ील्ड सोचिए, जिसे कर्मचारी फ़ाइलिंग सिस्टम को भेजे जाने वाले निर्देश में सीधे कॉपी कर देता है। अगर यह फ़ील्ड केवल फ़ोल्डर बताने के बजाय निर्देश बदल सकता है, तो फ़ॉर्म भरने वाला सिस्टम से अपेक्षा से अधिक काम करा सकता है। SQL injection भी यही सीमा पार करता है: अविश्वसनीय इनपुट को मान के बजाय SQL syntax समझा जाता है।[5]

इस पेज के मुख्य शब्द

SQL इंजेक्शन (CWE-89)
डेटाबेस क्वेरी में जोड़ा गया इनपुट मान की तरह बरते जाने के बजाय क्वेरी का काम ही बदल देता है।[5]
मैनेज्ड फ़ाइल ट्रांसफ़र (MFT)
वह सॉफ़्टवेयर जिससे संगठन साझेदारों के साथ बड़ी या संवेदनशील फ़ाइलें बदलते हैं। एक ही सर्वर पर कई संगठनों का डेटा हो सकता है।[3]
वेब शेल
एक स्क्रिप्ट जिसे हमलावर पहुँच बनाए रखने के लिए वेब सर्वर पर रख देता है। Mandiant ने यहाँ इस्तेमाल हुई स्क्रिप्ट को LEMURLOOT नाम दिया।[3]
पैरामीटराइज़्ड क्वेरी
ऐसी क्वेरी जिसके मान उसके टेक्स्ट से अलग भेजे जाते हैं, ताकि डेटाबेस कभी डेटा को SQL की तरह न पढ़े।[5]
प्रभावित और सुधारे गए संस्करण
Progress के अनुसार संबंधित शाखाओं में 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5 और 2023.0.1 से पुराने संस्करण प्रभावित हैं; सूचीबद्ध संस्करणों में सुधार शामिल है। अपनी शाखा और वर्तमान अपग्रेड पथ Progress की सलाह में जाँचें।[1]

फ्रेमवर्क मैपिंग

घटना का समयक्रम (Timeline)

2023-05-27

Mandiant ने MOVEit Transfer के दुरुपयोग का सबसे पुराना देखा गया प्रमाण 27 मई 2023 का बताया।[3]

2023-05-31

Progress कमज़ोरी का खुलासा करता है और ग्राहकों से पैच लगने तक HTTP और HTTPS ट्रैफ़िक बंद करने को कहता है।[1]

2023-06-02

CISA, CVE-2023-34362 को Known Exploited Vulnerabilities सूची में जोड़ता है।[9]

2023-06-07

CISA और FBI संयुक्त चेतावनी AA23-158A प्रकाशित करते हैं और अभियान को CL0P रैनसमवेयर गतिविधि बताते हैं। बाद में Mandiant समानताओं के आधार पर अपनी attribution अपडेट कर UNC4857 को FIN11 में मिला देता है।[2], [3]

हमले का चरण-दर-चरण प्रवाह

चरण 1

बिना प्रमाणीकरण का अनुरोध

Mandiant ने LEMURLOOT दिखने से पहले MOVEit Transfer के guestaccess.aspx को भेजे गए गढ़े हुए POST अनुरोध देखे; इसके लिए सामान्य उपयोगकर्ता लॉगिन आवश्यक नहीं था।[3]

चरण 2

इनपुट क्वेरी का अर्थ बदलता है

अनुरोध एक कमज़ोर SQL ऑपरेशन तक पहुँचा। CISA ने इसे बिना प्रमाणीकरण डेटाबेस तक पहुँच देने वाली कमज़ोरी बताया; इस्तेमाल किए गए डेटाबेस इंजन के अनुसार जानकारी निकालना या डेटा बदलना/मिटाना भी संभव था।[2], [5]

चरण 3

वेब शेल लगाया जाता है

दुरुपयोग के बाद Mandiant ने LEMURLOOT web shell देखा। यह फ़ाइलें सूचीबद्ध और प्राप्त कर सकता था तथा एक नामित एप्लिकेशन उपयोगकर्ता को बदल सकता था; स्रोत सामान्य प्रशासनिक नियंत्रण मिलने की पुष्टि नहीं करते।[3]

चरण 4

फ़ाइलें बड़े पैमाने पर चोरी होती हैं

Mandiant ने बड़े पैमाने पर फ़ाइल चोरी देखी। CISA और FBI ने व्यापक अभियान को CL0P रैनसमवेयर गतिविधि बताया; Mandiant की बाद की attribution ने इसे FIN11 से जोड़ा।[2], [3]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह उदाहरण के लिए C# कोड है, MOVEit का सोर्स कोड नहीं। मज़बूत मेथड पहचानकर्ता को कॉलम में मौजूद वास्तविक प्रकार में बदलता है और बाक़ी सब अस्वीकार करता है, फिर उसे टाइप वाले पैरामीटर के रूप में भेजता है, ताकि मान SQL टेक्स्ट का हिस्सा न बने। दोनों में से कोई भी नियंत्रण अकेले यह इंजेक्शन रोकता है; साथ में वे क्वेरी चलने से पहले ग़लत पहचानकर्ताओं को भी अस्वीकार करते हैं।[5]

कमज़ोर कार्यान्वयन
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        // query text और request data को जोड़ दिया जाता है, इसलिए database
        // यह नहीं पहचान पाता कि developer किस हिस्से को data मानना चाहता था।
        string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
        var cmd = new SqlCommand(sql, conn);
        return cmd.ExecuteReader();
    }
}
सुरक्षित और सुदृढ़ फ़िक्स
using System;
using System.Data;
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        if (!long.TryParse(folderId, out long id) || id <= 0)
            throw new ArgumentException("folderId must be a positive integer");

        // मान को query text से अलग, typed parameter के रूप में भेजा जाता है।
        var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
        cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
        return cmd.ExecuteReader();
    }
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत