স্কুডো হলো একটি ডাইনামিক ইউজার-মোড মেমরি অ্যালোকেটর বা হিপ অ্যালোকেটর, যা পারফরম্যান্স বজায় রেখে হিপ-সম্পর্কিত দুর্বলতা (যেমন হিপ-ভিত্তিক বাফার ওভারফ্লো , ইউজ আফটার ফ্রি এবং ডাবল ফ্রি ) থেকে সুরক্ষিত থাকার জন্য ডিজাইন করা হয়েছে। এটি স্ট্যান্ডার্ড C অ্যালোকেশন ও ডিঅ্যালোকেশন প্রিমিটিভ (যেমন malloc ও free) এবং C++ প্রিমিটিভ (যেমন new ও delete) উভয়ই প্রদান করে।
অ্যাড্রেসস্যানিটাইজার (ASan)-এর মতো একটি পূর্ণাঙ্গ মেমরি ত্রুটি শনাক্তকারী হওয়ার চেয়ে স্কুডো মূলত একটি প্রশমন ব্যবস্থা।
অ্যান্ড্রয়েড ১১ প্রকাশের পর থেকে, সমস্ত নেটিভ কোডের জন্য স্কুডো (scudo) ব্যবহৃত হয় (তবে কম মেমোরির ডিভাইসগুলো এর ব্যতিক্রম, যেখানে এখনও জেম্যালক (jemalloc) ব্যবহৃত হয়)। রানটাইমে, সমস্ত এক্সিকিউটেবল এবং তাদের লাইব্রেরি নির্ভরতার জন্য নেটিভ হিপের সমস্ত অ্যালোকেশন ও ডিঅ্যালোকেশনের কাজ স্কুডো দ্বারা সম্পন্ন করা হয়, এবং হিপে কোনো ত্রুটি বা সন্দেহজনক আচরণ শনাক্ত হলে প্রক্রিয়াটি বন্ধ করে দেওয়া হয়।
স্কুডো একটি ওপেন সোর্স এবং এলএলভিএম-এর কম্পাইলার-আরটি (compiler-rt) প্রকল্পের অংশ। এর ডকুমেন্টেশন https://llvm.org/docs/ScudoHardenedAllocator.html -এ পাওয়া যায়। স্কুডো রানটাইমটি অ্যান্ড্রয়েড টুলচেইনের অংশ হিসেবে অন্তর্ভুক্ত থাকে এবং একটি বাইনারিতে অ্যালোকেটরটি সহজে সক্রিয় করার জন্য সুং (Soong) ও মেক (Make) -এ এর সাপোর্ট যোগ করা হয়েছে।
নিচে বর্ণিত অপশনগুলো ব্যবহার করে আপনি অ্যালোকেটরের মধ্যে অতিরিক্ত প্রশমন ব্যবস্থা চালু বা বন্ধ করতে পারেন।
কাস্টমাইজেশন
অ্যালোকেটরের কিছু প্যারামিটার বিভিন্ন উপায়ে প্রসেস-ভিত্তিক ভাবে সংজ্ঞায়িত করা যেতে পারে:
- স্ট্যাটিক্যালি: প্রোগ্রামে একটি
__scudo_default_optionsফাংশন সংজ্ঞায়িত করুন যা পার্স করার জন্য অপশন স্ট্রিংটি রিটার্ন করে। এই ফাংশনটির প্রোটোটাইপ অবশ্যই নিম্নলিখিত হতে হবে:extern "C" const char *__scudo_default_options(). - গতিশীলভাবে: পার্স করার জন্য অপশন স্ট্রিং ধারণকারী
SCUDO_OPTIONSএনভায়রনমেন্ট ভেরিয়েবলটি ব্যবহার করুন। এইভাবে সংজ্ঞায়িত অপশনগুলো__scudo_default_optionsএর মাধ্যমে করা যেকোনো সংজ্ঞাকে ওভাররাইড করে।
নিম্নলিখিত বিকল্পগুলি উপলব্ধ আছে।
| বিকল্প | ৬৪-বিট ডিফল্ট | ৩২-বিট ডিফল্ট | বর্ণনা |
|---|---|---|---|
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 | এটি নির্দিষ্ট করে যে, পুনরুদ্ধারযোগ্য কোনো ত্রুটি ঘটলে প্রসেসটি বন্ধ না করে অ্যালোকেটরটি null রিটার্ন করতে পারে। |
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 | 5000 | প্রযোজ্য নয় | এটি শুধুমাত্র একটি ৬৪-বিট অ্যালোকেটরকে প্রভাবিত করে। যদি এটি সেট করা থাকে, তবে এটি অব্যবহৃত মেমরি OS-এর কাছে ছেড়ে দেওয়ার চেষ্টা করে, কিন্তু এই নির্দিষ্ট ব্যবধানের (মিলিসেকেন্ডে) চেয়ে বেশি ঘন ঘন নয়। যদি মানটি ঋণাত্মক হয়, তবে মেমরি OS-এর কাছে ছেড়ে দেওয়া হয় না। |
abort_on_error | true | true | এটি সেট করা থাকলে, টুলটি ত্রুটির বার্তা প্রিন্ট করার পর _exit() এর পরিবর্তে abort() কল করে। |
বৈধতা
বর্তমানে, Scudo-এর জন্য বিশেষভাবে কোনো CTS টেস্ট নেই। এর পরিবর্তে, কোনো নির্দিষ্ট বাইনারি ডিভাইসের উপর কোনো প্রভাব ফেলছে না তা যাচাই করার জন্য, Scudo চালু থাকা বা না থাকা উভয় অবস্থাতেই CTS টেস্টগুলো পাস করছে কিনা তা নিশ্চিত করুন।
সমস্যা সমাধান
যদি কোনো অ-পুনরুদ্ধারযোগ্য সমস্যা শনাক্ত করা হয়, তাহলে অ্যালোকেটরটি স্ট্যান্ডার্ড এরর ডেসক্রিপ্টরে একটি ত্রুটি বার্তা প্রদর্শন করে এবং তারপর প্রসেসটি বন্ধ করে দেয়। যে স্ট্যাক ট্রেসগুলোর কারণে প্রসেসটি বন্ধ করা হয়, সেগুলো সিস্টেম লগে যুক্ত করা হয়। আউটপুটটি সাধারণত Scudo ERROR: দিয়ে শুরু হয় এবং এর পরে সমস্যাটির একটি সংক্ষিপ্ত সারসংক্ষেপ ও যেকোনো নির্দেশিকা থাকে।
বর্তমান ত্রুটি বার্তাগুলো এবং সেগুলোর সম্ভাব্য কারণগুলোর একটি তালিকা নিচে দেওয়া হলো:
-
corrupted chunk header: চাঙ্ক হেডারের চেক্সাম যাচাইকরণ ব্যর্থ হয়েছে। এর সম্ভাব্য দুটি কারণের একটি হলো: হেডারটি (আংশিকভাবে বা সম্পূর্ণভাবে) ওভাররাইট করা হয়েছে, অথবা ফাংশনে পাঠানো পয়েন্টারটি একটি চাঙ্ক নয়। -
race on chunk header: দুটি ভিন্ন থ্রেড একই সময়ে একই হেডার ম্যানিপুলেট করার চেষ্টা করছে। এটি সাধারণত একটি রেস-কন্ডিশন অথবা ঐ চাঙ্কে অপারেশন করার সময় লকিংয়ের সাধারণ অভাবের লক্ষণ। -
invalid chunk state: কোনো নির্দিষ্ট অপারেশনের জন্য চাঙ্কটি প্রত্যাশিত অবস্থায় নেই। উদাহরণস্বরূপ, এটিকে ফ্রি করার চেষ্টা করার সময় এটি অ্যালোকেট করা নেই, অথবা এটিকে রিসাইকেল করার চেষ্টা করার সময় কোয়ারেন্টাইন করা নেই। ডাবল ফ্রি হলো এই ত্রুটির সাধারণ কারণ। -
misaligned pointer: মৌলিক অ্যালাইনমেন্টের নিয়মাবলী কঠোরভাবে প্রয়োগ করা হয়: ৩২-বিট প্ল্যাটফর্মে ৮ বাইট এবং ৬৪-বিট প্ল্যাটফর্মে ১৬ বাইট। যদি আমাদের ফাংশনগুলিতে পাঠানো কোনো পয়েন্টার এই মাপের না হয়, তাহলে ফাংশনগুলির মধ্যে কোনো একটিতে পাঠানো পয়েন্টারটি অ্যালাইনমেন্টের বাইরে থাকবে। -
allocation type mismatch: যখন এই অপশনটি সক্রিয় করা হয়, তখন কোনো চাঙ্কের উপর কল করা ডিঅ্যালোকেশন ফাংশনটির টাইপ অবশ্যই সেই ফাংশনের টাইপের সাথে মিলতে হবে যা দিয়ে সেটিকে অ্যালোকেট করা হয়েছিল। এই ধরনের অমিল নিরাপত্তাজনিত সমস্যা তৈরি করতে পারে। -
invalid sized delete: যখন C++14 সাইজড ডিলিট অপারেটর ব্যবহার করা হয় এবং ঐচ্ছিক চেকটি সক্রিয় থাকে, তখন একটি চাঙ্ক ডিঅ্যালোকেট করার সময় পাস করা আকার এবং এটি অ্যালোকেট করার সময় অনুরোধ করা আকারের মধ্যে অমিল দেখা দেয়। এটি সাধারণত একটি কম্পাইলার সমস্যা অথবা যে অবজেক্টটি ডিঅ্যালোকেট করা হচ্ছে তার টাইপ নিয়ে বিভ্রান্তির কারণে হয়ে থাকে। -
RSS limit exhausted: ঐচ্ছিকভাবে নির্দিষ্ট করা সর্বোচ্চ আরএসএস সীমা অতিক্রম করা হয়েছে।
যদি আপনি সরাসরি অপারেটিং সিস্টেমের কোনো ক্র্যাশ ডিবাগ করেন, তাহলে আপনি একটি HWASan OS বিল্ড ব্যবহার করতে পারেন। যদি আপনি কোনো অ্যাপের ক্র্যাশ ডিবাগ করেন, তাহলেও একটি HWASan অ্যাপ বিল্ড ব্যবহার করা সম্ভব।