আমাদের কথা খুঁজে নিন

   

নিরাপদ কোডিং অভ্যাস (Secure Coding Practice)

যেতে চাই বহু দূর নিরাপদ কোডিং, নিরাপদ সফ্টওয়ার তৈরীর পূর্বশর্ত । বেশির ভাগ প্রোগ্রামাররা কোন সফ্টওয়ারের ফাংশনালিটি নিয়ে চিন্তা করেন । সাধারনত নিরাপত্তার বিষয়টি সফ্টওয়ার ডেভেলপমেন্ট সাইকেলের শেষের দিকে অ্যাড-হক হিসেবে চিন্তা করা হয় । যা একটি ভুল প্রক্রিয়া । নিরাপদ সফ্টওয়ার তৈরীর জন্য প্রথম থেকেই এবং প্রতিটি স্তরেই (যেমন: রিকায়ারমেন্ট, ডিজাইন, ইম্পিমিনটেশন/কোডিং, টেস্টিং ও ডিপ্লোয়মেন্ট ) নিরাপত্তার বিষয়টি মাথায় রাখতে হবে ।

একজন প্রোগ্রামারের নিরাপত্তা বিষয়ক অজ্ঞতার ও অনিরাপদ কোডিংয়ের জন্য সফ্টওয়ারটি সহজেই কম্পোমাইজ বা হ্যাক হতে পারে । একটি গবেষনায় দেখা গিয়েছে, নিরাপদ কোডিং প্রাকটিস ৫০% হ্যাকের ঘটনা কমিয়ে ফেলে । আরো একটি গবেষনায় দেখা গেছে, প্যাচ আকারে কোন সফ্টওয়ারের সিকিউরিটি হোল বন্ধ করতে ৬০% বেশি খরচ হয় । এই আর্টিকেলে নিরাপদ কোডিং নিয়ে আলোচনা করা হবে । তবে তার আগে, অনিরাপদ কোডিংয়ের জন্য কি কি সমস্যা হতে পারে তা দেখবো ।

বাফার ওভার ফ্লো বাফার ওভার ফ্লো হয় যখন কোন একটি প্রোগ্রামের কোন ইনপুট তার বরাদ্দকৃত ম্যেমরির চেয়ে বেশি জায়গায় লিখতে পারে । কোন একজন হ্যাকার বাফার ওভার ফ্লো ব্যবহার করে পুরো প্রোগ্রামের কন্টোল নিয়ে নিতে পারে বা প্রোগ্রামটি ক্রাশ করিয়ে দিতে পারে । C ও C++ ল্যানঙ্গুয়েজ সাধারনত বাফার ওভার ফ্লোতে বেশি আক্রান্ত হয় । জাভাতে অ্যারে বাউন্ড ফাংশনালিটির কারনে সরাসরি মেমরি অ্যাকসেস করা যায় না । তাই জাভা সাধারনত বাফার ওভার ফ্লো তে কম আক্রান্ত হয় ।

/** Example of Buffer Overflow **/ এই উদাহরনে, আরগুমেন্টটি বাফার ২ তে কোন প্রকার চেকিং ছাড়াই কপি করা হয়েছে । এই নিরাপত্তা ত্রুটিটি বাফার ওভার ফ্লোর মাধ্যমে এক্সপ্লোয়েট করা সম্ভব । ইন্টিজার ওভার ফ্লো ইন্টিজার ওভার ফ্লো হয় যখন কোন ইন্টিজার ভেরিয়েবল নিজের স্টোরেজ ক্ষমতার চেয়ে বড় সংখাকে স্টোর করাতে চায় । এটা সাধারনত দুটি সংখ্যার যোগফল বা গুনফল হিসেবে হতে পারে ( যেমন: a= a+ b) । C ও C++ ল্যানঙ্গুয়েজ সাধারনত ইন্টিজার ওভার ফ্লো বেশি আক্রান্ত হয় ।

জাভাতে রেন্জ চেক বলে একটি ফাংশনালিটির মাধ্যমে এর মাত্রা কমিয়ে আনা হয়েছে । /** Example of Integer Overflow **/ এই উদাহরনে ‘number’ ভেরিয়েবলটি অনবরত MAX_NUM এর চেয়ে ছোট হলে তা একসময় ইন্টিজার ওভার ফ্লো সমস্যার তৈরী করবে । এর ফলে MAX_Num-1 তম বাইটি ওভার রাইট হয়ে যাবে । ফরম্যাট স্ট্রিং অ্যাটাক এ ধরনের সমস্যাযুক্ত সফ্টওয়ারে হ্যাকাররা প্রোগ্রামে ত্রুটি পূর্ন ইনপুট দিয়ে থাকে । ইনপুটটি একটি কমান্ড হিসেবে কম্পিউটার সিস্টেমে কাজ করে ।

এর মাধ্যমে হ্যাকার তথ্য চুরি, অন্য কোন কোড রান করা ও কম্পিউটারের কন্ট্রোল নিয়ে নিতে পারে । /** Example of Format String Attack **/ উপরোক্ত প্রোগ্রামে যদি কেউ %x বা %n ধরনের ইনপুট দেয়, তবে প্রোগ্রামটি অপ্রত্যাশিত ফলাফল প্রদর্শন করবে । printf(argv[1]) এর স্থলে printf(“%s”, argv[1]) ব্যবহার করলে ভালনারিবিলিটি কিছুটা কমবে । ক্রস সাইট স্ক্রিপটিং ক্রস সাইট স্ক্রিপটিং সমস্যা গুলো সাধারনত ওয়েব সাইটগুলোতে পাওয়া যায় । এর মাধ্যমে হ্যাকাররা সাধারনত ম্যালেশিয়াস ডাটা প্রেরন করে ।

এর ফলে তারা অ্যাকসেস কন্ট্রোল সিস্টেমকে বাইপাস করতে সক্ষম হয় । এতে করে ভিকটিমের ওয়েব ব্রাউজারে ম্যালেশিয়াস ডাটা দেখা যায় । অনেক সময় স্থায়ী ভাবেও ম্যালেশিয়াস ডাটা কোন ওয়েব সাইটে স্টোর করা যায় । এ ধরেনর আক্রমনের মাধ্যমে হ্যাকাররা ওয়েব সাইট ডিফেস, কুকি চুরি, গুরুত্বপূর্ন তথ্য চুরি বা ফিসিং অ্যাটাক করে থাকে । /** Example of Cross-Site Scripting **/ এই উদাহরনে, কোডটি ইউজারের নাম নিয়ে তাকে অভ্যর্থনা জানায় ।

কিন্তু কোন ধরনের ইনপুট ভ্যালিডেশন না থাকায় এই ত্রুটির মাধ্যমে ক্রস সাইট স্ক্রিপটিং করা সম্ভব । এস কিউ এল ইন্জেকশন এস কিউ এল ইন্জেকশন হলো এস কিউ এল কমান্ড/কোয়ারি যা ব্যবহার কারীর দেয়া তথ্যের সাথে এমন ভাবে যুক্ত হয় যাতে করে এটি অ্যাকসেস কন্ট্রোল সিস্টেমকে বাইপাস করে ডাটাবেজের তথ্য সংযোজন, বিয়োজন বা প্রদর্শন করতে পারে পারে । এই আক্রমনের মাধ্যমে হ্যাকার ডাটাবেজে থাকা যেকোন তথ্য চুরি করতে পারে । এটা হতে পারে ব্যক্তিগত তথ্য, ক্রেডিট কার্ড নম্বর অথবা অন্য কোন সংবেদনশীল তথ্য । /** Example of SQL Injection **/ উপোরোক্ত HTML স্নিপেটটিতে একটি বেসিক অথেনটিকেশন মেথড দেখানো হয়েছে ।

ব্যবহার কারীর কেডেনশিয়াল (ইউজার নেম ও পাসওয়ার্ড ) Login_Account.php ফাইলের মাধ্যমে প্রেরন করা হয় । ঠিক মতো ইনপুট ভ্যালিডেশন করা না হলে, এই ধরনের ভ্যালনারিবিলিটিকে ব্যবহার করে ম্যালেশিয়াস এস কিউ এল স্টেটমেন্টের (যেমন: Select * from LOGIN where username=’john_smith’ and password = ‘ ’ or 1=1; ) মাধ্যমে অথেনটিকেশন মেথডকে বাইপাস করা সম্ভব । অনিরাপদ ভাবে সরাসরি অবজেক্ট রেফারেন্সিং অনেক সময় প্রোগ্রামারা সঠিক অথরাইজেশন ব্যবহার না করে কোন একটি রিসোর্সের যেমন: ইউআরএল, ফরম্যাট প্যারামিটার বা ডাটাবেজ রেকর্ডকে প্রোগ্রামের ভিতরের অন্য কোন মডিউলে ব্যবহার করেন । এতে করে একজন অ্যাটাকার যার ঐ রিসোর্সের উপর অথারইজেশন নাই, সেও ঐ রিসোর্সটি ব্যবহার করতে পারে এবং ম্যানিপুলেট করতে পারে । /** Example of Insecure Direct Object Reference **/ ww.abc.com/resources/accounts/information/getinfo.jsp?padeId=help.html এই ধরনের ইউআরএল দিয়ে রিসোর্স অ্যাকসেস করার ক্ষেত্রে যদি সঠিক অথরাইজেশন ব্যবহার করা না হয় তবে হ্যাকাররা ডিরেক্টরী ব্রাউজিংয়ের মাধ্যমে অন্য ফোল্ডারের ডাটা অ্যাকসেস করতে পারে যা তাদের অ্যাকসেস করতে পারার কথা না ।

সঠিক ভাবে এরর হ্যানডেলিং না করা যদি সঠিক ভাবে এরর হ্যান্ডেলিং করা না হয় তবে অনেক সময় অনেক গুরুত্বপূর্ণ সেনসেটিভ তথ্য প্রকাশ পেয়ে যেতে পারে । এই ধরনের তথ্য হ্যাকাররা ব্যবহার করে থাকে তাদের অ্যাটাক মেথড ঠিক করার সময় । ভুলভাবে এরর হ্যান্ডেলিংয়ের ফলে সিস্টেম ক্রাশ, টার্মিনেট অথবা রিস্টার্ট হয়ে যেতে পারে । প্রায় প্রত্যেক জনপ্রিয় প্রোগ্রামিং ল্যানগুয়েজের এক্সসেপশন হ্যান্ডেলিংয়ের ম্যকানিজম আছে, যাদিয়ে আন এক্সপেকটেড ডাটা বের হয়ে যাওয়া থেকে প্রোগামকে রক্ষা করা সম্ভব । /** Example of Improper Error handling and information Leakage **/ 404 Not Found Not Found The requested URL /abc/xyz_help/ was not found on this server Apache/ 2.2.3(Debian) PHP/5.2.0-8+etch13 mod_ssl/2.2.3 OpenSSL/0.9.8c server at abc.pqr.de port 80 এই উদাহরনে, এরর ম্যাসেসটি ওয়েব সার্ভার, ওপারেটিং সিস্টেম, পোর্ট নম্বর, পিএইসপি ভার্সন সহ অনান্য তথ্য প্রকাশ করে দিচ্ছি ।

নিরাপদ কোডিংয়ের জন্য কিছু নির্দেশনা ১. ডিজাইন ফেজেই সিকিউরিটি দুর্বলতা ও কৌশলগুলো সনাক্ত করা । এতে করে ব্যবহারকারীর সঠিক ও প্রয়োজনীয় নিরাপত্তা সনাক্ত করা ও ব্যাস্তবায়ন করা অনেক সহজ হয় । মনে রাখা দরকার ডিজাইন ফেজে কোন দুর্বলতা ধরা পরলে তা ফিক্স করা অনেক সহজ ও সাশ্রয়ী । ২. সঠিক ও কার্যকর ভাবে থ্রেট মডেলিং করা । অর্থাৎ, সিস্টেমের জন্য সম্ভাব্য সিকিউরিটি প্রোবলেমগুলো মডেল করা এবং যেসকল ভালনারিবিলিটির জন্য সমস্যাগুলো হতে পারে তা সনাক্ত করা ।

৩. সমসময় সঠিকভাবে ইনপুট ভ্যালিডেশন করা । ওয়েব অ্যাপ্লিকেশনের জন্য ফ্রন্ট ও ব্যাকএন্ড দু জাগায়ই ইনপুট ভ্যালিডেশন করা উচিৎ । ৪. কার্যকরী এরর হ্যান্ডিলিং ম্যাকানিজম ব্যবহার করা যাতে করে কোন ভাবেই সিস্টেমের কোন সেনসেটিভ তথ্য বেড় হয়ে না যায় বা সিস্টেম অস্বাভাবিক আচরন না করে । ৫. কোন প্রসেস বা মডিউলকে অ্যাকসেস দেয়ার সময় সতর্ক থাকতে হবে যাতে করে সঠিক অথরাইজেশন মাধ্যম অনুসরন করা হয় । ৬. অবশ্যই নিরাপদ কোডিং অভ্যাস গড়ে তুলতে হবে ও সবসময় তা অনুসরন করতে হবে ।

সিকিউরিটি টেস্টিং ১. কোড রিভিও: পেয়ার কোডিং রিভিও বা কোয়ালিটি টেস্টিং সফ্টওয়ার ডেভেলপমেন্ট সাইকেলে গুরুত্বপূর্ণ অংশ । কিন্তু প্রথাগত রিভিও সবসময় সিকিউরিটি হোল বা ফাংশনালিটি সঠিক ভাবে পরখ করতে পারে না । তাই রিভিওয়ার কে বা রিভিওয়ার টিমটির সিকিউরিটি জ্ঞান থাকা আবশ্যক । রিভিওয়ের জন্য সিকিউরিটি কোড রিভিও টুল ব্যবহার করা যেতে পারে যেমন : PREfast বা Flawfinder । ২. পেন টেস্টিং: পেন টেস্টার কোন সিস্টেম বা অ্যাপ্লিকেশনের ব্লাক বক্স টেস্টিংয়ের মাধ্যমে সিকিউরিটি পরীক্ষা করে থাকেন ।

একজন পেন টেস্টারের সোর্স কোড সম্পর্কে বা সিস্টেমের আর্কিটেকচার সম্পর্কে কোন ধারনা থাকে না । একজন পেন টেস্টার থার্ড পার্টি হিসেবে সিস্টেমের ভার্নাবিলিটি বের করার চেষ্টা করেন । একাজে তিনি বিভিন্ন টুল ব্যবহার করে থাকেন, যেমন : নেক্সাস, মেটাইসপ্লয়েট বা বার্প স্যুইট । ৩. ফাজ টেস্টিং: ফাজ টেস্টিংয়ের মাধ্যমে সিস্টেমে ভূল ইনপুট দিয়ে পরীক্ষা করা হয় ও দেখা হয় সিস্টেমটি কিরকম আচরন করছে । ফাজ টেস্টিং ও অনেকটা ব্লাক বক্স টেস্টিংয়ের মতোই ।

প্রত্যেকবার বাগ রিপোর্ট হলে বা সিস্টেম আপডেট হলে ফাজ টেস্টিং করা উচিৎ । এর মাধ্যমে কমন ভারনাবিলিটি যেমন : বাফার ওভার ফ্লো, ক্রস সাইট স্ক্রিপটিং, এস কিউ এল ইনজেকশন সনাক্ত করা যায় । শেষের কথা : সিকিউরিটি একটি ইন্টিগ্রেটেট প্রসেস । এর বিভিন্ন উপাদান রয়েছে, যেমন : সার্ভার সিকিউরিটি, অ্যাপ্লিকেশন সিকিউরিটি ইত্যাদি। আমরা সবসময় কোন সিস্টেমের সিকিউরিটির কথা চিন্তা করলে অ্যাকসেস কন্ট্রোল সিস্টেম, ফায়ার ওয়াল এইসব চিন্তা করি ।

বেশির ভাগ সময়, আমারদের সিস্টেমটি নিরাপদভাবে কোড করা হয়েছে কিনা তা পরীক্ষা করি না । ফলে অনেক সময় আমাদের প্রোগ্রামের কোডে থাকা কোন নিরাপত্তা ছিদ্র কাজে লাগিয়ে হ্যাকাররা আমাদের পুরো সিস্টেমটিকে ধংস বা নষ্ট করে ফেলতে পারে । নিরাপত্তা বিষয়ক অধ্যয়নে আমাদের মাঝে একটা প্রচলিত কথা হলো, “It's only as strong as its weakest link.” । ধন্যবাদ সবাইকে । ।

অনলাইনে ছড়িয়ে ছিটিয়ে থাকা কথা গুলোকেই সহজে জানবার সুবিধার জন্য একত্রিত করে আমাদের কথা । এখানে সংগৃহিত কথা গুলোর সত্ব (copyright) সম্পূর্ণভাবে সোর্স সাইটের লেখকের এবং আমাদের কথাতে প্রতিটা কথাতেই সোর্স সাইটের রেফারেন্স লিংক উধৃত আছে ।

প্রাসঙ্গিক আরো কথা
Related contents feature is in beta version.