পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন

অনিচ্ছাকৃত পূর্ণসংখ্যা ওভারফ্লো মেমরি অ্যাক্সেস বা মেমরি বরাদ্দের সাথে যুক্ত ভেরিয়েবলে মেমরি দুর্নীতি বা তথ্য প্রকাশের দুর্বলতা সৃষ্টি করতে পারে। এটি মোকাবেলা করার জন্য, আমরা Android 7.0- এ মিডিয়া ফ্রেমওয়ার্ককে শক্ত করার জন্য Clang-এর Undefined Behavior Sanitizer (UBSan) স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজার যুক্ত করেছি। অ্যান্ড্রয়েড 9-এ, আমরা আরও উপাদান কভার করতে UBSan প্রসারিত করেছি এবং এটির জন্য উন্নত বিল্ড সিস্টেম সমর্থন করেছি।

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

উদাহরণ এবং উৎস

পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন (IntSan) কম্পাইলার দ্বারা সরবরাহ করা হয় এবং গাণিতিক ওভারফ্লো সনাক্ত করতে কম্পাইলের সময় বাইনারিতে উপকরণ যোগ করে। এটি প্ল্যাটফর্ম জুড়ে বিভিন্ন উপাদানে ডিফল্টরূপে সক্রিয় থাকে, উদাহরণস্বরূপ /platform/external/libnl/Android.bp

বাস্তবায়ন

IntSan UBSan-এর স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজার ব্যবহার করে। প্রতি-মডিউল স্তরে এই প্রশমন সক্রিয় করা হয়েছে। এটি Android এর গুরুত্বপূর্ণ উপাদানগুলিকে সুরক্ষিত রাখতে সাহায্য করে এবং অক্ষম করা উচিত নয়৷

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

মেকফাইলে IntSan সমর্থন করা

একটি মেকফাইলে IntSan সক্ষম করতে, যোগ করুন:

LOCAL_SANITIZE := integer_overflow
# Optional features
LOCAL_SANITIZE_DIAG := integer_overflow
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
  • LOCAL_SANITIZE স্যানিটাইজারগুলির একটি কমা দ্বারা বিভক্ত তালিকা নেয়, integer_overflow একটি ডিফল্ট ব্ল্যাকলিস্ট সহ স্বতন্ত্র স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারগুলির জন্য একটি প্রাক-প্যাকেজ করা বিকল্পের সেট।
  • LOCAL_SANITIZE_DIAG স্যানিটাইজারগুলির জন্য ডায়াগনস্টিক মোড চালু করে৷ শুধুমাত্র পরীক্ষার সময় ডায়াগনস্টিক মোড ব্যবহার করুন কারণ এটি ওভারফ্লোতে স্থগিত করবে না, প্রশমনের নিরাপত্তা সুবিধাকে সম্পূর্ণরূপে অস্বীকার করবে। অতিরিক্ত বিবরণের জন্য সমস্যা সমাধান দেখুন।
  • LOCAL_SANITIZE_BLACKLIST আপনাকে ফাংশন এবং সোর্স ফাইলগুলিকে স্যানিটাইজ করা থেকে আটকাতে একটি কালো তালিকা ফাইল নির্দিষ্ট করতে দেয়৷ অতিরিক্ত বিবরণের জন্য সমস্যা সমাধান দেখুন।

আপনি যদি আরও দানাদার নিয়ন্ত্রণ চান, এক বা উভয় পতাকা ব্যবহার করে পৃথকভাবে স্যানিটাইজার সক্ষম করুন:

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

ব্লুপ্রিন্ট ফাইলে IntSan সমর্থন করা

একটি ব্লুপ্রিন্ট ফাইলে পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন সক্ষম করতে, যেমন /platform/external/libnl/Android.bp , যোগ করুন:

   sanitize: {
      integer_overflow: true,
      diag: {
          integer_overflow: true,
      },
      blacklist: "modulename_blacklist.txt",
   },

মেক ফাইলের মতো, integer_overflow প্রপার্টি হল একটি ডিফল্ট ব্ল্যাকলিস্ট সহ স্বতন্ত্র স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারগুলির জন্য একটি প্রাক-প্যাকেজ করা বিকল্প।

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

blacklist প্রোপার্টি একটি ব্ল্যাকলিস্ট ফাইলের স্পেসিফিকেশনের অনুমতি দেয় যা ডেভেলপারদের ফাংশন এবং সোর্স ফাইলগুলিকে স্যানিটাইজ করা থেকে আটকাতে দেয়। অতিরিক্ত বিবরণের জন্য সমস্যা সমাধান দেখুন।

পৃথকভাবে স্যানিটাইজার সক্ষম করতে, ব্যবহার করুন:

   sanitize: {
      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
      diag: {
          misc_undefined: ["signed-integer-overflow",
                           "unsigned-integer-overflow",],
      },
      blacklist: "modulename_blacklist.txt",
   },

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

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

ইউজার বিল্ডে স্যানিটাইজেশনের ফলে সৃষ্ট গর্ভপাত খুঁজে পেতে, UBSan দ্বারা ধরা ওভারফ্লো নির্দেশ করে Abort বার্তাগুলির সাথে SIGABRT ক্র্যাশগুলি অনুসন্ধান করুন, যেমন:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: sub-overflow'

স্ট্যাক ট্রেসে সেই ফাংশনটি অন্তর্ভুক্ত করা উচিত যা গর্ভপাত ঘটায়, তবে, ইনলাইন ফাংশনে হওয়া ওভারফ্লোগুলি স্ট্যাক ট্রেসে স্পষ্ট নাও হতে পারে।

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

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

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

  • ওভারফ্লো এড়াতে কোড রিফ্যাক্টরিং ( উদাহরণ )
  • ক্ল্যাং এর __builtin__*_overflow ফাংশনের মাধ্যমে স্পষ্টভাবে ওভারফ্লো ( উদাহরণ )
  • no_sanitize বৈশিষ্ট্য ( উদাহরণ ) নির্দিষ্ট করে ফাংশনে স্যানিটাইজেশন অক্ষম করা
  • একটি কালো তালিকা ফাইলের মাধ্যমে একটি ফাংশন বা উত্স ফাইলের স্যানিটাইজেশন অক্ষম করা ( উদাহরণ )

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

সৌম্য ওভারফ্লো হতে পারে এমন সাধারণ নিদর্শনগুলির মধ্যে রয়েছে:

  • অন্তর্নিহিত কাস্ট যেখানে একটি স্বাক্ষরবিহীন ওভারফ্লো একটি স্বাক্ষরিত প্রকারে কাস্ট হওয়ার আগে ঘটে ( উদাহরণ )
  • লিঙ্কযুক্ত তালিকা মুছে ফেলা যা মুছে ফেলার সময় লুপ সূচককে হ্রাস করে ( উদাহরণ )
  • প্রকৃত সর্বোচ্চ মান নির্দিষ্ট করার পরিবর্তে -1-এ একটি স্বাক্ষরবিহীন প্রকার বরাদ্দ করা ( উদাহরণ )
  • লুপ যা শর্তে একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা হ্রাস করে ( উদাহরণ , উদাহরণ )

এটা বাঞ্ছনীয় যে ডেভেলপারদের আশ্বস্ত করা হয় যে স্যানিটাইজারটি একটি ওভারফ্লো শনাক্ত করে যে স্যানিটাইজেশন নিষ্ক্রিয় করার আগে এটি কোনও অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া বা নিরাপত্তার প্রভাব ছাড়াই সৌম্য।

IntSan অক্ষম করা হচ্ছে

আপনি কালো তালিকা বা ফাংশন বৈশিষ্ট্য সহ IntSan নিষ্ক্রিয় করতে পারেন। অল্প পরিমাণে অক্ষম করুন এবং শুধুমাত্র যখন কোড রিফ্যাক্টর করা অন্যথায় অযৌক্তিক হয় বা যদি সমস্যাযুক্ত কর্মক্ষমতা ওভারহেড থাকে।

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

বৈধতা

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