IRCAR201110115
عنصر اصلي در برنامهنويسي امن با زبانهاي مختلف برنامهنويسي، مستندسازي خوب و استفاده از استانداردهاي قابل اجرا است. استانداردهاي كدنويسي، برنامهنويسان را ترغيب به پيروي از مجموعهاي متحدالشكل از قوانين و راهنماييهايي ميكند كه بر اساس نيازمنديهاي پروژه و سازمان تعيين شده است، نه بر اساس سلايق و مهارتهاي مختلف برنامهنويسان. به محض تعيين استانداردهاي مذكور، ميتوان از آن به عنوان معياري براي ارزيابي كدهاي منبع، چه به صورت دستي و چه به صورت اتوماتيك استفاده كرد.
از استانداردهاي معروف در اين زمينه ميتوان به استانداردCERT براي كدنويسي امن اشاره كرد كه يك سري از قوانين و پيشنهادات را براي كدنويسي امن با زبانهاي برنامهنويسي C، C++ و جاوا ارائه ميدهد. هدف از اين قوانين و پيشنهادات، حذف عادتهاي كدنويسي ناامن و رفتارهاي تعريف نشده است كه منجر به آسيبپذيريهاي قابل سوءاستفاده ميشود. به كارگيري استانداردهاي مذكور منجر به توليد سيستمهاي با كيفيت بالاتر ميشود كه در برابر حملات بالقوه، پايدارتر و مقاومتر هستند.
در مقالههاي قبلي، كليات استاندارد CERT در زمينه مزبور را توضيح داديم و در سري مقالههاي برنامهنويسي امن به زبان C به صورت تخصصيتر شيوه برنامهنويسي امن با اين زبان را مورد بررسي قرار ميدهيم. قابل ذكر است كه در اين استاندارد 89 قانون و 134 پيشنهاد براي برنامهنويسي امن با زبان C ارائه شده است كه در اين سري مقالات، مهمترين آنها را كه در سطح يك قرار دارند، شرح خواهيم داد. براي كسب اطلاعات بيشتر در مورد سطحبندي قوانين و پيشنهادات به مقاله "آشنايي با استاندارد CERT براي برنامه نويسي امن" مراجعه فرماييد. سري مقالات حاضر با عنوان قوانين و پيشنهادات تكميلي (Miscellaneous) آخرين سري مقالات برنامهنويسي امن به زبان C است كه در آن قوانين و پيشنهاداتي توضيح داده ميشوند كه در دسته بنديهاي قبلي نگنجيدهاند.
44. MSC18-C – در مورد استفاده از دادههاي حساس مانند كلمات عبور در كد برنامه محتاط باشيد.
بسياري از برنامههاي كاربردي نيازمند مديريت دادههاي حساس چه بر روي حافظه و چه بر روي ديسك سخت هستند. در صورتي كه از اين دادههاي حساس به خوبي مراقبت نشود، ممكن است منجر به از دست دادن محرمانگي يا جامعيت دادهها شود. معمولاً بسيار سخت (گران) است كه همه دادههاي حساس را كاملاً امن كرد. كاربران تمايل دارند كه در همه جا از كلمات عبور يكسان استفاده كنند. حال در صورتي كه برنامه شما حتي يك بازي ساده هم باشد كه اطلاعات پروفايل كاربر را ذخيره ميكند و نيازمند وارد كردن يك كلمه عبور است، ممكن است كاربر همان كلمه عبوري را انتخاب كند كه براي حساب بانكي آنلاين خود از آن استفاده ميكند. بنابراين در اين حالت حساب بانكي كاربر به همان اندازه امن است كه برنامه شما امنيت آن را تأمين ميكند.
گامهاي كوچكي وجود دارد كه با رعايت آنها مي توانيد دادههاي حساس برنامه خود را امن سازيد.
- از تأييد هويت سيستم براي اعطاي حق دسترسي به كاربران نرمافزار استفاده كنيد.
در صورتي كه برنامه كاربردي شما به برخي سرويسهايي دسترسي دارد كه در حال حاضر بر روي سيستم نصب شدهاند ولي نيازمند حق دسترسي خاصي هستند، بسيار محتمل است كه سرويس مذكور مكانيزمي براي گرفتن كلمه عبور از كاربر داشته باشد. قبل از اينكه برنامه كاربردي شما از كاربر درخواست نام كاربري و كلمه عبور نمايد، اطمينان حاصل نماييد كه آيا خدمت مذكور به نوعي كاربر را تأييد مينمايد يا خير. درصورتي كه اين كار را انجام ميدهد، اجازه دهيد كه سرويس مذكور وظيفه آزمون نام كاربري و كلمه عبور را به عهده بگيرد، زيرا در اين حالت ردپاهاي اطلاعات حساس كمتر ميشود. - دادههاي حساس را در كد برنامه ذخيره نسازيد
اين كار يك عمل بسيار ناشيانه و نادرست در برنامهنويسي تلقي ميشود، زيرا محيط توسعه را براي امن بودن تحت فشار قرار مي دهد، در واقع به نوعي بار امنيتي را به محيط منتقل ميكند. - نسخه برداري از حافظه را غير فعال سازيد
نسخه برداري از حافظه به صورت خودكار در مواقعي كه برنامه به هر دليل از كار مي افتد، انجام مي شود. اين نسخه هاي حافظه ممكن است حاوي اطلاعات ذخيره شده در هر قسمت از حافظه برنامه باشد كه به ديسك سخت منتقل مي شود. بنابراين، بسيار مهم است كه پيش از روانه بازار ساختن برنامه هاي كاربردي امكان نسخه برداري از حافظه برنامه غيرفعال شود. - داده هاي حساس را بيش از زماني كه مورد نياز هستند، ذخيره نسازيد
داده هاي حساسي كه در حافظه برنامه ذخيره شده اند، مي توانند زماني كه يك صفحه از حافظه مبادله مي شود، بر روي ديسك سخت نوشته شوند. شما مي توانيد داده هاي برنامه خود را قفل كنيد تا از مبادله آن با حافظه سخت جلوگيري به عمل آوريد. البته لازم به ذكر است براي اينكه برنامه شما بتواند چنين كاري را انجام دهد نيازمند حق دسترسي مديريتي است، ولي به هر حال بهتر است آن را انجام دهيد. - داده هاي حساس را در متون ساده ذخيره نكنيد
زماني كه از يك كلمه عبور استفاده مي كنيد، به جاي ذخيره مستقيم متن، آن را به صورت درهم (hash) ثبت كنيد. همچنين از همان متن درهم براي مقايسه ها و ديگر اهداف استفاده كنيد. در برنامه زير اين موضوع نشان داده شده است:
int validate(char *username) { char *password; char *checksum; password = read_password(); checksum = compute_checksum(password); erase(password); /* securely erase password */ return !strcmp(checksum, get_stored_checksum(username)); }
- در صورتي كه مجبور به ذخيره داده هاي حساس هستيد، ابتدا آن را رمزنگاري نماييد.
- اگر داده هاي حساس را رمزنگاري كرده و يا آن را درهم مي سازيد، از توابع رمزنگاري يا كتابخانه هايي كه خود آن را پياده سازي كرده ايد، استفاده نكنيد. كتابخانه هايي كه امنيت آنها اثبات شده است را مورد استفاده قرار دهيد.
- در صورتي كه از كتابخانه هاي استاندارد رمزنگاري استفاده مي كنيد، از نيازمنديهاي خاص آنها در مورد اندازه كليد و ديگر مشخصات كه معمولاً همراه با كتابخانه مستند مي شوند، اطلاع كسب كنيد. سپس از كليدهايي استفاده كنيد كه شرايط مذكور را برآورده مي سازند.
- كليدهاي رمزنگاري را ذخيره نسازيد و اگر به هر دليلي مجبور به اين كار هستيد، آن را به صورت امن ذخيره سازيد.
- داده هاي حساس را به صورت امن از ديسك سخت و حافظه پاك نماييد
- مراقب بهينه سازي كامپايلر در زمان پاك كردن حافظه باشيد.
- از روشهاي پاكسازي امن كه در استانداردهاي DOD 5220 يا Gutmann1996 آورده شده است، استفاده كنيد.
- 4