Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

এলএলভিএম স্যানিটাইজার্স

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

অ্যান্ড্রয়েড বিল্ডসগুলির পক্ষে অ্যাড্রেসসেনিটিজার এবং অপরিজ্ঞাত বিহাইভায়ারসিএনটিজারের মতো স্যানিটাইজারগুলি সক্ষম করে বুট করা এবং চালানোর পক্ষে এটি সেরা অনুশীলন। এই পৃষ্ঠাতে অ্যাড্রেসসিনটিজার, অপরিজ্ঞাত বিহাইভিসান্সিটিজার এবং কার্নেলএড্রেসসানটিজার পরিচয় করানো হয়েছে, সেগুলি কীভাবে অ্যান্ড্রয়েড বিল্ড সিস্টেমের মধ্যে ব্যবহার করা যায় তা দেখায় এবং Android.mk এবং Android.bp ফাইল দেয় যা এই স্যানিটাইজারগুলি সক্ষম করে দেশীয় উপাদান তৈরি করে enabled

অ্যাড্রেস স্যানিটাইজার

অ্যাড্রেস স্যানিটাইজার (এএসএন) একটি সংকলক ভিত্তিক উপকরণের ক্ষমতা যা রানটাইম সময়ে সি / সি ++ কোডে অনেক ধরণের মেমরি ত্রুটি সনাক্ত করে। আসান মেমরি ত্রুটিগুলির অনেকগুলি ক্লাস সনাক্ত করতে পারে, সহ:

  • সীমার বাইরে থাকা মেমরি অ্যাক্সেস
  • ডাবল ফ্রি
  • ব্যবহারের পরে বিনামূল্যে

অ্যান্ড্রয়েড পূর্ণ-বিল্ড স্তরে এবং আসানওয়ারাপার সহ অ্যাপ্লিকেশন স্তরে আসান উপকরণের জন্য অনুমতি দেয়।

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

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

87141d674 বি

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

কোনও লক্ষ্য ডিভাইসে এএসএএন কার্যকরী তা যাচাই করতে, অ্যান্ড্রয়েড অ্যাসন_টেস্ট এক্সিকিউটেবলকে অন্তর্ভুক্ত করেছে। Asan_test নির্বাহযোগ্য পরীক্ষা এবং প্রতিটি পরীক্ষার স্থিতি সহ ডায়াগনস্টিক বার্তা দেয়, একটি লক্ষ্য ডিভাইসে ASAN কার্যকারিতা বৈধ করে। কোনও এএসএন অ্যান্ড্রয়েড বিল্ড ব্যবহার করার সময়, এটি /data/nativetest/asan_test/asan_test বা /data/nativetest64/asan_test/asan_test

অপরিজ্ঞাত বিহাইভিয়ারস্যানিটাইজার

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

বাস্তবায়ন

অ্যান্ড্রয়েড বিল্ড সিস্টেমে আপনি বিশ্বব্যাপী বা স্থানীয়ভাবে ইউবিএসান সক্ষম করতে পারবেন। বিশ্বব্যাপী ইউবিসান সক্ষম করতে, Android.mk এ সান্টিজিটলজিট সেট করুন। প্রতি মডিউল স্তরে ইউবিএস সক্ষম করতে, LOCAL_SANITIZE সেট করুন এবং অ্যান্ড্রয়েড.এমকে আপনি যে অনির্ধারিত আচরণগুলি সন্ধান করতে চান তা নির্ধারণ করুন। উদাহরণ স্বরূপ:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0

LOCAL_SRC_FILES:= sanitizer-status.c

LOCAL_MODULE:= sanitizer-status

LOCAL_SANITIZE := alignment bounds null unreachable integer
LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer

include $(BUILD_EXECUTABLE)

অ্যান্ড্রয়েড বিল্ড সিস্টেম মেকফিলগুলির মতো নীলচিত্রের ফাইলগুলিতে বিশদ ডায়াগনস্টিক হিসাবে এখনও সমর্থন করে না। এখানে একটি ব্লুপ্রিন্ট (Android.bp) হিসাবে লেখা নিকটতম সমতুল্য:

cc_binary {

    cflags: [
        "-std=c11",
        "-Wall",
        "-Werror",
        "-O0",
    ],

    srcs: ["sanitizer-status.c"],

    name: "sanitizer-status",

    sanitize: {
        misc_undefined: [
            "alignment",
            "bounds",
            "null",
            "unreachable",
            "integer",
        ],
        diag: {
            undefined : true
        },
    },

}

ইউবিএস শর্টকাট

অ্যানড্রয়েডে একই সাথে স্যানিটাইজারগুলির একটি সেট সক্ষম করতে দুটি শর্টকাট, integer এবং default-ub । পূর্ণসংখ্যা integer-divide-by-zero , signed-integer-overflow এবং unsigned-integer-overflowdefault-ub ইউবি চেকগুলিকে ন্যূনতম সংকলক পারফরম্যান্সের সমস্যাগুলি সক্ষম করে: বুল, পূর্ণসংখ্যা-বিভাজন দ্বারা শূন্য, রিটার্ন, রিটার্ন-ননল-অ্যাট্রিবিউট, শিফট-এক্সপোঞ্জ্যান্ট, অ্যাক্সেসযোগ্য এবং ভিএলএ-আবদ্ধ। পূর্ণসংখ্যার স্যানিটাইজার ক্লাসটি সানিটিজিটলজিট এবং লোক্যাল এসএএনআইটিআইজেই ব্যবহার করা যেতে পারে, যখন ডিফল্ট-ইউব শুধুমাত্র সানিটিজলট্রেট ব্যবহার করা যায়।

ভাল ত্রুটি প্রতিবেদন

যখন অপরিজ্ঞাত আচরণের মুখোমুখি হয় তখন অ্যান্ড্রয়েডের ডিফল্ট ইউবিএস বাস্তবায়ন একটি নির্দিষ্ট ফাংশনটির ডাক দেয়। ডিফল্টরূপে, এই ফাংশনটি বাতিল। তবে, ২০১, সালের অক্টোবরে শুরু করে, অ্যান্ড্রয়েডে ইউবিএসের একটি alচ্ছিক রানটাইম লাইব্রেরি রয়েছে যা অপরিজ্ঞাত আচরণের ধরণ, ফাইল এবং উত্স কোড লাইন সম্পর্কিত তথ্য সহ আরও বিশদ ত্রুটির প্রতিবেদন দেয়। পূর্ণসংখ্যার চেকগুলির সাথে এই ত্রুটিটি প্রতিবেদন করতে সক্ষম করতে নিম্নলিখিতগুলিকে একটি Android.mk ফাইলে যুক্ত করুন:

LOCAL_SANITIZE:=integer
LOCAL_SANITIZE_DIAG:=integer

LOCAL_SANITIZE মানটি নির্মাণের সময় স্যানিটাইজারকে সক্ষম করে। LOCAL_SANITIZE_DIAG নির্দিষ্ট স্যানিটাইজারের জন্য ডায়াগনস্টিক মোড চালু করে। LOCAL_SANITIZE এবং LOCAL_SANITIZE_DIAG বিভিন্ন মানগুলিতে সেট করা সম্ভব তবে কেবলমাত্র LOCAL_SANITIZE এ যাচাইযোগ্যরা সক্ষম। যদি চেকটি LOCAL_SANITIZE এ নির্দিষ্ট না করা থাকে তবে LOCAL_SANITIZE_DIAG এ নির্দিষ্ট করা থাকে তবে চেকটি সক্ষম করা যায় না এবং ডায়াগনস্টিক বার্তা দেওয়া হয় না।

ইউবিএস রানটাইম লাইব্রেরি প্রদত্ত তথ্যের উদাহরণ এখানে রয়েছে:

pixel-xl:/ # sanitizer-status ubsan
sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')

কার্নেল ঠিকানা স্যানিটাইজার

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

KASAN কার্নেলে অনেক ধরণের মেমরি লঙ্ঘন সনাক্ত করতে পারে। এটি স্ট্যাক, হিপ এবং গ্লোবাল ভেরিয়েবলগুলিতে বহিরাগত পঠন এবং লেখা সনাক্ত করতে পারে এবং ব্যবহারের পরে মুক্ত এবং ডাবল ফ্রিজ সনাক্ত করতে পারে।

এএসএনের মতোই, ক্যাসন রানটাইমে মেমরি অ্যাক্সেসগুলি ট্র্যাক করতে সংকলন সময়ে মেমরি-ফাংশন উপকরণের সংমিশ্রণ এবং ছায়া মেমরি ব্যবহার করে। কাসানে, কার্নেল মেমরির এক অষ্টম স্থান ছায়া মেমরির জন্য উত্সর্গীকৃত, যা মেমরি অ্যাক্সেস বৈধ কিনা তা নির্ধারণ করে।

কাসান x86_64 এবং আর্ম 64 আর্কিটেকচারে সমর্থিত। এটি ৪.০ সাল থেকে আপস্ট্রিম কার্নেলের অংশ এবং অ্যান্ড্রয়েড 18.১৮-ভিত্তিক কার্নেলগুলিতে ব্যাকপোর্ট করা হয়েছে। ৪.৯.২. ভিত্তিতে জিসিসি সহ সংকলিত অ্যান্ড্রয়েড কার্নেলগুলিতে কাসান পরীক্ষা করা হয়েছে।

কেএএসএএন ছাড়াও, কেসিওভ হল আরেকটি কার্নেল পরিবর্তন যা পরীক্ষার জন্য কার্যকর। kcovটি কার্নেলের মধ্যে কভারেজ-গাইডেড ফজ পরীক্ষার অনুমতি দেওয়ার জন্য তৈরি করা হয়েছিল। এটি সিস্কল ইনপুটগুলির ক্ষেত্রে কভারেজ পরিমাপ করে এবং ফিজিং সিস্টেমগুলির ক্ষেত্রে যেমন সিজকলারের ক্ষেত্রে কার্যকর

বাস্তবায়ন

KASAN এবং kcov সক্ষম সহ একটি কার্নেল সংকলন করতে আপনার কার্নেল বিল্ড কনফিগারেশনে নিম্নলিখিত বিল্ড ফ্ল্যাগগুলি যুক্ত করুন:

CONFIG_KASAN 
CONFIG_KASAN_INLINE 
CONFIG_TEST_KASAN 
CONFIG_KCOV 
CONFIG_SLUB 
CONFIG_SLUB_DEBUG 
CONFIG_CC_OPTIMIZE_FOR_SIZE

এবং নিম্নলিখিতগুলি মুছে ফেলা হচ্ছে:

CONFIG_SLUB_DEBUG_ON 
CONFIG_SLUB_DEBUG_PANIC_ON 
CONFIG_KASAN_OUTLINE 
CONFIG_KERNEL_LZ4

তারপরে যথারীতি আপনার কার্নেলটি তৈরি করুন এবং ফ্ল্যাশ করুন। কেএএসএএন কার্নেলটি মূলের চেয়ে যথেষ্ট বড়। যদি প্রযোজ্য হয়, এটিকে বিবেচনায় নেওয়ার জন্য কোনও বুট পরামিতি এবং বুটলোডার সেটিংস সংশোধন করুন।

কার্নেলটি ফ্ল্যাশ করার পরে, কাশান সক্ষম ও চালু আছে কিনা তা দেখতে কার্নেল বুট লগগুলি পরীক্ষা করুন। কার্নেলটি KASAN এর জন্য মেমরি মানচিত্রের তথ্য দিয়ে শুরু করবে, যেমন:

...
[    0.000000] c0      0 Virtual kernel memory layout:
[    0.000000] c0      0     kasan   : 0xffffff8000000000 - 0xffffff9000000000   (    64 GB)
[    0.000000] c0      0     vmalloc : 0xffffff9000010000 - 0xffffffbdbfff0000   (   182 GB)
[    0.000000] c0      0     vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
[    0.000000] c0      0               0xffffffbdc0000000 - 0xffffffbdc3f95400   (    63 MB actual)
[    0.000000] c0      0     PCI I/O : 0xffffffbffa000000 - 0xffffffbffb000000   (    16 MB)
[    0.000000] c0      0     fixed   : 0xffffffbffbdfd000 - 0xffffffbffbdff000   (     8 KB)
[    0.000000] c0      0     modules : 0xffffffbffc000000 - 0xffffffc000000000   (    64 MB)
[    0.000000] c0      0     memory  : 0xffffffc000000000 - 0xffffffc0fe550000   (  4069 MB)
[    0.000000] c0      0       .init : 0xffffffc001d33000 - 0xffffffc001dce000   (   620 KB)
[    0.000000] c0      0       .text : 0xffffffc000080000 - 0xffffffc001d32284   ( 29385 KB)
...

এবং বাগটি এইভাবে দেখবে:

[   18.539668] c3      1 ==================================================================
[   18.547662] c3      1 BUG: KASAN: null-ptr-deref on address 0000000000000008
[   18.554689] c3      1 Read of size 8 by task swapper/0/1
[   18.559988] c3      1 CPU: 3 PID: 1 Comm: swapper/0 Tainted: G        W      3.18.24-xxx #1
[   18.569275] c3      1 Hardware name: Android Device
[   18.577433] c3      1 Call trace:
[   18.580739] c3      1 [<ffffffc00008b32c>] dump_backtrace+0x0/0x2c4
[   18.586985] c3      1 [<ffffffc00008b600>] show_stack+0x10/0x1c
[   18.592889] c3      1 [<ffffffc001481194>] dump_stack+0x74/0xc8
[   18.598792] c3      1 [<ffffffc000202ee0>] kasan_report+0x11c/0x4d0
[   18.605038] c3      1 [<ffffffc00020286c>] __asan_load8+0x20/0x80
[   18.611115] c3      1 [<ffffffc000bdefe8>] android_verity_ctr+0x8cc/0x1024
[   18.617976] c3      1 [<ffffffc000bcaa2c>] dm_table_add_target+0x3dc/0x50c
[   18.624832] c3      1 [<ffffffc001bdbe60>] dm_run_setup+0x50c/0x678
[   18.631082] c3      1 [<ffffffc001bda8c0>] prepare_namespace+0x44/0x1ac
[   18.637676] c3      1 [<ffffffc001bda170>] kernel_init_freeable+0x328/0x364
[   18.644625] c3      1 [<ffffffc001478e20>] kernel_init+0x10/0xd8
[   18.650613] c3      1 ==================================================================

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