বাইনারিগুলিকে কার্যকরভাবে ঝাপসা করার জন্য AFL এবং AFL++ কীভাবে ব্যবহার করবেন

সর্বশেষ আপডেট: 28/02/2026
লেখক: ইসহাক
  • ফাজ টেস্টিং সফ্টওয়্যার এবং সিস্টেমে নিরাপত্তা ত্রুটিগুলি আবিষ্কার করার জন্য ত্রুটিপূর্ণ ইনপুট পাঠানোর প্রক্রিয়া স্বয়ংক্রিয় করে।
  • AFL এবং AFL++ হল বুদ্ধিমান ফাজার যারা কভারেজের মাধ্যমে নিজেদের পরিচালনা করতে এবং নতুন কার্যকরী পথ খুঁজে পেতে ইন্সট্রুমেন্টেড কম্পাইলার ব্যবহার করে।
  • AFLTriage এবং GDB এর মতো টুল দিয়ে ক্র্যাশ বিশ্লেষণ করলে আপনি Integer Underflow এর মতো দুর্বলতার শোষণযোগ্যতা মূল্যায়ন করতে পারবেন।
  • উন্নয়ন চক্রের সাথে ফাজিংকে একীভূত করলে দৃঢ়তা উন্নত হয়, নিরাপত্তা মান পূরণে সহায়তা করে এবং গুরুতর ঘটনার ঝুঁকি হ্রাস পায়।

বাইনারিতে AFL নিয়ে ফাজিং

আপনি যদি আগ্রহী হন বাইনারি-ভিত্তিক সাইবার নিরাপত্তা এবং শোষণআজ হোক কাল হোক, আপনি ফাজিংয়ের মুখোমুখি হবেন, বিশেষ করে AFL এবং AFL++। আমরা কোনও তাত্ত্বিক ল্যাব টুলের কথা বলছি না, বরং এমন কিছুর কথা বলছি যা প্রতিদিন সুপরিচিত প্রোগ্রামগুলিতে খুব বাস্তব ত্রুটি খুঁজে বের করার জন্য ব্যবহৃত হয়, ঠিক যেমনটি দুর্বলতার ক্ষেত্রে ঘটেছে... 7-Zip এর মতো জনপ্রিয় অ্যাপ্লিকেশন.

পরবর্তী পংক্তিগুলিতে আমরা বিস্তারিতভাবে এবং বন্ধুত্বপূর্ণ সুরে দেখব, বাইনারিগুলিকে ফাঁকি দেওয়ার জন্য AFL এবং AFL++ কীভাবে ব্যবহার করবেনআমরা ফাজ টেস্টিং কী, নিরাপত্তার দিক থেকে এটি কেন এত শক্তিশালী এবং আধুনিক উন্নয়ন কর্মপ্রবাহে এটিকে কীভাবে একীভূত করা যায় তা ঠিক ব্যাখ্যা করব। আমরা একটি বাস্তব-বিশ্বের দুর্বলতার কেস (একটি পূর্ণসংখ্যার আন্ডারফ্লো যা দূরবর্তী কোড কার্যকর করার অনুমতি দেয়) পরীক্ষা করব এবং পরিপূরক সরঞ্জামগুলি পর্যালোচনা করব যেমন এক্সটেনশন, AFLTriage এবং অপারেটিং মডিউল সহ GDB.

AFL/AFL++ কী এবং কেন এগুলিকে স্মার্ট ফাজার হিসেবে বিবেচনা করা হয়?

ফাজ পরীক্ষার জন্য AFL টুল

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

AFL-এর সৌন্দর্য কেবল এলোমেলো তথ্য পাঠানো নয়, বরং একটি বুদ্ধিমান ফাজার বা কভারেজ-নির্দেশিত ফাজার. এক বা একাধিক বৈধ উদাহরণ এন্ট্রি থেকে শুরু করে (তথাকথিত পরীক্ষা ক্ষেত্রে), AFL ক্রমাগত বৈচিত্র তৈরি করে এবং প্রোগ্রামের যন্ত্রের সাহায্যে, যখন একটি নতুন মিউটেশন বাইনারিকে একটি ভিন্ন কার্যকরী পথ নিতে বাধ্য করে তখন তা সনাক্ত করে।

এই যন্ত্রটি অর্জনের জন্য, AFL-এর নিজস্ব কম্পাইলার রয়েছে, যেমন afl-gcc এবং afl-g++সংকলনের সময় এগুলো কোডে ছোট ছোট "হুক" ঢোকায়। এই হুকগুলো AFL কে জানায় যে একটি নির্দিষ্ট ইনপুট আবিষ্কৃত হয়েছে। প্রোগ্রাম প্রবাহে নতুন রুটএটি আপনাকে এমন মিউটেশনের উপর মনোযোগ দিতে সাহায্য করবে যা আসলে অতিরিক্ত কভারেজ প্রদান করে এবং এমন ডেটা নিয়ে সময় নষ্ট না করে যা কোনও পরিবর্তন করে না।

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

ফাজ টেস্টিং এবং সাইবার নিরাপত্তায় এর ভূমিকার ভূমিকা

ফাজ টেস্টিং, অথবা কেবল ফাজিং, হল একটি কৌশল যা স্বয়ংক্রিয় নিরাপত্তা এবং দৃঢ়তা পরীক্ষাধারণাটি হল একটি অ্যাপ্লিকেশনে বিকৃত, এলোমেলো, বা অস্বাভাবিক তথ্যের বন্যা পাঠানো, যার লক্ষ্য হল প্রোগ্রামটি ভেঙে যায়, ক্র্যাশ হয়, অথবা অপ্রত্যাশিতভাবে আচরণ করে কিনা তা দেখা।

যখন সফটওয়্যারটি ফাজিংয়ের শিকার হয়, তখন লক্ষ্য থাকে ত্রুটিগুলি সনাক্ত করা যেমন বাফার ওভারফ্লো, ইনপুট যাচাইকরণ ব্যর্থতা, মেমরি ব্যবস্থাপনা সমস্যা, অথবা রেস শর্তএই ত্রুটিগুলির অনেকগুলিই যথেচ্ছ কোড কার্যকরকরণ, তথ্য ফাঁস বা পরিষেবা অস্বীকারের কারণ হতে পারে।

একটি সাধারণ কর্মপ্রবাহে, ফাজ পরীক্ষা তিনটি স্পষ্ট ধাপ অনুসরণ করে: প্রথমত, পরীক্ষার ডেটাসেট তৈরি করা হয় (সম্পূর্ণরূপে এলোমেলোভাবে, একটি নির্দিষ্ট বিন্যাস অনুসরণ করে তৈরি করা হয়, অথবা বৈধ ইনপুট পরিবর্তন করে); তারপর... পর্যবেক্ষণের সময় পরীক্ষার অধীনে বাইনারিটি কার্যকর করুন এর আচরণ পর্যবেক্ষণ করা হয়; এবং অবশেষে, ক্র্যাশ বা অস্বাভাবিক আচরণ রেকর্ড এবং বিশ্লেষণ করা হয় যাতে ডেভেলপাররা সমস্যার উৎস অনুসন্ধান করতে পারে।

বিভিন্ন ধরণের ফাজিং কৌশল রয়েছে। কিছু সরঞ্জাম ফোকাস করে প্রজন্মগত অস্পষ্টতাএকটি সু-সংজ্ঞায়িত বিন্যাস (উদাহরণস্বরূপ, একটি ফাইল কাঠামো বা একটি নেটওয়ার্ক প্রোটোকল) মেনে চলা এন্ট্রি তৈরি করা; অন্যগুলি এর উপর ভিত্তি করে বৈধ ইনপুটগুলির রূপান্তরঠিক এই পদ্ধতিতেই AFL এবং AFL++ শ্রেষ্ঠত্ব অর্জন করে। আরও অনেক এলোমেলো পদ্ধতি রয়েছে এবং অন্যান্য পদ্ধতি রয়েছে যা পরীক্ষিত সিস্টেমের দুর্বলতম পয়েন্টগুলিকে লক্ষ্য করার জন্য নির্দিষ্ট জ্ঞানের উপর নির্ভর করে।

আধুনিক সাইবার নিরাপত্তায়, ফাজ টেস্টিং একটি মৌলিক সহযোগী: এটি একটি সফ্টওয়্যার উৎপাদনে যাওয়ার আগে, সক্রিয়ভাবেএবং ISO 27001 বা ডেটা সুরক্ষা প্রয়োজনীয়তার মতো প্রবিধান এবং মান মেনে চলতে অবদান রাখে। তদুপরি, এটি আক্রমণকারীদের হাতে একটি গুরুত্বপূর্ণ শোষণযোগ্য দুর্বলতা পড়ার ফলে সৃষ্ট সুনামের ঝুঁকি হ্রাস করে।

একটি বাস্তব-বিশ্বের ঘটনা: একটি ডিকম্প্রেসারে পূর্ণসংখ্যার আন্ডারফ্লো এবং RCE দুর্বলতা

AFL এবং ফাজিংয়ের প্রকৃত মূল্য বোঝার জন্য, একটি নির্দিষ্ট দুর্বলতার উপর ভিত্তি করে দেখা খুবই কার্যকর একটি খুব জনপ্রিয় ফাইল ডিকম্প্রেসারের মধ্যে পূর্ণসংখ্যার আন্ডারফ্লোএটি একটি রিমোট কোড এক্সিকিউশন (RCE) ফল্ট যা Zstandard অ্যালগরিদম ব্যবহার করে কম্প্রেস করা ফাইল প্রক্রিয়াকরণের সময় ট্রিগার হয়, যার CVSS স্কোর সর্বোচ্চ নয়, তবে সর্বোচ্চ, কারণ এর জন্য কিছুটা নির্দিষ্ট প্রেক্ষাপট প্রয়োজন (উদাহরণস্বরূপ, নির্দিষ্ট ফাইলগুলি প্রক্রিয়াকরণ করা হচ্ছে)।

একটি পূর্ণসংখ্যা আন্ডারফ্লো তখন ঘটে যখন একটি পূর্ণসংখ্যা চলক সু-সংজ্ঞায়িত নিম্ন সীমানা সহ এটির সর্বনিম্ন মান পৌঁছানো পর্যন্ত বিয়োগ ক্রিয়াকলাপে এটি ব্যবহৃত হয়।যেহেতু অনেক পূর্ণসংখ্যার ধরণ ঋণাত্মক মান অনুমোদন করে না, তাই যখন "নীচে যাওয়া" হয়, তখন শূন্যের নীচের সংখ্যা পাওয়ার পরিবর্তে, পরিসরের সর্বাধিক সম্ভাব্য মানের দিকে লাফ দেওয়া হয়, কারণ সেই সংখ্যাগুলি অভ্যন্তরীণভাবে কীভাবে উপস্থাপন করা হয় তার কারণে।

  অ্যাপলকার এবং WDAC দিয়ে স্ক্রিপ্টে স্বাক্ষর করুন এবং এক্সিকিউশন পলিসি শক্ত করুন

একটি পূর্ণসংখ্যার চলক কল্পনা করুন যা তত্ত্বগতভাবে কখনই ঋণাত্মক হওয়া উচিত নয়। যদি আপনি একটি ধ্রুবক বিয়োগ করতে থাকেন যতক্ষণ না আপনি 0 এ পৌঁছান এবং বিয়োগ করতে থাকেন, তুমি -১, -২, ইত্যাদি পাবে না।পরিবর্তে, মানটি উল্টে যাবে এবং অনুমোদিত পরিসরের উপরের প্রান্তে একটি বিশাল সংখ্যায় পরিণত হবে। এই অযৌক্তিক চিত্রটি, যদি মেমরি অপারেশনে একটি সূচক বা আকার হিসাবে ব্যবহার করা হয়, তাহলে এটি ইচ্ছাকৃত সীমার বাইরে পঠন বা লেখার কারণ হতে পারে।

সমস্যাটি তখন জটিল হয়ে ওঠে যখন সেই পূর্ণসংখ্যার চলক যা আন্ডারফ্লো করতে পারে তা ব্যবহার করা হয় একটি বাফার পরিচালনা করতে অথবা অফসেট গণনা করতেএকটি সাধারণ ছদ্ম-উদাহরণ হল একটি ব্যবহারকারী-নিয়ন্ত্রিত চলককে পরোক্ষভাবে একটি memcpy-টাইপ ফাংশনে অফসেট হিসাবে ব্যবহার করা, একটি লুপে যা প্রতিটি পুনরাবৃত্তিতে একটি ধ্রুবক হ্রাস করে যতক্ষণ না এটি শূন্য বা একটি অ-ধনাত্মক সংখ্যায় পৌঁছায়।

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

AFL কীভাবে এই ধরণের দুর্বলতাগুলি সনাক্ত করতে সাহায্য করে

একবার ইন্টিজার আন্ডারফ্লো ধারণাটি বোঝা গেলে, এটি স্পষ্ট হয়ে যায় কেন AFL এবং AFL++ এত কার্যকর: থেকে শুরু করে এক বা কয়েকটি পুরোপুরি বৈধ ইনপুট ফাইলফাজারটি হাজার হাজার বৈচিত্র তৈরি করতে পারে, যতক্ষণ না এটি এমন একটিতে হোঁচট খায় যা প্রভাবিত ডিকম্প্রেশন পথে নির্দিষ্ট বাগটিকে ট্রিগার করে।

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

ইন্টিজার আন্ডারফ্লোর ক্ষেত্রে, AFL এমন একটি নমুনা খুঁজে পেতে পারে যার ফলে জড়িত ভেরিয়েবলটি লুপে কখনই প্রত্যাশিত আউটপুট মান পৌঁছাতে পারে না। ফলাফলটি একটি সনাক্তযোগ্য ক্র্যাশ, যা সংশ্লিষ্ট AFL ফলাফল ফোল্ডারে সংরক্ষণ করা হবে, আরও বিশ্লেষণের জন্য প্রস্তুত।

কয়েক মিনিট বা ঘন্টা কার্যকর করার পরে, AFL-এর জন্য এটি নির্দেশ করা সাধারণ যে প্রথম প্রাসঙ্গিক দুর্ঘটনাআপনি যে সমস্ত বাগ খুঁজে পাবেন তা কাজে লাগানো যাবে না, তবে এগুলি একটি স্পষ্ট ইঙ্গিত দেয় যে বাইনারিটির মেমরি ব্যবস্থাপনা, ইনপুট যাচাইকরণ বা অভ্যন্তরীণ যুক্তিতে কিছু ঠিকভাবে কাজ করছে না।

তখনই AFLTriage-এর মতো সাপোর্ট টুল বা GDB-এর মতো ডিবাগার কার্যকর হয়, যা আপনাকে ক্র্যাশের আরও গভীরে যেতে, রেজিস্টার এবং মেমোরির অবস্থা পর্যবেক্ষণ করতে এবং মূল্যায়ন করতে সাহায্য করে যে ব্যর্থতাটি নির্ভরযোগ্যভাবে কাজে লাগানো যেতে পারে কিনা, নাকি আক্রমণকারীর দৃষ্টিকোণ থেকে এটি কেবল খুব একটা কাজে লাগে না।

AFL / AFL++ এর মৌলিক ইনস্টলেশন এবং বিশ্লেষণ পরিবেশ

একটি স্ট্যান্ডার্ড লিনাক্স সিস্টেমে AFL এর সাথে ফাজিংয়ের জন্য ন্যূনতম পরিবেশ সেট আপ করা বেশ সহজ। অনেক ডিস্ট্রিবিউশনে, ইন্সট্রুমেন্টেড কম্পাইলারের সাথে সম্পর্কিত প্যাকেজ ইনস্টল করা যথেষ্ট, উদাহরণস্বরূপ, একটি কমান্ড ব্যবহার করে afl-g++ অথবা সমতুল্য AFL++ প্যাকেজ ইনস্টল করুন পুরো স্যুটটা নিয়ে এসো।

এটি করলে উভয় ফাজিং টুল ইনস্টল হয়ে যায় (যেমন afl-fazz) যেমন বিশেষায়িত কম্পাইলার (afl-gcc, afl-g++, এবং AFL++ এ তাদের আধুনিক রূপ)। এই কম্পাইলারগুলি আপনি যখন আপনার টার্গেটকে ইন্সট্রুমেন্টেশনের সাথে পুনরায় কম্পাইল করতে চান তখন ব্যবহার করবেন, যা কভারেজ-নির্দেশিত ফাজিং থেকে সর্বাধিক সুবিধা পেতে অপরিহার্য।

ফাজার ছাড়াও, একটি ভালো ডিবাগিং পরিবেশ কার্যত বাধ্যতামূলক। একটি বর্ধিত GDB সহ PEDA বা GEF এর মতো প্লাগইন অতিরিক্ত কমান্ড, সুবিধাজনক মেমরি ফর্ম্যাটিং, স্ট্যাক ভিজ্যুয়ালাইজেশন এবং রেজিস্টার এবং মেমরি ম্যাপ চেক করার জন্য শর্টকাটের কারণে এটি জীবনকে অনেক সহজ করে তোলে।

যদি আপনার কাছে ইতিমধ্যেই GDB না থাকে, তাহলে আপনি আপনার ডিস্ট্রিবিউশনের প্যাকেজ ম্যানেজার ব্যবহার করে এটি ইনস্টল করতে পারেন। তারপর, আপনার পছন্দের প্লাগইনটি ইন্টিগ্রেট করুন (উদাহরণস্বরূপ, তাদের রিপোজিটরি থেকে GEF বা PEDA ডাউনলোড করে এবং আপনার GDB কনফিগারেশন ফাইলে যোগ করে, অথবা ডিবাগারের মধ্যেই `source` কমান্ড ব্যবহার করে)।

এই "স্টেরয়েডের উপর GDB" থাকা আপনাকে ফাজিংয়ের ফলে ভেঙে পড়া যন্ত্রযুক্ত বাইনারি বিশ্লেষণ করতে সাহায্য করবে, ডাউনলোড করুন ক্র্যাশের কারণী ইনপুট এবং ব্যর্থতার ঠিক সময়ে কার্যকরকরণে কী ঘটছে তা ধাপে ধাপে অনুসরণ করুন।

ফাজিংয়ের জন্য AFL দিয়ে একটি টার্গেট বাইনারি কম্পাইল করুন

একবার আপনার AFL বা AFL++ প্রস্তুত হয়ে গেলে, গুরুতর ফাজিংয়ের পরবর্তী ধাপ হল AFL কম্পাইলার দিয়ে লক্ষ্য কম্পাইল করুনএবং যদি অনুশীলনের উদ্দেশ্য আক্রমণাত্মক গবেষণা হয়, তাহলে বিশ্লেষণ এবং সম্ভাব্য শোষণ উভয়কেই সহজতর করার জন্য উপযুক্ত বিকল্পগুলি ব্যবহার করে তা করা।

  স্মার্টস্ক্রিন বৈধ অ্যাপগুলিকে ব্লক করে: কী হয় এবং কী করতে হবে

ডিকম্প্রেসার বা আর্কাইভ ইউটিলিটি স্যুটের মতো বৃহৎ প্রকল্পগুলিতে, ডিবাগিং প্রতীকগুলি সক্ষম করা একটি ভাল ধারণা (বিকল্প ডিবাগ অথবা -g এর মতো পতাকাএবং অপ্টিমাইজেশন কমিয়ে আনা (উদাহরণস্বরূপ, -O2 এর পরিবর্তে -O0 ব্যবহার করা)। এটি পর্যবেক্ষণকৃত ক্র্যাশের সাথে সম্পর্কিত সোর্স কোডে কী ঘটছে তা বুঝতে ব্যাপকভাবে সাহায্য করে।

আপনাকে সাধারণত উপযুক্ত মেকফাইল বা বিল্ড ফাইলটি সনাক্ত করতে হবে এবং সংকলন পতাকাগুলি সংজ্ঞায়িত করা হয়েছে এমন লাইনগুলি সংশোধন করুনএর মধ্যে একটি DEBUG ভেরিয়েবল সক্রিয় করা, একটি নির্দিষ্ট অপ্টিমাইজেশন স্তর জোর করা এবং সবচেয়ে গুরুত্বপূর্ণভাবে, CC এবং CXX কে afl-gcc এবং afl-g++ (অথবা সমতুল্য AFL++ সরঞ্জাম) দিয়ে প্রতিস্থাপন করা অন্তর্ভুক্ত থাকতে পারে।

উদাহরণস্বরূপ, আপনি উপযুক্ত মেকফাইলের সাথে CC=afl-gcc এবং CXX=afl-g++ এর মতো কিছু দিয়ে বিল্ডটি চালু করতে পারেন। ফলাফলটি একটি ইন্সট্রুমেন্টেড বাইনারি হবে যা প্রয়োজনীয় হুকগুলিকে অন্তর্ভুক্ত করবে যাতে AFL পুরো এক্সিকিউশন জুড়ে কভারেজ পরিমাপ করতে পারে।

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

পরীক্ষার কেস প্রস্তুতকরণ এবং AFL বাস্তবায়ন

আপনার বাইনারির বিরুদ্ধে AFL চালু করার আগে, আপনাকে একটি সেট প্রস্তুত করতে হবে সর্বনিম্ন বৈধ এন্ট্রিযদি আপনি এমন একটি ডিকম্প্রেসার পরীক্ষা করেন যা একটি নির্দিষ্ট অ্যালগরিদম ব্যবহার করে ফাইল সংকুচিত করতে ব্যর্থ হয়, তাহলে আপনাকে কমপক্ষে একটি সুগঠিত ফাইল তৈরি করতে হবে যা সেই সংকোচন পদ্ধতি ব্যবহার করে।

স্বাভাবিক অভ্যাস হল একটি ডিরেক্টরি তৈরি করা, উদাহরণস্বরূপ টেস্টকেস নামে পরিচিত, এবং সেখানে এক বা একাধিক কার্যকরী নমুনা সংরক্ষণ করা। এগুলি AFL-এর জন্য একটি সূচনা বিন্দু হিসেবে কাজ করবে। ক্রমবর্ধমান আক্রমণাত্মক মিউটেশন তৈরি করেনতুন মৃত্যুদণ্ড কার্যকর করার পথ আবিষ্কার করার চেষ্টা করে এবং অবশেষে, ক্র্যাশ করে।

AFL শুরু করার জন্য সাধারণ কমান্ডটি দেখতে এরকম কিছু: একটি সেশন বা সিঙ্ক্রোনাইজেশনের নাম, টেস্ট কেস সহ ইনপুট ফোল্ডার, ফলাফল সংরক্ষণ করা হবে এমন আউটপুট পাথ এবং কিছু অতিরিক্ত প্যারামিটার যেমন টাইমআউট উল্লেখ করুন যাতে অসীম লুপে আটকে না যান।

কমান্ড লাইনটি কীভাবে টার্গেট প্রোগ্রামটি ব্যবহার করে কার্যকর করা হয় তাও নির্দিষ্ট করে স্কোরবোর্ড @@যা AFL স্বয়ংক্রিয়ভাবে প্রতিটি টেস্ট কেসের পাথ দিয়ে প্রতিস্থাপন করবে। তাই আপনি এরকম কিছু নির্দিষ্ট করতে পারেন ./বাইনারি আর্গুমেন্ট @@ এবং AFL বিভিন্ন ফাইল দিয়ে হাজার হাজার বার এক্সিকিউটেবল চালু করার জন্য দায়ী থাকবে।

এটা জানা গুরুত্বপূর্ণ যে AFL প্রাথমিকভাবে সিস্টেম কনফিগারেশন সম্পর্কে অভিযোগ করতে পারে (রিসোর্স সীমা, কোর ডাম্প ইত্যাদির কারণে)। সেক্ষেত্রে, সাধারণত একটি সহায়ক স্ক্রিপ্ট বা টুল থাকে যা ফাজিং পরিবেশকে অপ্টিমাইজ করার জন্য কার্নেল এবং সেশন প্যারামিটারগুলিকে সামঞ্জস্য করে, যা পরীক্ষাটি পুনরাবৃত্তি করার আগে যথাযথ অনুমতি নিয়ে চালানো উচিত।

AFLTriage এবং GDB এর সাথে ক্র্যাশ বিশ্লেষণ

কিছুক্ষণের ঝগড়ার পর, AFL ধীরে ধীরে আউটপুট ফোল্ডারটি আকর্ষণীয় নতুন এন্ট্রি দিয়ে পূর্ণ করবে এবং সর্বোপরি, যেসব ফাইল ক্র্যাশের কারণ হয়েছেএগুলি সাধারণত একটি নির্দিষ্ট সাবডিরেক্টরিতে সংরক্ষণ করা হয় (উদাহরণস্বরূপ, সেশন ফোল্ডারের মধ্যে ক্র্যাশ)।

প্রতিটি ইনপুট একের পর এক পর্যালোচনা করে পাগলামি এড়াতে, AFLTriage এর মতো টুল রয়েছে যা আপনাকে প্রতিটি ক্র্যাশ ফাইলের বিপরীতে স্বয়ংক্রিয়ভাবে বাইনারি চালান এবং কোথায় এবং কীভাবে ব্যর্থতা ঘটেছে তার বিশদ সহ কাঠামোগত প্রতিবেদন তৈরি করুন।

AFLTriage চালু করার সময়, আপনি ইনপুট ডিরেক্টরি (ক্র্যাশ ফোল্ডার), রিপোর্ট সংরক্ষণ করার জন্য একটি আউটপুট ডিরেক্টরি এবং @@ ব্যবহার করে বাইনারি চালানোর কমান্ড নির্দিষ্ট করবেন। টুলটি প্রতিটি কেস বিশ্লেষণ করবে এবং এটি আগ্রহের তথ্য সহ টেক্সট ফাইল তৈরি করবে। বিশ্লেষকের জন্য।

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

একবার একটি আকর্ষণীয় ক্র্যাশ সনাক্ত হয়ে গেলে, পরবর্তী ধাপ হল এটি GDB-তে পুনরুত্পাদন করা। এটি করার জন্য, ডিবাগারটি বাইনারি এবং অপরাধী ইনপুট ফাইলকে আর্গুমেন্ট হিসাবে ব্যবহার করে চালু করা হয় এবং প্রোগ্রামটি GDB-এর মধ্যে থেকে কার্যকর করা হয়। যখন ক্র্যাশটি পুনরুত্পাদন করা হয়, তখন অবস্থা RAX, RDX ইত্যাদির মতো গুরুত্বপূর্ণ রেকর্ড।, সঠিক কোন নির্দেশনাটি কার্যকর করা হচ্ছে তা পরীক্ষা করুন এবং কোন অঞ্চলে পড়া বা লেখা হচ্ছে তা দেখতে মেমরি ম্যাপ (vmmap) দেখুন।

ক্র্যাশ থেকে সম্ভাব্য শোষণ: GDB-তে বিশ্লেষণ মডিউল

বাইনারি ডাউন হওয়ার অর্থ সবসময় এই নয় যে দুর্বলতা কাজে লাগানো সম্ভব। এখানেই মডিউলের মতো GDB এক্সটেনশনগুলি কার্যকর হয়। শোষণযোগ্য, একটি ক্র্যাশের প্রেক্ষাপট বিশ্লেষণ করার জন্য এবং ব্যর্থতাকে কাজে লাগানো যেতে পারে কিনা তার একটি মোটামুটি শ্রেণীবিভাগ প্রদানের জন্য ডিজাইন করা হয়েছে।

এই ধরণের এক্সটেনশনগুলি নির্দেশ পয়েন্টারের বৈধতা, স্ট্যাক পয়েন্টারের অবস্থা, যে ঠিকানায় পঠন বা লেখার চেষ্টা করা হয়েছে তার মেমরি অনুমতি এবং ক্র্যাশের কারণ হওয়া সংকেতের প্রকৃতির মতো দিকগুলি অধ্যয়ন করে। এই সমস্ত তথ্যের সাহায্যে, তারা একটি শোষণ সম্ভাবনার উপর নির্দেশক রায় (উদাহরণস্বরূপ, বাগটিকে সম্ভবত শোষণযোগ্য, সম্ভবত শোষণযোগ্য, অথবা সামান্য আগ্রহের হিসাবে শ্রেণীবদ্ধ করে)।

  মাইক্রোসফ্ট টিমসে ক্ষতিকারক লিঙ্কগুলি কীভাবে প্রতিরোধ করবেন

ইন্টিজার আন্ডারফ্লো-এর ক্ষেত্রে যা শুধুমাত্র পঠনযোগ্য মেমোরিতে লেখা শেষ করে, প্লাগইনটি পরামর্শ দিতে পারে যে এটি একটি সম্ভাব্য শোষণযোগ্য কেস কারণ একটি লেখার অপারেশন এমন একটি অঞ্চলে প্রত্যাশিত সীমার বাইরে সঞ্চালিত হচ্ছে যেখানে কিছুই স্পর্শ করা উচিত নয়।

সব পরিস্থিতি এত সহজ হবে না, তবে দুর্ঘটনা আবিষ্কারের জন্য AFL, ঘটনাগুলিকে গোষ্ঠীবদ্ধ ও বর্ণনা করার জন্য AFLTriage এবং শোষণযোগ্যতা মূল্যায়নের জন্য এক্সটেনশন সহ GDB-এর এই সমন্বয় একটি অত্যন্ত শক্তিশালী বাইনারি অডিট পাইপলাইনসেখান থেকে, বাকি কাজটি সম্পূর্ণরূপে শোষণের গবেষণা এবং উন্নয়ন, যা বাইনারি এবং সক্রিয় সুরক্ষার উপর নির্ভর করে জটিলতার ক্ষেত্রে ব্যাপকভাবে পরিবর্তিত হতে পারে।

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

বাস্তুতন্ত্রের অন্যান্য প্রাসঙ্গিক ফাজার এবং সরঞ্জাম

যদিও AFL এবং AFL++ হল নেটিভ বাইনারিগুলিকে ফাজ করার জন্য সবচেয়ে পরিচিত বিকল্পগুলির মধ্যে একটি, ফাজ টেস্টিং ইকোসিস্টেমটি অনেক বিস্তৃত এবং আপনি যদি নিয়মিতভাবে কাজ করেন তবে নজর রাখা মূল্যবান সফটওয়্যার নিরাপত্তা.

সর্বাধিক ব্যবহৃত বিকল্পগুলির মধ্যে রয়েছে LibFuzzer, একটি লাইব্রেরি যা মূলত Google দ্বারা তৈরি করা হয়েছিল যা সরাসরি C/C++ কোডের সাথে সংহত করে এবং সম্পাদন করে নির্দিষ্ট ফাংশনের স্তরে অস্পষ্টতা, অত্যন্ত নিয়ন্ত্রিত ইনপুট সহ পৃথক উপাদান পরীক্ষা করার জন্য আদর্শ।

এছাড়াও পীচ ফাজার রয়েছে, একটি আরও সাধারণ-উদ্দেশ্য এবং কনফিগারযোগ্য প্ল্যাটফর্ম যা আপনাকে সংজ্ঞায়িত করতে দেয় প্রোটোকল, ফাইল ফর্ম্যাট এবং জটিল কাঠামোর সঠিক মডেলএটি এমন ক্ষেত্রগুলিতে খুবই জনপ্রিয় যেখানে নির্ভরযোগ্যতা অত্যন্ত গুরুত্বপূর্ণ, যেমন শিল্প ব্যবস্থা বা IoT পরিবেশ।

ওয়েব ডোমেইনে, OWASP ZAP-এর মতো টুলগুলিতে ওয়েব অ্যাপ্লিকেশনের জন্য তৈরি ফাজিং মডিউল অন্তর্ভুক্ত থাকে, যা পাঠাতে সক্ষম হেরফের করা অনুরোধ, ত্রুটিপূর্ণ লোড এবং ইনজেকশন পরীক্ষা SQL ইনজেকশন, ইনপুট যাচাইকরণ সমস্যা, বা ফর্ম প্রক্রিয়াকরণ ত্রুটির মতো দুর্বলতা সনাক্ত করার জন্য HTTP এন্ডপয়েন্ট।

এই সমস্ত কিছুই AFL/AFL++ বাইনারি ফাজিংয়ের পরিপূরক, কারণ এটি নিম্ন-স্তরের নেটিভ কোড থেকে শেষ ব্যবহারকারীর কাছে সবচেয়ে বেশি উন্মুক্ত অ্যাপ্লিকেশন স্তরগুলিতে কভারেজের অনুমতি দেয়। সকল ক্ষেত্রেই সাধারণ লক্ষ্য একই: আক্রমণকারীদের আগে দুর্বলতা অনুসন্ধান স্বয়ংক্রিয় করা।

উন্নয়ন চক্রের মধ্যে ফাজ টেস্টিং কীভাবে একীভূত করা যায়

ফাজিং-এর প্রকৃত মূল্য ধারাবাহিকভাবে প্রদানের জন্য, মাঝে মাঝে কেবল AFL বা AFL++ চালু করে ভুলে যাওয়া যথেষ্ট নয়। এটি অনেক বেশি কার্যকর। সফটওয়্যার ডেভেলপমেন্ট জীবনচক্রের মধ্যে ফাজ টেস্টিং একীভূত করা, ইউনিট বা ইন্টিগ্রেশন পরীক্ষার সাথে যেভাবে করা হয় ঠিক তেমনই।

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

এরপর, আপনাকে প্রতিটি ক্ষেত্রে সঠিক টুলটি বেছে নিতে হবে। জটিল নেটিভ বাইনারিগুলির জন্য, AFL++ অথবা LibFuzzer সাধারণত স্বাভাবিক প্রার্থী, অন্যদিকে ওয়েব API অথবা HTTP অ্যাপ্লিকেশনের জন্য, একটি ওয়েব-ভিত্তিক টুল আরও অর্থবহ হবে। গুরুত্বপূর্ণ বিষয় হল ফাজিং সঠিকভাবে কার্যকর করা হয়েছে। পুনরাবৃত্তিযোগ্য এবং স্বয়ংক্রিয়.

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

পরিশেষে, এটা বোঝা গুরুত্বপূর্ণ যে ফাজিং একটি পুনরাবৃত্তিমূলক প্রক্রিয়া। প্রতিবার যখনই কোনও বাগ ঠিক করা হয়, তখন প্যাচটি কাজ করছে কিনা এবং কোনও নতুন বাগ চালু হয়নি কিনা তা যাচাই করার জন্য প্রভাবিত উপাদানটি আবার ফাজ করা উচিত। কোনও নতুন রিগ্রেশন বা দুর্বলতা নেইএইভাবে, ফাজ টেস্টিং একটি বিচ্ছিন্ন নিরীক্ষা নয় বরং অবিচ্ছিন্ন সুরক্ষার একটি অতিরিক্ত স্তরে পরিণত হয়।

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