স্কুডো

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

অ্যাড্রেস স্যানিটাইজার (আসান) এর মতো সম্পূর্ণরূপে উন্নত মেমরি ত্রুটি সনাক্তকারীর চেয়ে স্কুডো একটি প্রশমন।

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

স্কুডো হল ওপেন সোর্স এবং এলএলভিএম-এর কম্পাইলার-আরটি প্রকল্পের অংশ। ডকুমেন্টেশন https://llvm.org/docs/ScudoHardenedAllocator.html এ উপলব্ধ। অ্যান্ড্রয়েড টুলচেইনের অংশ হিসেবে স্কুডো রানটাইম শিপ এবং সাপোর্ট যোগ করা হয়েছে Soong এবং Make- এ যাতে একটি বাইনারিতে বরাদ্দকারীকে সহজে সক্ষম করা যায়।

আপনি নীচে বর্ণিত বিকল্পগুলি ব্যবহার করে বরাদ্দকারীর মধ্যে অতিরিক্ত প্রশমন সক্ষম বা নিষ্ক্রিয় করতে পারেন।

কাস্টমাইজেশন

বরাদ্দকারীর কিছু পরামিতি বিভিন্ন উপায়ে প্রতি-প্রক্রিয়ার ভিত্তিতে সংজ্ঞায়িত করা যেতে পারে:

  • স্থিরভাবে: প্রোগ্রামে একটি __scudo_default_options ফাংশন সংজ্ঞায়িত করুন যা পার্স করার বিকল্প স্ট্রিং প্রদান করে। এই ফাংশনের নিম্নলিখিত প্রোটোটাইপ থাকতে হবে: extern "C" const char *__scudo_default_options()
  • গতিশীলভাবে: পার্স করার জন্য বিকল্প স্ট্রিং ধারণকারী পরিবেশ পরিবর্তনশীল SCUDO_OPTIONS ব্যবহার করুন। এইভাবে সংজ্ঞায়িত বিকল্পগুলি __scudo_default_options মাধ্যমে তৈরি করা যেকোনো সংজ্ঞাকে ওভাররাইড করে।

নিম্নলিখিত বিকল্পগুলি উপলব্ধ।

অপশন 64-বিট ডিফল্ট 32-বিট ডিফল্ট বর্ণনা
QuarantineSizeKb 256 64 কোয়ারেন্টাইনের আকার (কেবি-তে) খণ্ডগুলির প্রকৃত ডিললোকেশন বিলম্বিত করতে ব্যবহৃত হয়। একটি কম মান মেমরি ব্যবহার কমাতে পারে কিন্তু প্রশমনের কার্যকারিতা হ্রাস করতে পারে; একটি নেতিবাচক মান ডিফল্টে ফিরে আসে। এটি এবং ThreadLocalQuarantineSizeKb উভয়কেই শূন্যে সেট করলে কোয়ারেন্টাইন সম্পূর্ণরূপে নিষ্ক্রিয় হয়৷
QuarantineChunksUpToSize 2048 512 আকার (বাইটে) যে পর্যন্ত খণ্ডগুলিকে আলাদা করা যেতে পারে৷
ThreadLocalQuarantineSizeKb 64 16 গ্লোবাল কোয়ারেন্টাইন অফলোড করতে প্রতি থ্রেড ক্যাশের আকার (কেবি-তে) ব্যবহার করা হয়। একটি কম মান মেমরির ব্যবহার কমাতে পারে কিন্তু বিশ্বব্যাপী কোয়ারেন্টাইন নিয়ে বিতর্ক বাড়াতে পারে। এটি এবং QuarantineSizeKb উভয়কেই শূন্যে সেট করা হলে তা সম্পূর্ণরূপে কোয়ারেন্টাইন অক্ষম করে।
DeallocationTypeMismatch false false malloc/delete, new/free, new/delete-এ ত্রুটি রিপোর্টিং সক্ষম করে[]
DeleteSizeMismatch true true নতুন এবং মুছে ফেলার আকারের মধ্যে অমিলের উপর ত্রুটি রিপোর্টিং সক্ষম করে৷
ZeroContents false false বরাদ্দ এবং ডিলোকেশনে শূন্য খণ্ড বিষয়বস্তু সক্ষম করে।
allocator_may_return_null false false সুনির্দিষ্ট করে যে প্রক্রিয়াটি বন্ধ করার পরিবর্তে একটি পুনরুদ্ধারযোগ্য ত্রুটি ঘটলে বরাদ্দকারী শূন্য ফেরত দিতে পারে।
hard_rss_limit_mb 0 0 যখন প্রক্রিয়াটির RSS এই সীমাতে পৌঁছায়, প্রক্রিয়াটি বন্ধ হয়ে যায়।
soft_rss_limit_mb 0 0 যখন প্রক্রিয়াটির RSS এই সীমাতে পৌঁছে যায়, তখন আরও বরাদ্দ ব্যর্থ হয় বা null ফেরত দেয় ( allocator_may_return_null এর মানের উপর নির্ভর করে), যতক্ষণ না RSS নতুন বরাদ্দের অনুমতি দেওয়ার জন্য ফিরে যায়।
allocator_release_to_os_interval_ms N/A 5000 শুধুমাত্র একটি 64-বিট বরাদ্দকারীকে প্রভাবিত করে। সেট করা থাকলে, অব্যবহৃত মেমরি OS-তে ছেড়ে দেওয়ার চেষ্টা করে, কিন্তু এই ব্যবধানের (মিলিসেকেন্ডে) বেশিবার নয়। মান নেতিবাচক হলে, মেমরি OS এ প্রকাশ করা হয় না।
abort_on_error true true সেট করা থাকলে, ত্রুটি বার্তা প্রিন্ট করার পরে টুলটি _exit() এর পরিবর্তে abort() কল করে।

বৈধতা

বর্তমানে, স্কুডোর জন্য বিশেষভাবে কোন CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে CTS পরীক্ষাগুলি একটি প্রদত্ত বাইনারির জন্য Scudo সক্ষম করা সহ বা ছাড়াই পাস করেছে যাতে এটি ডিভাইসটিকে প্রভাবিত করে না।

সমস্যা সমাধান

যদি একটি অ-পুনরুদ্ধারযোগ্য সমস্যা সনাক্ত করা হয়, তবে বরাদ্দকারী স্ট্যান্ডার্ড ত্রুটি বর্ণনাকারীকে একটি ত্রুটি বার্তা প্রদর্শন করে এবং তারপর প্রক্রিয়াটি বন্ধ করে দেয়। স্ট্যাক ট্রেসগুলি যা সমাপ্তির দিকে নিয়ে যায় সিস্টেম লগে যোগ করা হয়। আউটপুট সাধারণত Scudo ERROR: যেকোনো পয়েন্টার সহ সমস্যার একটি সংক্ষিপ্ত সারাংশ অনুসরণ করে।

এখানে বর্তমান ত্রুটি বার্তা এবং তাদের সম্ভাব্য কারণগুলির একটি তালিকা রয়েছে:

  • corrupted chunk header : খণ্ড শিরোনামটির চেকসাম যাচাইকরণ ব্যর্থ হয়েছে। এটি সম্ভবত দুটি জিনিসের একটির কারণে: শিরোনামটি ওভাররাইট করা হয়েছে (আংশিক বা সম্পূর্ণ), বা ফাংশনে পাস করা পয়েন্টারটি একটি অংশ নয়।
  • race on chunk header : দুটি ভিন্ন থ্রেড একই সময়ে একই হেডারকে ম্যানিপুলেট করার চেষ্টা করছে। এটি সাধারণত জাতিগত অবস্থার লক্ষণ বা সেই অংশে অপারেশন করার সময় লকিংয়ের সাধারণ অভাব।
  • invalid chunk state : খণ্ডটি প্রদত্ত অপারেশনের জন্য প্রত্যাশিত অবস্থায় নেই, উদাহরণস্বরূপ, এটিকে মুক্ত করার চেষ্টা করার সময় এটি বরাদ্দ করা হয় না, বা এটি পুনর্ব্যবহার করার চেষ্টা করার সময় এটি পৃথক করা হয় না। একটি ডবল ফ্রি এই ত্রুটির জন্য সাধারণ কারণ.
  • misaligned pointer : প্রাথমিক প্রান্তিককরণের প্রয়োজনীয়তাগুলি দৃঢ়ভাবে প্রয়োগ করা হয়েছে: 32-বিট প্ল্যাটফর্মে 8 বাইট এবং 64-বিট প্ল্যাটফর্মে 16 বাইট৷ যদি আমাদের ফাংশনে পাস করা একটি পয়েন্টার সেগুলির সাথে মানানসই না হয়, তবে একটি ফাংশনে পাস করা পয়েন্টারটি প্রান্তিককরণের বাইরে থাকে।
  • allocation type mismatch : যখন এই বিকল্পটি সক্রিয় থাকে, তখন একটি অংশে ডাকা একটি ডিলোকেশন ফাংশনকে বরাদ্দ করার জন্য যে ফাংশনটি কল করা হয়েছিল তার সাথে মেলে। এই ধরনের অমিল নিরাপত্তা সমস্যা প্রবর্তন করতে পারে।
  • invalid sized delete : যখন C++14 আকারের ডিলিট অপারেটর ব্যবহার করা হয় এবং ঐচ্ছিক চেকটি সক্ষম করা হয়, তখন একটি অংশ ডিললোকেট করার সময় পাস করা সাইজ এবং এটি বরাদ্দ করার সময় অনুরোধ করা আকারের মধ্যে একটি অমিল থাকে। এটি সাধারণত একটি কম্পাইলার সমস্যা বা ডিলোকেটেড অবজেক্টের টাইপ বিভ্রান্তি
  • RSS limit exhausted : ঐচ্ছিকভাবে নির্দিষ্ট করা সর্বোচ্চ RSS অতিক্রম করা হয়েছে।

আপনি যদি OS নিজেই একটি ক্র্যাশ ডিবাগ করছেন, আপনি একটি HWASan OS বিল্ড ব্যবহার করতে পারেন। আপনি যদি কোনো অ্যাপে ক্র্যাশ ডিবাগ করছেন, তাহলে HWASan অ্যাপ বিল্ডও ব্যবহার করা সম্ভব।