سوق العرب | معهد سكيورتى العرب | وظائف خالية

نسخة كاملة: البرمجة الامنة بلغة الجافا
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية.
السلام عليكم ورحمة الله وبركاته :

البرمجة الامنة بلغة الجافا


المقدمة:



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

جافا يقدم بعض المزايا الفريدة لكتابة برامج آمنة، و لكن بالمقابل يوجد فيه بعض العيوب التي تسبب ثغرات أمنية في البرامج.بسبب طبيعة جافا العابر للمنصات (cross-platform) ، و أن واجهة برمجة التطبيقات ( Application Programming Interface API) تقوم على أساس القاسم المشترك الأصغر من الميزات التي تدعمها المنصات التحتية (التي تقام عليها) ، لا يمكن لبرامج الجافا أن توظف التقنيات الأمنية المشتركة التي توظفها لغات البرمجة الأخرى. ومع ذلك فإن جافا، يطبق عددا من التدابير الأمنية.







إغراق ذاكرة التخزين المؤقت (Buffer Overflows):

الانتشار الواسع لاستخدام لغة الC جعلت أخطاء الarray-bounds-checking واحدة من أكثر الأخطاء البرمجية الشائعة ، وبالتالي جعل هجمات إغراق ذاكرة التخزين المؤقت شائعة جدا. هذه الهجمات تتكاثر لأن الأخطاء من هذا النوع يمكن استغلالها عن بعد عبر مدخلات الشبكة ؛ نوع منهم يمكن أن يستخدم لتعديل سجلات تفعيل الوظائف (function activation records)، وبالتالي يسمح للمهاجمين تغيير سير البرنامج وممكن أن تنفيذ شفرة اعتباطية.



جافا حل هذه المسألة الأمنية. لغة جافا لا تدع المبرمج يقوم بarray-bounds-checking بل تقوم بها اللغة ذاتها. مما يسهّل على المبرمج و يأمن البرنامج من هذه النوع من الهجمات.





الوصول إلى الملفات (File Access) :



جافا يمكنها ان تؤدي عمليات أمنية للملفات الأساسية فقط. فإنه يمكن اختبار التطبيق الذي قيد التشغيل في وضعها الأمني الحالي إذا كان لا يمكن القراءة أو الكتابة إلى ملف. من داخل جافا لا يمكنك الوصول إلى أو تغيير أو صلاحيات الملف أو قوائم التحكم بالوصول(Access Control Lists). عمليات إنشاء الملفات لا تسمح لك بتعيين صلاحيات الملف الأبتدائية ، وترك الإذن الافتراضي غير محدد ، وجعلها تعتمد على التنفيذ.

الدلالات اللفظية أو البنية لjava.io.File.createNewFile () تضمن أن يتم إنشاء ملف "atomic" ، والذي يعني عدم وجود عملية أخرى قبل انتهائها. ولا يمكن فتح الملف إذا كان موجودا بالفعل. حتى الآن ليس هناك أي ذكر في وثائق API حول ما إذا كانت وظيفة ستتابع نظام-الملفات المراوغ أثناء إنشاء ملف. يمكن أن نظام-الملفات المراوغ أن يستخدم لخداع برامج متميزة لمعالجة ملفات أخرى غير تلك التي يقصد بها .

يمكن استخدام java.io.File.createTempFile ()لإنشاء الملفات المؤقتة. لا ضمانة صريحة أن الملف المنشأ عن طريق هذه العملية يكون "atomic"،ولكن نظرا لأنه من المرجح أنها ستستخدم java.io.createNewFile () لإنشاء الملف ،و لذا يمكننا تمديد ضمان هذه العملية للأخرى.لا توجد أي ضمانات فيما يتعلق في عشوائية اسم الملف ولا من حيث حجم البحث عن اسم الملف (العدد ممكن من أسماء الملفات المؤقتة). التعليق الوحيد يشير إلى أن أسماء الملفات سوف تشمل خمسة أو أكثر حرفا مولدا داخليا.اسم ملف سهل التخمين قد تسمح للمستخدم الماكر خدعة برنامج الجافا في التلاعب في الملف الخطأ. الموقع الافتراضي للملفات المؤقتة التي تم إنشاؤها يحدده نظام الملكية java.io.tmpdirعلى أنظمة يونيكس القيمة الافتراضية لهذه الخاصية هي "/tmp" أو "/var/tmp"؛على أنظمة Win32 هو " ."C:\tmpفي كلتا الحالتين هذه الملفات (أو الدلائل) معروفه أو عامة و قابلة للقراءة وللكتابة. و عمليةjava.io.File.createTempFile() تتيح لك تمرير الدليل ، حيث أنه ينشئ الملف.في هذا الدليل. فمن المستحسن تمرير دليل خاص و غير قابل للقراءة و الكتابة الا للمسموح لهم لتخزين الملفات المؤقتة.

المنشئات للطبقات(classes) java.io.RandomAccessFile ، java.io.InputStream ، java.io.OutputStream ، java.io.FileReader وjava.io.FileWriter يمكن أن تستخدم أيضا لفتح و إنشاء الملفات ، ولكن إذا حاولت إنشاء ملف لا يوجد شيء يضمن أنك لن تفتح ملف موجود له نفس الاسم ، أو أنه لن تتبع نظام-الملفات المراوغ.









و من الملحوظ أن هذه الواجهات برمجة التطبيقات (APIs) التي تنشئ الملفات عند إنشائها للملف لا تتيح لك تحديد صلاحيات الملف الإبتدائية أو قوائم التحكم بالوصول(Access Control Lists). هذا يترك البرامج المكتوبة بلغة جافا عرضة للهجمات المحلية إذا صلاحيات الملف الافتراضي ليّنة.



التحقق من صحة المدخلات:

أخطاء التحقق المدخلات هي من أكثر نقاط الضعف شيوعاَ مشترك ، لا سيما في التطبيقات التي تحتاج لبرامج أخرى أوالتي تقبل مدخل يتم استخدامه كاسم ملف. جافا لديه اختلاف في المسائل الأمنية في هذا المجال. الطبقات (classes) java.io.StreamTokenizer و java.io.DataInputStream تجعل من السهل على البرامج تحليل المدخلات ولكن ليست مناسبة للعمليات العامه للتحليل أو التصفية. API جافا الأساسية مفتقدة إلى حد بعيد طبقة التعبير العادية (regular-expression class). كبديل يمكنك استخدام حزمة gnu.regexp . في حين أن لا توجد أي طبقة (class) ستعتني بمشاكل التحقق من صحة المدخلات ، يمكن لطبقة التعبير العادية (regular-expression class) يمكن أن تسهل التعامل على هذه العملية بشكل صحيح.



الفائض و الناقص العددي والتحويلات (Numerical Under/Overflows and Conversions):

مبرمجي جافا يجب عليهم أيضا أن ينتبهوا للفائض و الناقص في نوع الأعداد (numerical types). جافا لن تحدث استثناء عند حدوثها. لذا فإنها يمكن أن تؤدي إلى الثغرات الأمنية عند الافتراضات التي أدلى بها عن ما إذا كانت المتغيرا موجبة أم سالبة أو عن حجم هذه المتغيرات. أيضا يجب على المبرمجين أن يأخذوا بعين الاعتبار التحويلات بين الأنواع عددية البدائية ، لأنهمن الممكن ان يكون نتيجة لفقدان المعلومات والأرقام الموجبة تصبح سالبة ، أو العكس. الجانب الإيجابي هو أن برامج المترجم للجافا سيفشل في ترجمة ملف المصدر اذا عثرت على تضييق تحويل البدائية (narrowing primitive conversion) التي لم يتم تحويلها صريحا. لذا يجب الحذر عند القيام بالتحويل الصريح لنوع الأعداد البدائية.





هجمات الموارد :



جافا لا تدعم حدود الموارد. ويمكن خداع برنامج الجافا إلى تخصيص مقدار كبير من الموارد. من الإختراقات التي ممكن ان تنفذ هنا أن يتفقد الهاجم الذاكرة في بيئة وقت-التشغيل) run-time environment memory) باستخدام java.lang.Runtime.freeMemory()، و التراجع اذا أصبحت الذاكرة شحيحة.



التحقق من صحة المنشأ (Origin Validation):



البرامج الآمنة مطلوبة بشدة أن تتحقق من صحة منشأ الطلبات للحصول على خدمات متميزة(privileged serivces). جافا ضعيفة في مجال توثيق المستخدمون المحليون أو الذين عن بعد، كما أنها لا تملك API لاستعلام النظام المحلي لهوية العمليات الخاصة بها، كما أنها لا تدعم أي API والبروتوكولات لمصادقة المستخدمين عن بعد. وأفضل ما يمكنك القيام به هو الاستعلام عنوان الIP البعيد ورقم الموانئ لاتصال شبكة عبر العمليات java.net.Socket.getInetAddress () و java.net.Socket.getPort () .جافا يجب أن تدعم API عامة لأمن المصادقة مثل GSS-API أو SSL. JAAS API الجديدة ممكن أن تحل بعض هذه المشاكل.




ادارة سكيورتي العرب
روابط المرجعيات