برنامه‌نويسی امن با زبان جاوا – ارتقای حق دسترسی

برنامه‌نويسی امن با زبان جاوا – ارتقای حق دسترسی

تاریخ ایجاد

IRCAR201308183
تاريخ: 28/05/92

روز به روز بر تعداد گزارش‌هايي كه در مورد آسيب‌پذيري در نرم‌افزارها و يا سوءاستفاده از آنها منتشر مي‌شود، افزوده مي‌گردد و بسياري از اين گزارش‌ها منجر به هشدارهاي امنيتي فني مي‌شوند. براي برطرف ساختن اين تهديد كه بر روي دولت‌ها، شركت‌ها، موسسات آموزشي و افراد تأثير مي‌گذارد، لازم است سيستم‌هايي فارغ از آسيب‌پذيري‌هاي نرم‌افزاري طراحي و ايجاد شوند.
بخش عمده‌اي از آسيب‌پذيري‌هاي نرم‌افزارها بر اثر خطاهاي برنامه‌نويسي ايحاد مي‌شوند. براي مثال، 64 درصد آسيب‌پذيري‌هايي كه در سال 2004 شناخته شده‌اند مربوط به خطاهاي برنامه‌نويسي بوده‌اند.
زبان برنامه‌نويسي جاوا، زبان نسبتاً امني شناخته مي‌شود، چرا كه براي مثال اين زبان امكاني را براي دستكاري اشاره‌گرها به صورت صريح ندارد، حدود رشته‌ها و آرايه‌ها به صورت خودكار بررسي مي‌شوند، تلاش براي ارجاع به اشاره‌گر تهي ناكام مي‌ماند، عمليات‌ رياضي و تبديل انواع به خوبي تعريف شده و مستقل از پلت‌فرم هستند، همچنين امكان bytecode verifier تضمين مي‌كند كه اين بررسي‌ها همواره انجام مي‌شوند. علاوه بر اين، جاوا داراي مكانيزم‌هاي جامع امنيتي است به طوري كه مي‌تواند دسترسي به فايل‌ها، سوكت‌ها و ديگر منابع حساس را كنترل نمايد.
با اين وجود، امنيت برنامه‌هاي جاوا در شرايطي به خطر مي‌افتد. يكي از اين شرايط ارتقاي حق دسترسي برنامه ها است كه در مقاله حاضر شرح داده مي شود.

اصل حداقل حق دسترسي
بر اساس اصل حداقل حق دسترسي، هر برنامه و هر كاربري كه به سيستم دسترسي دارند بايد از حداقل دسترسي هايي كه براي كامل كردن وظيفه شان ضروري است، استفاده نمايند [Saltzer 1974, Saltzer 1975]. اجراي برنامه ها با حداقل حق دسترسي خطر سوءاستفاده را در صورت كشف آسيب پذيري در برنامه كاهش مي دهد. اين اصل مي تواند به روش هاي مختلفي در زبان برنامه نويسي جاوا مورد استفاده قرار گيرد. به طور معمول هر سيستم داراي اجزاي مختلفي است كه اكثر آنها نيازمند يك مجموعه از دسترسي هاي پايه هستند، اما تعداد كمي از اجزا نيازمند حق دسترسي بالاتري نسبت به ديگران هستند كه اصطلاحاً گفته مي شود اين اجزا با حق دسترسي ارتقا يافته اجرا مي شوند. تنها برنامه هاي مربوط به اين اجزا امضا يا علامت گذاري مي شوند و ديگر برنامه هايي كه نيازمند حق دسترسي ارتقا يافته نيستند نبايد امضا شوند (بر اساس قانون ENV00-J).
سياست امنيتي كه تعريف كننده مجموعه مجوزها است بايد تا حد امكان محدود باشد. زماني كه يك برنامه جاوا با يك مدير امنيتي اجرا مي شود، فايل سياست امنيتي پيش فرض مجوزهاي حداقل را به آن اختصاص مي دهد. با اين وجود، قابليت انعطاف مدل امنيتي جاوا به كاربر اجازه مي دهد تا مجوزهاي اضافه تري را از طريق تعريف يك سياست امنيتي دلخواه به برنامه ها اختصاص دهد.
قوانيني كه مرتبط با اصل حداقل حق دسترسي هستند عبارتند از:

  • قانون ENV03-J – تركيب خطرناكي از مجوزها را اعطا نكنيد.
  • قانون SEC00-J – اجازه ندهيد بلوك هاي ارتقا يافته اطلاعات حساس را در يك محدوده قابل اعتماد افشا نمايند.
  • قانون SEC01-J – اجازه ورود متغيرهاي مشكوك را به بلوك هاي ارتقا يافته ندهيد.

قوانين فوق در مقاله هاي آتي به تفصيل شرح داده خواند شد.
برنامه هايي كه نيازمند علامت گذاري هستند مي توانند همراه با كلاس هاي علامت گذاري نشده در يك فايل JAR وجود داشته باشند. اما پيشنهاد مي شود همه برنامه هاي ارتقا يافته با يكديگر بسته بندي شوند (بر اساس قانون ENV01-J).
عمليات هاي ارتقا يافته بايد به كوچكترين مجموعه بلوك هاي برنامه كه نيازمند آن ارتقا هستند، محدود شوند. مكانيزم AccessController در جاوا تنها به بخش هاي معيني از برنامه اجازه مي دهد تا درخواست ارتقاي حق دسترسي كنند. مكانيزم AccessController به طور موثر با سياست امنيتي در تعامل است.
يك كلاس براي محافظت از حق دسترسي هاي خود، برنامه هاي ارتقا يافته را در يك بلوك doPrivileged() اجرا مي كند. از آنجايي كه كاربران از جزئيات مدل امنيتي آگاه نيستند و همچنين نمي توانند سياست هاي امنيتي را به صورت مناسب با نيازمندي هاي خود تطبيق دهند، كدهاي ارتقا يافته اي كه در بلوك هاي doPrivileged() قرار دارند بايد در كمترين حد قرار داشته باشند تا از بروز آسيب پذيري هاي امنيتي اجتناب شود.

مدير امنيت (Security Manager)
كلاس SecurityManager يك سياست امنيتي را براي برنامه جاوا تعريف مي كند. اين سياست عمليات هايي را كه ناامن يا حساس هستند، مشخص مي نمايد. هر عملياتي كه توسط سياست امنيتي تأييد نشده باشد منجر به ايجاد يك استثناي امنيتي يا SecurityException مي شود. برنامه مي تواند از مدير امنيت خود براي شناسايي عمليات هاي مجاز پرس و جو نمايد. مدير امنيت همچنين مي تواند براي كنترل عمليات هايي كه API هاي معتمد مي توانند انجام دهند مورد استفاده قرار گيرد. براي مثال يك برنامه نامطمئن نبايد اجازه دسترسي به كلاس هاي سيستمي را داشته باشد و به همين دليل بايد مجوزهاي خاصي به آن اعطا شود كه از دسترسي به كلاس هاي معتمد ممانعت به عمل آورد. مجوز accessClassInPackage اين قابليت را فراهم مي نمايد.
چندين مدير امنيت از پيش تعريف شده براي انواع مختلفي از برنامه هاي كاربردي وجود دارد. براي مثال مدير امنيت اپلت جهت مديريت همه اپلت هاي جاوا مورد استفاده قرار مي گيرد. اين مدير امنيت همه مجوزها به جز ضروري ترين آنها را براي اپلت ها ممنوع مي كند. اين مدير امنيت براي جلوگيري از تغييرات غير عمدي سيستم، نشت اطلاعات و جعل هويت طراحي شده است.
استفاده از مدير امنيت محدود به بخش كاربري نمي شود. وب سرورهايي همچون Tomcat و Websphere از اين امكان براي ايزوله كردن تروجان ها و برنامه هاي خرابكار JSP و همچنين محافظت از منابع حساس سيستم در مقابل دسترسي هاي غير عمدي استفاده مي كنند.
براي برنامه هاي كاربردي جاوا كه از طريق خط فرمان اجرا مي شوند، مي توان يك مدير امنيت پيش فرض را از طريق يك پرچم مخصوص تنظيم كرد و يا به عنوان يك راه جايگزين آن را از طريق برنامه نويسي نصب كرد. نصب يك مدير امنيت از طريق برنامه نويسي امكان ايجاد يك sandbox پيش فرض را فراهم مي كند كه از طريق آن مجوزها براي اجراي عمليات حساس بر اساس سياست امنيتي اعطا مي شود.
از پلت فرم Java 2 SE به بعد، كلاس SecurityManager ديگر انتزاعي نيست و در نتيجه نيازي به بازنويسي متدهايش وجود ندارد. جهت ايجاد و استفاده از مدير امنيت از طريق برنامه نويسي، برنامه بايد مجوز زمان اجراي CreateSecurityManager را براي نمونه سازي از SecurityManager ومجوز setSecurityManager را براي نصب آن داشته باشد. البته اين مجوزها تنها در صورتي كه يك مدير امنيت نصب شده وجود داشته باشد مورد بررسي قرار مي گيرند و بنابراين براي شرايطي مناسب است كه يك مدير امنيت عمومي و پيش فرض وجود داشته باشد. براي مثال در يك هاست مجازي بايد از جايگزيني مدير امنيت دلخواه با مدير امنيت پيش فرض ممانعت شود.
مدير امنيت رابطه بسيار نزديكي با كلاس AccessController دارد. مدير امنيت به عنوان هاب براي كنترل دسترسي استفاده مي شود در حالي كه ديگري پياده ساز واقعي الگوريتم كنترل دسترسي است. مدير امنيت موارد زير را پشتيباني مي كند

  • تطبيق پذيري عقبگرد: برنامه به ارث گرفته شده معمولاً حاوي بخشي دلخواه از كلاس مدير امنيت است زيرا اين كلاس اساساً انتزاعي (abstract) است.
  • تعريف سياست هاي دلخواه: ساختن زيركلاس از مدير امنيت اجازه تعريف سياست هاي امنيتي دلخواه را مي دهد براي مثال چند سطحي.

در سند مشخصات معماري امنيتي جاوا به كاربران توصيه شده است تا جايي كه امكان دارد از اعمال تغييرات بر روي مدير امنيت خودداري كرده و در صورت لزوم اين كار را بسيار با احتياط انجام دهند.

بارگذار كلاس (Class Loader)
كلاس java.lang.classloader و كلاس هاي وابسته به آن به عنوان ابزاري براي بارگذاري برنامه جديد به صورت پويا در JVM به كار مي روند. هر كلاس حاوي لينكي به يك class loader است كه آن را بارگذاري كرده است. همين طور هر بارگذار كلاس حاوي يك لينك بارگذار ديگر است تا جايي كه به يك بارگذار ريشه برسد. كلاس ClassLoader يك كلاس انتزاعي است و بنابراين قابليت نمونه سازي از آن وجود ندارد. همه كلاس هاي بارگذار از كلاسي به نام SecureClassLoader به ارث برده مي شوند كه اين كلاس نيز به نوبه خود از كلاس ClassLoader به ارث گرفته شده است.
كلاس SecureClassLoader چك هاي امنيتي را بر روي اعضاي خود و همچنين وابسته هايش به انجام مي رساند. اين كلاس يك تابع getPermissions() را تعريف مي كند كه نشان دهنده حق دسترسي كلاس هايي است كه توسط بارگذار كلاس بارگذاري مي شوند. اين تابع در واقع يك مكانيزم محافظتي را براي محدود كردن كدهاي ناامني كه ممكن است توسط كلاس هاي ديگر بارگذاري شوند، ايجاد مي كند.
در مقاله بعدي پيچيدگي هاي امنيتي بارگذارهاي كلاس با تفصيل بيشتري شرح داده خواهند شد.

مطالب مرتبط
برنامه‌نويسي امن با زبان جاوا - آشنايي
برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
موازنه امنيت، تهديد، كارايي و هزينه در پياده سازي LUA

برچسب‌ها