دورة معهد ماساتشوستس للتكنولوجيا "أمن أنظمة الكمبيوتر". المحاضرة 3: تجاوزات العازلة: المآثر والحماية ، الجزء 3

معهد ماساتشوستس للتكنولوجيا. محاضرة رقم 6.858. "أمن أنظمة الكمبيوتر." نيكولاي زيلدوفيتش ، جيمس ميكنز. 2014 سنة


أمان أنظمة الكمبيوتر هي دورة حول تطوير وتنفيذ أنظمة الكمبيوتر الآمنة. تغطي المحاضرات نماذج التهديد ، والهجمات التي تهدد الأمن ، وتقنيات الأمان بناءً على العمل العلمي الحديث. تشمل الموضوعات أمان نظام التشغيل (OS) ، والميزات ، وإدارة تدفق المعلومات ، وأمان اللغة ، وبروتوكولات الشبكة ، وأمان الأجهزة ، وأمان تطبيقات الويب.

المحاضرة 1: "مقدمة: نماذج التهديد" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 2: "السيطرة على هجمات القراصنة" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 3: "تجاوزات العازلة: المآثر والحماية" الجزء 1 / الجزء 2 / الجزء 3

يمكنك استخدام تقنية تخمين "الكناري" لأغراضك الخاصة لمعرفة وجود "ضعيف" ، من حيث الاختيار ، البتات. أي ، إذا خمنت بشكل صحيح ، سيذهب الخادم إلى إعادة التشغيل ، وهذا سيكون بمثابة إشارة لك أن من السهل جدًا تخمين القيمة المحددة. وبالتالي ، فمن الممكن هزيمة "الكناري" العشوائية ، على افتراض أنه بعد إعادة تشغيل الخادم لن تتغير قيمتها. يمكنك أيضًا استخدام الأدوات لتنفيذ تسلسل مرتبط بالعديد من الهجمات.

بعد ذلك ، سنلقي نظرة على طريقة أكثر إنتاجية يمكنك من خلالها استخدام كل هذه الطرق للتغلب على منع تنفيذ البيانات ومساحات العناوين العشوائية و "الكناري".

دعونا ننتقل إلى معماريات 64 بت بدلاً من معماريات 32 بت. فالأول أكثر ملاءمة للعشوائية ، لذا يمنحك "فرصة" أكثر للدفاع عن نفسك ضد المخترق. وتبدو هذه الأنظمة أكثر إثارة للاهتمام من حيث تشكيل الهجوم.

كما تم النظر في هذا النوع من معمارية 64 بت من وجهة نظر BROP ، البرمجة "العمياء" الموجهة عكسيًا. من أجل البساطة ، نفترض أن الاختلاف الوحيد بين أجهزة 64 بت و 32 بت هو أنه على جهاز 64 بت ، يتم تمرير الوسيطات إلى التسجيلات ، وفي جهاز 32 بت ، إلى المكدس.



عندما تبدأ إحدى الوظائف في التنفيذ ، يُؤخذ "للنظر" في سجلات معينة للعثور على مكان الحجج.

الآن دعونا نصل إلى جوهر محاضرة اليوم - ما هي البرمجة العمياء الموجهة نحو العودة ، أو BROP . أول شيء سنفعله هو العثور على أداة توقف. تذكر أنه عندما نقول "أداة" ، فإننا نعني بشكل أساسي عناوين الإرجاع. يتم تحديد الأداة باستخدام عنوان المرسل وعنوان البدء الخاص بتسلسل التعليمات الذي نريد الانتقال إليه. إذن ما هي أداة التوقف؟

بشكل أساسي ، هو عنوان الإرجاع إلى مكان ما في الرمز ، ومع ذلك ، إذا قفزت إلى هناك ، فقم بإيقاف البرنامج مؤقتًا ، ولكن لا تتسبب في تعطل البرنامج. هذا هو السبب في أن هذا يسمى أداة التوقف.

يمكنك القفز إلى مكان ما في الرمز ، والذي يبدأ بعد ذلك مكالمة نظام النوم ، أو يتوقف مؤقتًا ، أو شيء من هذا القبيل. من الممكن أن "يعلق" البرنامج بطريقة أو بأخرى في حلقة لا نهائية إذا قفزت إلى هذا المكان. لا يهم سبب حدوث التوقف ، ولكن يمكنك تخيل بعض السيناريوهات التي قد تؤدي إليه.

ما هو استخدام أداة التوقف؟

بمجرد أن يتمكن المهاجم من هزيمة "الكناري" باستخدام التقنية التفاعلية لتخمين البتات ، يمكنه البدء في إعادة كتابة عنوان العودة ، وإعادة العنوان ، والبدء في "تلمس" أداة التوقف. لاحظ أن معظم العناوين العشوائية التي يمكنك وضعها على المكدس من المحتمل أن تتسبب ببساطة في تعطل الخادم. مرة أخرى ، هذه الرسالة لك ، أيها المهاجم ، هذه إشارة إلى أن ما وجدته ليس أداة توقف. لأنه عندما يتعطل الخادم ، يتم إغلاق مقبسك ، وأنت كمهاجم ، تفهم أنك لم تحصل على أداة التوقف. ولكن إذا خمنت شيئًا ومازال المقبس بعد ذلك مفتوحًا لفترة من الوقت ، فتعتقد: "نعم ، لقد وجدت أداة التوقف هذه!" لذا فإن الفكرة الأساسية للخطوة الأولى هي العثور على أداة التوقف هذه.



الخطوة الثانية هي أنك تريد العثور على الأدوات التي تحذف إدخالات المكدس باستخدام الأمر pop . لذلك ، يجب عليك استخدام هذا التسلسل من التعليمات المصممة بعناية لمعرفة متى تحصل على واحدة من هذه الأدوات المكدسة. سيتكون هذا التسلسل من عنوان المسبار لعنوان المسبار وعنوان التوقف لعنوان التوقف وعنوان فشل النظام لعنوان التعطل .

وبالتالي ، فإن عنوان المسبار هو ما سنضعه على المكدس. سيكون هذا عنوان الأداة المحتملة لمسح المكدس ، عنوان التوقف - هذا ما اعتبرناه في الخطوة الأولى ، وهذا هو عنوان أداة التوقف. ثم سيكون عنوان التعطل ببساطة عنوان الرمز غير القابل للتنفيذ. هنا يمكنك ببساطة وضع العنوان صفر (0 × 0) ، وإذا قمت بتطبيق وظيفة ret على هذا العنوان وحاولت تنفيذ الرمز هناك ، سيؤدي ذلك إلى تعطل البرنامج.



حتى نتمكن من استخدام هذه الأنواع من العناوين لمعرفة أين تقوم هذه الأدوات بتنظيف مكدس فرقعة مكدس .

سأعطي مثالا بسيطا. لنفترض أن لدينا مثالين مختلفين للمسبار ، فخ الاعتراض ومصيدة التوقف . لنفترض ، بمساعدة المسبار ، أننا سوف "نفحص" بعض العناوين ، لنفترض أنه يبدأ بـ 4 وينتهي بثمانية: 0x4 ... 8 ، وخلفه العنوان التالي للنموذج 0x4 ... C. افتراضيًا ، يمكننا أن نفترض أن أحد هذين العنوانين هو عنوان أداة مكدس التفرقع .

سيحصل مصيدة الاعتراض على صفر من العناوين 0 × 0 و 0 × 0 ، ويسمح لإيقاف الأداة الذكية بإيقاف عناوين عشوائية مثل 0xS ... 0xS ... ، لا يهم. تشير أداة التوقف هذه إلى رمز النوم (10) ، مما يتسبب في توقف البرنامج مؤقتًا.

لنبدأ بعملية المسبار ، التي تمسح بعض التسجيلات وتعود في التسلسل التالي: pop rax؛ تراجع . ماذا سيحدث؟ عندما ينتقل النظام إلى هذا العنوان ، سينتقل مؤشر المكدس إلى منتصف الأداة. ما الذي ستفعله الأداة هنا؟ حق ، تنفيذ عملية راب بوب .



ثم يتبع ret ، الذي سينقل الوظيفة إلى السطر العلوي من الأداة ، أي أن يتوقف ، وستتوقف الوظيفة دون تعطل البرنامج بأكمله. لذلك ، باستخدام هذه الأداة ، يمكن للمهاجم أن يقول أن عنوان المسبار ينتمي إلى إحدى هذه الوظائف ، والتي تمسح المكدس ، لأن اتصال عميل الخادم مفتوح.

الآن لنفترض أن عنوان المسبار الثاني أشار إلى شيء مثل xor rax ، rax ، ret لبعض التسجيل.



فماذا يحدث إذا حاولنا القفز إلى هذه الأداة؟ لاحظ أنه لا يمسح أي شيء على المكدس ، فهو يغير فقط محتويات السجلات. لذا ، سنقوم بالعودة إلى العنوان 0 × 0 الموجود أعلاه. وهذا سوف يتسبب في تعطل النظام. سيتم قطع اتصال العميل بالخادم ، وسيفهم المخترق أن هذه ليست أداة لمسح ظهور مكدس المكدس .

وبهذه الطريقة يمكنك استخدام سلسلة أكثر اعتراضًا من الفخاخ وإيقاف الأدوات ، على سبيل المثال يمكنك مسح عنصرين على المكدس. للقيام بذلك ، تحتاج فقط إلى وضع تعليمات فخ أخرى هنا ، وإذا لم تمسح هذه الأداة عنصرين ، فستجد نفسك في أحد هذه الفخاخ ، وسيتوقف تنفيذ التعليمات البرمجية. تصف مواد المحاضرة شيئًا يسمى أداة BROP ، وهو أمر مفيد إذا كنت لا ترغب في العودة إلى البرمجة. ولكن اليوم سأخبرك أيضًا كيف يمكنك استخدام أدوات البوب البسيطة هذه لشن هجوم مماثل. بمجرد أن تفهم ذلك ، سيكون التعامل مع أداة BROP أسهل بكثير.

ولكن هل يفهمون جميعًا كيف يمكننا استخدام وظيفة المسبار لهذه الأدوات؟ لنفترض أنك عثرت على موقع مقتطفات الشفرة التي تسمح لك بمسح المكدس باستخدام وظيفة البوب ، وإزالة عنصر واحد منها ، ولكنك في الحقيقة لا تعرف في أي تسجيل ستعمل وظيفة البوب هذه. أنت تعرف أنها مستعدة بالفعل للتنفيذ. ولكن عليك أن تعرف في أي تسجيل ستعمل أدوات البوب هذه ، لأنه في بنية 64 بت ، يسجل التحكم حيث توجد وسيطات الوظيفة التي تريد الاتصال بها.

وبالتالي ، فإن هدفنا هو أن نكون قادرين على إنشاء أدوات تسمح لنا بحذف القيم التي وضعناها في تسجيلات مكدس معينة ، وفي النهاية نبدأ استدعاء نظام استدعاء النظام ، مما يسمح لنا بعمل شيء سيئ.
لذا نحتاج الآن إلى تحديد السجلات التي تستخدمها أدوات البوب .



للقيام بذلك ، يمكننا الاستفادة من استدعاء نظام الإيقاف المؤقت. إذا تم إيقاف استدعاء النظام مؤقتًا ، فسيتم تعليق تنفيذ البرنامج ، ولا يقبل أي وسيطات. وهذا يعني أن النظام يتجاهل كل شيء في السجلات.

في الواقع ، للعثور على تعليمات الإيقاف المؤقت التي ننفذها ، يمكنك ربط جميع أدوات البوب هذه حتى نتمكن من وضعها جميعًا على المكدس ، وبين كل منها نقوم بإدراج رقم syscall للإيقاف المؤقت. ثم سنرى إذا كان بإمكاننا "تعليق" البرنامج بهذه الطريقة. دعني أعطيك مثالا ملموسا.

هنا ، نضع أداة في شريط عنوان المرسل الذي يمسح تسجيلات RDI ويطبق وظيفة ret عليها. فوقها سنضع رقم syscall للإيقاف المؤقت.

افترض أن لدينا أداة أخرى موجودة أعلاه تقوم بتنفيذ وظيفة البوب في سجل آخر ، على سبيل المثال RSI ، ثم إعادة. ثم نضع رقم syscall مرة أخرى لإيقافه مؤقتًا. ونفعل ذلك لجميع الأدوات التي وجدناها ، ثم ننتهي في الجزء العلوي من المكدس بالعنوان المفترض لـ syscall .



تذكر مرة أخرى كيف تستخدم مكالمات النظام هذه. يجب عليك وضع رقم syscall في سجل RAX ، ثم استدعاء وظيفة libc syscall ، التي على وشك إجراء مكالمة النظام المطلوبة.

فماذا يحدث عندما ننفذ هذا الرمز؟ سنأتي هنا ، إلى سطر العنوان السابق ، سننتقل إلى عنوان هذه الأداة ، وتجدر الإشارة إلى أن المهاجم يعرف أن هذه الأداة ، الموجودة على اليمين ، تزيل شيئًا من المكدس ، ولكنها لا تعرف حتى الآن أي سجل موجود فيه.

لذا ، إذا قفزنا إلى إعادة العنوان ، فماذا يحدث؟ سيستخدم وظيفة البوب لإيقاف syscall مؤقتًا ، في بعض السجلات التي لا يعرفها المهاجم ، ثم سنستمر في تسلق سلسلة العمليات هذه فوق المكدس.

عند القيام بذلك ، نأمل أن تؤدي إحدى هذه الأدوات وظيفة البوب لرقم syscall في سجل RAX المقابل. لذا ، بحلول الوقت الذي نصل فيه إلى هنا ، فوق المكدس ، في طريق "العبث" بجميع السجلات التي لها رقم تسجيل مؤقت لإيقافها مؤقتًا ، نأمل أن لا يزال لدينا سجل واحد ، والذي يجب أن يكون صحيحًا. لأنه إذا قامت إحدى أدواتنا بهذا ، وبعد ذلك ، عند القيام بالتقاعد ، بعد فترة من الوقت سنعود هنا ، في الجزء العلوي من المكدس ، فسوف نتوقف مؤقتًا. مرة أخرى ، وقفة بمثابة إشارة إلى المهاجم. لأنه إذا كان هذا العنوان المفترض لـ syscall غير صحيح ، فسوف يفشل البرنامج.

إذن ما الذي يسمح لنا بالقيام بهذه المرحلة من الهجوم؟ ما زلنا لا نعرف في أي تسجيلات توجد أدوات البوب الموجودة ، ولكننا نعلم أن أحدها سيحرر RAX الذي نريد التحكم فيه. وربما نعرف عنوان syscall ، لأننا تمكنا من إيقاف النظام مؤقتًا.

بمجرد القيام بذلك ، يمكننا التحقق من هذه الأدوات واحدة تلو الأخرى ومعرفة أي منها يضع النظام في وضع الإيقاف المؤقت. وبعبارة أخرى ، قمنا بقطع كل شيء بين سطر عنوان ret وأعلى المكدس للانتقال مباشرة إلى syscall . سوف نتحقق مما إذا كان هناك توقف مؤقت أو فشل في النظام. في حالة حدوث فشل ، نحدد الأداة التي تسببت في حدوثها ، على سبيل المثال ، إنها في النهاية على اليمين ، وهذا هو pop rdi . تخلص منه وجرب التالي. ضع هنا في السطر أعلاه عنوان إعادة العنوان الحقيقي لل سيسكال . هل يمكننا إيقاف البرنامج مؤقتًا؟ نعم ، هذا يعني أننا تعلمنا أن أداة البوب هذه يجب أن تحرر RAX . هل هذا واضح؟

الجمهور: إذن ، طريقة لتخمين عنوان مكالمة النظام هي مجرد تحويل أعمى للأدوات؟

البروفيسور: نعم إنه كذلك ، وهناك طرق لتحسين هذه العملية في مواد المحاضرة عند استخدام ملحق ملف PLT وأشياء مماثلة. من خلال الهجوم البسيط الذي وصفته ، فأنت في الحقيقة تقوم فقط بلصق العنوان هنا ، وتأكد من أنه تسبب في توقف مؤقت أم لا. نتيجة الاختبار ، اكتشفنا موقع syscall . سنكتشف مكان وجود التعليمات التي تنفذ Pop RAX . نحتاج أيضًا إلى أدوات تقوم بتنفيذ pop في بعض السجلات الأخرى أيضًا. يمكنك إجراء اختبارات مماثلة لهم. لذلك ، بدلاً من إيقاف رقم syscall مؤقتًا ، استخدم الدفع لبعض الأوامر الأخرى التي ، على سبيل المثال ، تستخدم وسيطتي RAX و RDI .

وبالتالي ، يمكنك استخدام حقيقة أنه بالنسبة لأي مجموعة معينة من السجلات التي تريد التحكم فيها ، هناك نوع من المكالمة التي ستعطيك للمهاجم إشارة لمعرفة ما إذا كنت قد كسرته بنجاح أم لا. لذلك ، في نهاية هذه المرحلة ، سيكون لديك عنوان syscall وعنوان كومة الأداة ، والذي يسمح لك بتسجيل السجلات العشوائية.

والآن دعنا ننتقل إلى الخطوة الرابعة ، والتي ستسمى الكتابة - التسجيل. الخطوة الرابعة هي تسجيل مكالمة النظام. للاتصال بالكتابة ، نحتاج إلى الأدوات التالية:

pop rdi ، متقاعد ؛
البوب ​​rsi ، ret ؛
البوب ​​rdx ، ret ؛
البوب ​​راكس ، متقاعد ؛
تعليق



كيف يتم استخدام هذه السجلات بواسطة استدعاء النظام؟ الأول هو المقبس ، أو بشكل أعم ، واصف الملف الذي ستنقله للكتابة. والثاني هو المخزن المؤقت ، والثالث هو طول هذا المخزن المؤقت ، والرابع هو رقم استدعاء النظام والخامس هو syscall نفسه.

لذا ، إذا وجدنا كل هذه الأدوات ، فيمكننا التحكم في القيم المضمنة في الوسيطات ، والتي يتم وضعها بدورها في هذه السجلات ، لأننا "دفعنا" فقط إلى المكدس.

ما يجب أن يكون مقبس؟ هنا علينا أن نخمن قليلاً. يمكنك الاستفادة من حقيقة أن Linux يحد من عدد الاتصالات المفتوحة المتزامنة لملف يصل إلى قيمة 2024. وأيضًا يجب أن يكون الحد الأدنى لجميع الاتصالات المتاحة.

أتساءل ما الذي سنقوم بإدراجه في مؤشر المخزن المؤقت؟ هذا صحيح ، نحن عازمون على استخدام جزء النص من البرنامج هنا ، سنضعه في مؤشر في مكان ما في رمز البرنامج. هذا يسمح لنا بقراءة الملف الثنائي خارج الذاكرة باستخدام استدعاء العميل الصحيح من المقبس. ثم يمكن للمهاجم أخذ هذا الملف الثنائي ، وتحليله في وضع عدم الاتصال بالإنترنت ، باستخدام GDB أو أداة أخرى لمعرفة مكان كل هذا. يعرف المهاجم أنه في كل مرة "يتعطل" الخادم ، سيتم تخزين نفس المجموعة العشوائية من الأشياء فيه. حتى الآن بعد أن يتمكن المهاجم من معرفة عناوين وإزاحات محتويات المكدس ، يمكنه مهاجمة هذه الأدوات مباشرة. يمكنه مهاجمة نقاط الضعف الأخرى بشكل مباشر ، ومعرفة كيفية فتح القشرة وما شابه. بعبارة أخرى ، في المكان الذي قدمت فيه ثنائيًا مع القراصنة ، هُزمت.

هذه هي الطريقة التي يعمل بها هجوم BROP . كما قلت ، في مواد المحاضرة ، هناك العديد من الطرق لتحسين هذه العمليات ، ولكن أولاً تحتاج إلى فهم المادة الرئيسية ، وإلا يفقد التحسين معناها. لذلك ، يمكنك التحدث معي حول التحسين بشكل فردي أو بعد الفصل.

في الوقت الحالي ، يكفي أن نقول أن هذه هي أساسيات كيفية شن هجوم BROP . يجب عليك العثور على أداة الإيقاف ، والعثور على تلك الأدوات التي تؤدي وظيفة إدخالات مكدس البوب ، ومعرفة التسجيلات التي تقع فيها ، ومكان وجود syscall ، ثم بدء الكتابة ، بناءً على المعلومات التي تم الحصول عليها.



لذا ، راجع الموضوع بسرعة ، كيف يمكنك الدفاع ضد BROP ؟ لذا فإن أكثر شيء واضح لديك هو إعادة التوزيع العشوائي. نظرًا لأن حقيقة أن الخوادم "المتساقطة" لا تتكاثر ، فلا تنشئ إصدارات عشوائية من نفسها ، وتعمل كإشارة تمنح المهاجم الفرصة لاختبار الفرضيات المختلفة حول كيفية عمل البرامج.

إحدى الطرق السهلة لحماية نفسك هي التأكد من تنفيذ exec بدلاً من الشوكة عند إحياء العملية. لأنه عند تنفيذ العملية ، تقوم بإنشاء مساحة عشوائية جديدة تمامًا ، على الأقل هذا ما يحدث على Linux. في Linux ، عندما تقوم بالترجمة باستخدام PIE ، تنفيذ الموقف المستقل ، وهو ملف تنفيذي مستقل عن الموقع ، عندما تستخدم exec ، فإنك تحصل فقط على مساحة عنوان عشوائي جديدة.

الطريقة الثانية هي ببساطة استخدام Windows ، لأن نظام التشغيل هذا لا يحتوي بشكل أساسي على وظيفة شوكة . هذا يعني أنه عند إحياء خادم على نظام التشغيل Windows ، سيكون له دائمًا مساحة عنوان عشوائية جديدة.

سأل شخص ما هنا ماذا سيحدث إذا لم يقطع اتصاله بعد عطل في الخادم؟ لذلك ، إذا حدث "تعطل" هذا الخطأ بطريقة ما أثناء حدوث تعطل في الخادم وأبقينا الاتصال مفتوحًا لبعض الوقت ، فيمكننا إرباك المهاجم حتى لا يتلقى إشارة حول الفشل ويعتقد أنه وجد العنوان الصحيح.

في هذه الحالة ، سيتحول هجوم BROP إلى هجوم DOS . لأنك حصلت للتو على جميع عمليات الزومبي المحتملة الموجودة. إنها عديمة الفائدة ، ولكن لا يمكنك السماح لها بالذهاب إلى أبعد من ذلك ، وإلا سيكون عليك حذف هذه المعلومات.

شيء آخر قد تفكر فيه هو إجراء فحص الحدود الذي تحدثنا عنه من قبل. تقول مواد المحاضرة أن هذه الطريقة غير منتجة ، لأنها أكثر تكلفة مرتين ، ولكن لا يزال بإمكانك استخدامها.

هذه هي طريقة عمل BROP . بالنسبة للواجب المنزلي ، يتم طرح سؤال أكثر دقة هناك: ماذا لو كنت تستخدم تجزئة الوقت الحالي؟ بمعنى ، المدة الزمنية التي تقوم خلالها بإعادة تشغيل البرنامج. هل هذا يكفي لمنع هذا النوع من الهجمات؟ لاحظ أن التجزئة لا يزودك بشكل سحري بتات الإنتروبي إذا كان من السهل التنبؤ بالبيانات التي تدخلها في التجزئة. إذا كان الهاش يحتوي على بلايين البتات ، فهذا لا يهم. ولكن إذا كان لديك فقط معنيين هناك ، فإن المهاجم سيخمنها فقط. بالطبع ، يعد استخدام تجزئة الوقت العشوائي أفضل من عدم استخدام أي شيء للحماية من المخترق ، ولكن هذا لن يوفر لك الأمان الذي يجب الاعتماد عليه.


النسخة الكاملة من الدورة متاحة هنا .

شكرا لك على البقاء معنا. هل تحب مقالاتنا؟ هل تريد رؤية مواد أكثر إثارة للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية به لأصدقائك ، خصم 30 ٪ لمستخدمي Habr على نظير فريد من خوادم مستوى الدخول التي اخترعناها لك: الحقيقة الكاملة حول VPS (KVM) E5-2650 v4 (6 نوى) 10GB DDR4 240GB SSD 1Gbps من 20 $ أو كيفية تقسيم الخادم؟ (تتوفر الخيارات مع RAID1 و RAID10 ، حتى 24 مركزًا وحتى 40 جيجابايت DDR4).

ديل R730xd أرخص مرتين؟ فقط لدينا 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV من 249 دولارًا في هولندا والولايات المتحدة! اقرأ عن كيفية بناء مبنى البنية التحتية الطبقة باستخدام خوادم Dell R730xd E5-2650 v4 بتكلفة 9000 يورو مقابل سنت واحد؟

Source: https://habr.com/ru/post/ar418099/


All Articles