IRCAR201305174
تاريخ: 04/03/92
روز به روز بر تعداد گزارشهايي كه در مورد آسيبپذيري در نرمافزارها و يا سوءاستفاده از آنها منتشر ميشود، افزوده ميگردد و بسياري از اين گزارشها منجر به هشدارهاي امنيتي فني ميشوند. براي برطرف ساختن اين تهديد كه بر روي دولتها، شركتها، موسسات آموزشي و افراد تأثير ميگذارد، لازم است سيستمهايي فارغ از آسيبپذيريهاي نرمافزاري طراحي و ايجاد شوند.
بخش عمدهاي از آسيبپذيريهاي نرمافزارها بر اثر خطاهاي برنامهنويسي ايحاد ميشوند. براي مثال، 64 درصد آسيبپذيريهايي كه در سال 2004 شناخته شدهاند مربوط به خطاهاي برنامهنويسي بودهاند.
زبان برنامهنويسي جاوا، زبان نسبتاً امني شناخته ميشود، چرا كه براي مثال اين زبان امكاني را براي دستكاري اشارهگرها به صورت صريح ندارد، حدود رشتهها و آرايهها به صورت خودكار بررسي ميشوند، تلاش براي ارجاع به اشارهگر تهي ناكام ميماند، عمليات رياضي و تبديل انواع به خوبي تعريف شده و مستقل از پلتفرم هستند، همچنين امكان bytecode verifier تضمين ميكند كه اين بررسيها همواره انجام ميشوند. علاوه بر اين، جاوا داراي مكانيزمهاي جامع امنيتي است به طوري كه ميتواند دسترسي به فايلها، سوكتها و ديگر منابع حساس را كنترل نمايد.
با اين وجود، امنيت برنامههاي جاوا در شرايطي به خطر ميافتد. يكي از اين شرايط اعتبار سنجي وروديي بود كه در مقاله "برنامهنويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي دادهها" شرح داده شد، يكي ديگر از اين موارد شرايطي است كه منجر به نشت اطلاعات حساس مي شود.
خط مشي امنيتي تعيين كننده اطلاعات حساس است. اطلاعات حساس ممكن است شامل اطلاعات كاربران همچون شماره ملي، شماره كارت بانك، رمز عبور يا كليدهاي خصوصي رمزنگاري باشد. با صرف نظر از اينكه اطلاعات حساس شامل چه نوع اطلاعاتي ميشود، زماني كه اجزاء برنامه با درجات متفاوتي از سطح اعنماد، دادهها را به اشتراك ميگذارند گفته ميشود كه دادهها در يك محدوده قابل اعتماد جريان پيدا ميكنند. از آنجايي كه جاوا اجازه ميدهد اجزايي كه در دامنههاي با سطح اعتماد متفاوت قرار دارند، با يكديگر در يك برنامه تعامل داشته باشند، دادهها ميتوانند در محدوده قابل اعتماد جريان پيدا كنند. به همين علت سيستمها بايد دقت كنند كه در صورتي كه كاربران يك جزء با سطح اعتماد متفاوت كه در همين برنامه قرار دارد، مجوز دسترسي به دادهاي را دارا نيستند، دادههاي مورد نظر در جزء مذكور جريان پيدا نكنند. جلوگيري از دسترسي غير مجاز ميتواند به سادگي ممانعت از جريان دادهها در محدوده قابل اعتماد انجام شود و يا ممكن است نياز به فيلتر كردن دادههاي حساس از دادههاي عادي باشد كه ميتوانند در محدود قابل اعتماد جريان پيدا كنند.
اجزاي نرمافزار جاوا موقعيتهاي بسياري را براي خروج اطلاعات حساس فراهم ميآورند. به همين منظور قوانيني در جاوا مطرح شدهاند كه منجر به كاهش احتمال افشاي اطلاعات حساس ميشوند. اين قوانين به شرح زير هستند:
- قانون ERR01-J – به استثنائات اجازه افشاي اطلاعات حساس را ندهيد.
- قانون FIO13-J – اطلاعات حساس را بيرون از محدوده قابل اعتماد ثبت نكنيد.
- قانون IDS03-J – ورودي از كاربر بدون مجوز را ثبت نكنيد.
- قانون MSC03-J – هرگز اطلاعات حساس را درون كد برنامه ذخيره نكنيد. (hard code)
- قانون SER03-J – اطلاعات حساسي را كه رمزنگاري نشدهاند، سريال سازي نكنيد.
- قانون SER04-J – پروسههاي سريالسازي و بازكردن سريالها نبايد مدير امنيتي را دور بزنند.
- قانون SER06-J – از اجزايي كه در حين پروسه باز كردن سريالها تغيير ميكنند، كپي تهيه نماييد.
قانون هاي فوق در مقالات آينده سلسله مقالات برنامه نويسي امن با زبان جاوا شرح داده خواهند شد.
امنيت نوع
جاوا به عنوان يك زبان با نوع امن شناخته ميشود. به همين دليل قاعدتاً نبايد بتوان يك برنامه جاوا را از طريق استفاده نادرست از انواع سيستمي مورد مصالحه قرار داد. براي اينكه به اهميت امنيت نوع پي ببريد، كد زير را در نظر بگيريد:
public class TowerOfLondon { private Treasure theCrownJewels; ... } public class GarageSale { public Treasure myCostumeJewelry; ... }
در صورتي كه اين دو نوع بتوانند با هم تداخل پيدا كنند، مي توان به فيلد خصوصي theCrownJewels همچون فيلد عمومي MyCostumeJewerly دسترسي پيدا كرد. در واقع مي توان گفت كه يك حمله "تداخل نوع" امنيت جاوا را در اختيار سوءاستفاده كنندگان قرار مي دهد. يك گروه از محققان امنيتي دانشگاه پرينستون آمريكا نشان دادند كه هر نوع تداخل نوعي مي تواند براي غلبه كامل بر مكانيزم هاي امنيتي جاوا به كار گرفته شود.
امنيت نوع به اين معني است كه تمام فيلدهاي كه به صورت خصوصي يا محافظت شده تعريف شده اند يا وضعيت پيش فرض را دارا هستند، نبايد به صورت عمومي مورد دسترسي قرار گيرند. با اين وجود، تعدادي آسيب پذيري به صورت از پيش تعيين شده در جاوا وجود دارند كه موجب غلبه بر اين محدوديت در موارد مورد نياز برنامه نويس مي شوند. اين مسئله براي يك برنامه نويس حرفه اي جاوا اصلاً عجيب نيست اما براي كسي كه آگاهي كافي از اين زبان ندارد مي تواند دردسر ساز شود.
فيلدي كه به صورت عمومي تعريف شده است مي تواند توسط هر جزء برنامه مورد دستيابي قرار گيرد و مي تواند از هر جاي برنامه ويرايش شود. واضح است كه فيلدهاي حساس نبايد به صورت عمومي تعريف گردند زيرا مي توانند توسط هر فردي كه ماشين جاوايي را كه برنامه را اجرا مي كند هك كرده است، مورد دسترسي قرار گيرند.
مطالب مرتبط
برنامهنويسي امن با زبان جاوا - آشنايي
- 4