সারসংক্ষেপ
১. ভূমিকা
২. পটভূমি
৩. থ্রেট মডেল
৪. ট্যাগ লিকেজ গ্যাজেট খুঁজে বের করা
৫. TIKTAG গ্যাজেট
৬. বাস্তব-বিশ্বের আক্রমণ
৬.১. Chrome আক্রমণ করা
৭. মূল্যায়ন
৮. সংশ্লিষ্ট কাজ
৯. উপসংহার এবং রেফারেন্স
\
MTE-ভিত্তিক প্রশমনে TIKTAG গ্যাজেটের শোষণযোগ্যতা প্রদর্শনের জন্য, এই বিভাগে Chrome এবং Linux কার্নেলের বিরুদ্ধে দুটি বাস্তব-বিশ্বের আক্রমণ তৈরি করা হয়েছে (চিত্র ৯)। TIKTAG গ্যাজেট ব্যবহার করে বাস্তব-বিশ্বের আক্রমণ চালু করতে বেশ কিছু চ্যালেঞ্জ রয়েছে। প্রথমত, TIKTAG গ্যাজেটগুলি লক্ষ্য ঠিকানা স্পেসে কার্যকর হওয়া উচিত, যার জন্য আক্রমণকারীকে লক্ষ্য সিস্টেম থেকে গ্যাজেট তৈরি বা খুঁজে বের করতে হবে। দ্বিতীয়ত, আক্রমণকারীকে ট্যাগ চেক ফলাফল ফাঁস করার জন্য ক্যাশ অবস্থা নিয়ন্ত্রণ এবং পর্যবেক্ষণ করতে হবে। নিম্নলিখিতে, আমরা দুটি বাস্তব-বিশ্বের সিস্টেমে TIKTAG গ্যাজেট ব্যবহার করে বাস্তব-বিশ্বের আক্রমণ প্রদর্শন করি: Google Chrome ব্রাউজার (§৬.১) এবং Linux কার্নেল (§৬.২), এবং প্রশমন কৌশলগুলি আলোচনা করি।
\ ৬.১. Chrome আক্রমণ করা
ব্রাউজার একটি ওয়েব ব্রাউজার ওয়েব-ভিত্তিক আক্রমণের জন্য একটি প্রধান আক্রমণ পৃষ্ঠ কারণ এটি অবিশ্বস্ত ওয়েব কন্টেন্ট যেমন JavaScript এবং HTML প্রক্রিয়া করে। আমরা প্রথমে থ্রেট মডেল সংক্ষিপ্ত করি (§৬.১.১) এবং V8 JavaScript ইঞ্জিনে নির্মিত একটি TIKTAG গ্যাজেট প্রদান করি (§৬.১.২)। তারপর, আমরা ব্রাউজার শোষণে TIKTAG গ্যাজেটের কার্যকারিতা প্রদর্শন করি (§৬.১.৩) এবং প্রশমন কৌশলগুলি আলোচনা করি (§৬.১.৪)।
\ ==৬.১.১. থ্রেট মডেল।== আমরা Chrome ব্রাউজার আক্রমণের সাধারণ থ্রেট মডেল অনুসরণ করি, যেখানে আক্রমণকারী রেন্ডারার প্রসেসে মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করার লক্ষ্য রাখে। আমরা ধরে নিই যে ভিকটিম ব্যবহারকারী আক্রমণকারী-নিয়ন্ত্রিত ওয়েবসাইট পরিদর্শন করে, যা একটি ক্ষতিকারক ওয়েবপেজ পরিবেশন করে। ওয়েবপেজে কারুকাজ করা HTML এবং JavaScript অন্তর্ভুক্ত থাকে, যা ভিকটিমের রেন্ডারার প্রসেসে মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করে। আমরা ধরে নিই Chrome-এর সর্বাধুনিক প্রশমন কৌশলগুলি কার্যকর আছে, যার মধ্যে ASLR [১৮], CFI [১৫], সাইট আইসোলেশন [৫৩], এবং V8 স্যান্ডবক্স [৫৬] রয়েছে। অতিরিক্তভাবে, একটি অর্থোগোনাল প্রতিরক্ষা হিসাবে, আমরা ধরে নিই যে রেন্ডারার প্রসেস PartitionAlloc-এ র্যান্ডম MTE ট্যাগিং সক্ষম করে [২]।
\ ==৬.১.২. TIKTAG গ্যাজেট তৈরি করা।== V8 JavaScript পরিবেশে, TIKTAG-v2 সফলভাবে তৈরি করা হয়েছিল এবং যেকোনো মেমোরি ঠিকানার MTE ট্যাগ ফাঁস করেছিল। তবে, আমরা একটি নির্মাণযোগ্য TIKTAG-v1 গ্যাজেট খুঁজে পাইনি, কারণ BR এবং CHECK-এর মধ্যে কঠোর সময় সীমাবদ্ধতা আমাদের স্পেকুলেটিভ V8 স্যান্ডবক্স এস্কেপ কৌশলে সম্ভব ছিল না (§A)।
V8 TikTag-v2 গ্যাজেট। চিত্র ৮ হল V8 JavaScript ইঞ্জিনে নির্মিত TIKTAG-v2 গ্যাজেট এবং JIT কম্পাইলেশনের পরে এর সিউডো-C কোড। এই গ্যাজেটের সাহায্যে, আক্রমণকারী শিখতে পারে অনুমান করা ট্যাগ Tg target_addr-এ নিয়োগ করা ট্যাগ Tm-এর সাথে মিলে কিনা। আক্রমণকারী তিনটি অ্যারে, slow, victim, probe এবং একটি idx মান প্রস্তুত করে। slow হল ৬৪ দৈর্ঘ্যের একটি Unit8Array এবং ব্রাঞ্চ মিসপ্রিডিকশন ট্রিগার করতে BR-এ অ্যাক্সেস করা হয়। victim হল ৬৪ দৈর্ঘ্যের একটি Float64Array, যা স্টোর-টু-লোড ফরওয়ার্ডিং ট্রিগার করতে অ্যাক্সেস করা হয়। probe হল ৫১২ দৈর্ঘ্যের একটি Uint8Array, এবং
\ TEST-এ ট্যাগ চেক ফলাফল ফাঁস করতে অ্যাক্সেস করা হয়। একটি Number টাইপ idx মান victim-এর আউট-অফ-বাউন্ডস অ্যাক্সেসে ব্যবহৃত হয়। idx মান এমনভাবে নির্বাচিত হয় যে victim[idx] একটি অনুমান করা ট্যাগ Tg সহ target_addr নির্দেশ করে (অর্থাৎ, (Tg«৫৬)|target_addr)। V8 স্যান্ডবক্সের বাইরে target_addr স্পেকুলেটিভভাবে অ্যাক্সেস করতে, আমরা আমাদের গবেষণার সময় আবিষ্কৃত স্পেকুলেটিভ V8 স্যান্ডবক্স এস্কেপ কৌশল ব্যবহার করেছি, যা আমরা §A-তে বিস্তারিত করি। চিত্র ৮a-এর লাইন ৮ হল TIKTAG-v2 গ্যাজেটের BR ব্লক, slow[০] দিয়ে ব্রাঞ্চ মিসপ্রিডিকশন ট্রিগার করে।
\ লাইন ১২-১৩ হল CHECK ব্লক, যা victim[idx] দিয়ে স্টোর-টু-লোড ফরওয়ার্ডিং সম্পাদন করে, একটি অনুমান করা ট্যাগ Tg সহ target_addr অ্যাক্সেস করে। যখন এই কোড JIT-কম্পাইল করা হয় (চিত্র ৮b), একটি বাউন্ড চেক সম্পাদিত হয়, idx-কে victim.length-এর বিরুদ্ধে তুলনা করে। যদি idx একটি আউট-অফ-বাউন্ডস ইনডেক্স হয়, কোড undefined রিটার্ন করে, কিন্তু যদি victim.length ফিল্ড লোড হতে দীর্ঘ সময় নেয়, তাহলে CPU স্পেকুলেটিভভাবে নিম্নলিখিত স্টোর এবং লোড নির্দেশাবলী কার্যকর করে।
\ এর পরে, লাইন ১৭ TEST ব্লক বাস্তবায়ন করে, যা ফরওয়ার্ড করা মান val-কে ইনডেক্স হিসাবে probe অ্যাক্সেস করে। আবার, probe-এর দৈর্ঘ্যের বিরুদ্ধে val-এর উপর একটি বাউন্ড চেক পূর্বে করা হয়, কিন্তু এই চেক সফল হয় কারণ PROBE_OFFSET probe অ্যারের দৈর্ঘ্যের চেয়ে ছোট। ফলস্বরূপ, probe[PROBE_OFFSET] শুধুমাত্র তখনই ক্যাশ করা হয় যখন স্টোর-টু-লোড ফরওয়ার্ডিং সফল হয়, যা Tg Tm-এর সাথে মিলে যাওয়ার ক্ষেত্রে হয়।
\ ==৬.১.৩. Chrome MTE বাইপাস আক্রমণ।== চিত্র ৯a TIKTAG গ্যাজেটের স্বেচ্ছাচারী ট্যাগ লিকেজ প্রিমিটিভ সহ Chrome ব্রাউজারে সামগ্রিক MTE বাইপাস আক্রমণ চিত্রিত করে। আমরা রেন্ডারার প্রসেসে একটি বাফার ওভারফ্লো ভালনারাবিলিটি ধরে নিই, যেখানে একটি টেম্পোরাল ভালনারাবিলিটি (যেমন, use-after-free) শোষণ করা মূলত একই। ভালনারাবিলিটি একটি দুর্বল অবজেক্টে (অর্থাৎ, objvuln) একটি পয়েন্টার (অর্থাৎ, vuln_ptr) ওভারফ্লো করে, পাশের অবজেক্ট (অর্থাৎ, objtarget) দূষিত করে।
\ PartitionAlloc-এর MTE এনফোর্সমেন্ট সহ, দুটি অবজেক্টের ১৪/১৫ সম্ভাবনা সহ বিভিন্ন ট্যাগ আছে। একটি এক্সেপশন উত্থাপন এড়াতে, আক্রমণকারীকে নিশ্চিত করতে হবে যে objvuln এবং objtarget-এর ট্যাগ একই। TIKTAG-v2 objvuln ( ১ ) এবং objtarget ( ২ ) এর ট্যাগ ফাঁস করতে ব্যবহার করা যেতে পারে। যদি উভয় ফাঁস করা ট্যাগ একই হয়, আক্রমণকারী ভালনারাবিলিটি শোষণ করে, যা একটি ট্যাগ চেক ফল্ট উত্থাপন করবে না ( ৩ )। অন্যথায়, আক্রমণকারী objtarget মুক্ত করে এবং পুনরায় বরাদ্দ করে এবং প্রথম ধাপে ফিরে যায় যতক্ষণ না ট্যাগ মিলে।
\ ==ক্যাশ সাইড-চ্যানেল ট্রিগার করা।== একটি TIKTAG গ্যাজেট সফলভাবে শোষণ করতে, আক্রমণকারীকে নিম্নলিখিত প্রয়োজনীয়তা পূরণ করতে হবে:
i) ব্রাঞ্চ ট্রেনিং,
ii) ক্যাশ নিয়ন্ত্রণ, এবং
iii) ক্যাশ পরিমাপ। তিনটি প্রয়োজনীয়তাই JavaScript-এ পূরণ করা যেতে পারে।
প্রথমত, আক্রমণকারী নন-জিরো slow[০] এবং ইন-বাউন্ডস idx দিয়ে গ্যাজেট চালিয়ে ব্রাঞ্চ প্রিডিক্টর প্রশিক্ষণ দিতে পারে এবং জিরো মান slow[০] এবং আউট-অফ-বাউন্ডস idx দিয়ে BR-এ ব্রাঞ্চ মিসপ্রিডিকশন ট্রিগার করতে পারে।
দ্বিতীয়ত, আক্রমণকারী JavaScript ক্যাশ ইভিকশন কৌশল দিয়ে slow[০], victim.length এবং probe[PROBE_OFFSET]-এর ক্যাশ লাইন ইভিক্ট করতে পারে [৮, ২১, ৭০]।
তৃতীয়ত, আক্রমণকারী SharedArrayBuffer-ভিত্তিক একটি উচ্চ-রেজোলিউশন টাইমার দিয়ে probe[PROBE_OFFSET]-এর ক্যাশ স্ট্যাটাস পরিমাপ করতে পারে [১৬, ৫৮]।
\ ==মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করা।== ফাঁস করা MTE ট্যাগ দেওয়া হলে, আক্রমণকারী রেন্ডারারে স্থানিক এবং অস্থায়ী মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করতে পারে। আক্রমণ কৌশল মূলত ঐতিহ্যগত মেমোরি কারাপশন আক্রমণের মতোই কিন্তু নিশ্চিত করতে হবে যে ভালনারাবিলিটি ফাঁস করা ট্যাগ ব্যবহার করে একটি ট্যাগ চেক ফল্ট উত্থাপন করে না। আমরা §C-তে আক্রমণ কৌশল আরও বিস্তারিত করি।
\ ==৬.১.৪. প্রশমন।== ব্রাউজার রেন্ডারার প্রসেসে TIKTAG গ্যাজেট-ভিত্তিক MTE বাইপাস আক্রমণ প্রশমিত করতে, নিম্নলিখিত প্রশমনগুলি নিযুক্ত করা যেতে পারে:
i) স্পেকুলেটিভ এক্সিকিউশন-সচেতন স্যান্ডবক্স: V8 স্যান্ডবক্সের মতো স্যান্ডবক্সড পরিবেশ থেকে আক্রমণকারীদের TIKTAG-ভিত্তিক আক্রমণ চালু করা থেকে বিরত রাখতে, স্যান্ডবক্সের মেমোরি অঞ্চলের বাইরে যেকোনো স্পেকুলেটিভ মেমোরি অ্যাক্সেস প্রতিরোধ করে স্যান্ডবক্স শক্তিশালী করা যেতে পারে। আধুনিক ওয়েব ব্রাউজারগুলি রেন্ডারার থেকে অবিশ্বস্ত ওয়েব কন্টেন্ট আলাদা করতে একটি স্যান্ডবক্স ব্যবহার করে, কিন্তু তারা প্রায়শই স্পেকুলেটিভ পাথ উপেক্ষা করে।
\ উদাহরণস্বরূপ, Chrome V8 স্যান্ডবক্স [৫৬] এবং Safari Webkit স্যান্ডবক্স [১] সম্পূর্ণভাবে স্পেকুলেটিভ পাথ মধ্যস্থতা করে না [২৭]। বর্তমান পয়েন্টার কম্প্রেশন কৌশলের উপর ভিত্তি করে [৬৪], পয়েন্টারের উচ্চ বিট মাস্ক আউট করে স্পেকুলেটিভ পাথগুলি স্যান্ডবক্স অঞ্চলে সীমাবদ্ধ করা যেতে পারে।
\ ii) স্পেকুলেশন ব্যারিয়ার: §৫-এ প্রস্তাবিত হিসাবে, সম্ভাব্য TIKTAG গ্যাজেটের জন্য BR-এর পরে একটি স্পেকুলেশন ব্যারিয়ার স্থাপন স্পেকুলেটিভ ট্যাগ লিকেজ আক্রমণ প্রতিরোধ করতে পারে। তবে, এই প্রশমন পারফরম্যান্স-সমালোচনামূলক ব্রাউজার পরিবেশে প্রযোজ্য নাও হতে পারে, কারণ এটি উল্লেখযোগ্য পারফরম্যান্স ওভারহেড প্রবর্তন করতে পারে।
\ iii) গ্যাজেট নির্মাণ প্রতিরোধ: §৫.২-এ প্রস্তাবিত হিসাবে, TIKTAG-v2 গ্যাজেট স্টোর এবং লোড নির্দেশাবলীর মধ্যে প্যাডিং নির্দেশাবলী দিয়ে প্রশমিত করা যেতে পারে। একটি TIKTAGv1 গ্যাজেট, যদিও আমরা শোষণযোগ্য একটি খুঁজে পাইনি, একটি ব্রাঞ্চ এবং মেমোরি অ্যাক্সেসের মধ্যে প্যাডিং নির্দেশাবলী দিয়ে প্রশমিত করা যেতে পারে, যেমন §৫.১-এ বর্ণিত।
\ ৬.২. Linux কার্নেল আক্রমণ করা
ARM-এ Linux কার্নেল মোবাইল ডিভাইস, সার্ভার এবং IoT ডিভাইসের জন্য ব্যাপকভাবে ব্যবহৃত হয়, এটিকে একটি আকর্ষণীয় আক্রমণ লক্ষ্য তৈরি করে। কার্নেলে একটি মেমোরি কারাপশন ভালনারাবিলিটি শোষণ ব্যবহারকারীর বিশেষাধিকার বৃদ্ধি করতে পারে, এবং এইভাবে MTE Linux কার্নেলের জন্য একটি প্রতিশ্রুতিশীল সুরক্ষা ব্যবস্থা। Linux কার্নেলের বিরুদ্ধে TIKTAG-ভিত্তিক আক্রমণ ব্রাউজার আক্রমণ (§৬.১) থেকে ভিন্ন অনন্য চ্যালেঞ্জ তৈরি করে।
\ এর কারণ হল আক্রমণকারীর ঠিকানা স্পেস কার্নেলের ঠিকানা স্পেস থেকে বিচ্ছিন্ন যেখানে গ্যাজেট কার্যকর হবে। নিম্নলিখিতে, আমরা প্রথমে Linux কার্নেলের থ্রেট মডেল সংক্ষিপ্ত করি (§৬.২.১) এবং Linux কার্নেলে আমরা আবিষ্কৃত একটি প্রুফ-অফ-কনসেপ্ট TIKTAG গ্যাজেট প্রদান করি (§৬.২.২)। অবশেষে, আমরা Linux কার্নেল ভালনারাবিলিটি শোষণে TIKTAG গ্যাজেটের কার্যকারিতা প্রদর্শন করি (§৬.২.৩)।
\ ==৬.২.১. থ্রেট মডেল।== এখানে থ্রেট মডেল কার্নেলের বিরুদ্ধে সাধারণ বিশেষাধিকার বৃদ্ধি আক্রমণের মতোই। বিশেষভাবে, আমরা ARM-ভিত্তিক Android Linux কার্নেলের উপর ফোকাস করি, ডিফল্ট কার্নেল সুরক্ষা (যেমন, KASLR, SMEP, SMAP এবং CFI) দিয়ে শক্ত করা। আমরা আরও ধরে নিই যে কার্নেল একটি MTE র্যান্ডম ট্যাগিং সমাধান দিয়ে শক্ত করা হয়েছে, উৎপাদন-প্রস্তুত MTE সমাধান, Scudo [৩] এর অনুরূপ।
\ বিশেষভাবে বলতে গেলে, প্রতিটি মেমোরি অবজেক্ট র্যান্ডমলি ট্যাগ করা হয়, এবং একটি অবজেক্ট মুক্ত হলে একটি র্যান্ডম ট্যাগ নিয়োগ করা হয়, যার ফলে স্থানিক এবং অস্থায়ী উভয় মেমোরি কারাপশন প্রতিরোধ করা হয়। আক্রমণকারী একটি অ-বিশেষাধিকারপ্রাপ্ত প্রসেস চালাতে সক্ষম এবং কার্নেলে মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করে তাদের বিশেষাধিকার বৃদ্ধি করার লক্ষ্য রাখে। এটি ধরে নেওয়া হয় যে আক্রমণকারী কার্নেল মেমোরি কারাপশন ভালনারাবিলিটি জানে কিন্তু কার্নেল মেমোরির কোনো MTE ট্যাগ জানে না। কার্নেল অবজেক্টের মধ্যে মেমোরি কারাপশন ট্রিগার করা
\ মেলানো ট্যাগের সাথে একটি ট্যাগ চেক ফল্ট উত্থাপন করবে, যা বাস্তব-বিশ্বের শোষণের জন্য অনাকাঙ্ক্ষিত। এই আক্রমণে একটি গুরুত্বপূর্ণ চ্যালেঞ্জ হল যে বিদ্যমান কার্নেল কোড পুনরায় ব্যবহার করে গ্যাজেট তৈরি করতে হবে এবং আক্রমণকারী যে সিস্টেম কল আহ্বান করতে পারে তার দ্বারা কার্যকর করতে হবে। যেহেতু ARMv8 আর্কিটেকচার ব্যবহারকারী এবং কার্নেল পেজ টেবিল আলাদা করে, ব্যবহারকারী স্পেস গ্যাজেট কার্নেল মেমোরি স্পেকুলেটিভভাবে অ্যাক্সেস করতে পারে না। এই সেটআপ ব্রাউজার আক্রমণের (§৬.১) থ্রেট মডেল থেকে খুব আলাদা, যা গ্যাজেট তৈরি করতে আক্রমণকারী-প্রদত্ত কোড ব্যবহার করে। আমরা eBPF-ভিত্তিক গ্যাজেট নির্মাণও বাদ দিয়েছি [১৭, ২৮], কারণ eBPF অ-বিশেষাধিকারপ্রাপ্ত Android প্রসেসের জন্য উপলব্ধ নয় [৩৩]।
\ ==৬.২.২. কার্নেল TikTag গ্যাজেট==। §৪.১-এ বর্ণিত হিসাবে, TIKTAG গ্যাজেটগুলিকে বেশ কয়েকটি প্রয়োজনীয়তা পূরণ করতে হবে এবং প্রতিটি প্রয়োজনীয়তা কার্নেল পরিবেশে চ্যালেঞ্জ তৈরি করে।
প্রথমত, BR-এ, একটি ব্রাঞ্চ মিসপ্রিডিকশন cond_ptr দিয়ে ট্রিগার করা উচিত, যা ব্যবহারকারী স্পেস থেকে নিয়ন্ত্রণযোগ্য হওয়া উচিত। যেহেতু সাম্প্রতিক AArch64 প্রসেসরগুলি ব্যবহারকারী এবং কার্নেলের মধ্যে ব্রাঞ্চ প্রিডিকশন ট্রেনিং আলাদা করে [৩৩], ব্রাঞ্চ ট্রেনিং কার্নেল স্পেস থেকে সম্পাদন করা প্রয়োজন।
দ্বিতীয়ত, CHECK-এ, guess_ptr ডিরেফারেন্স করা উচিত। guess_ptr ব্যবহারকারী স্পেস থেকে তৈরি করা উচিত যাতে এটি একটি অনুমান ট্যাগ (Tg) এম্বেড করে এবং ট্যাগ (Tm) ফাঁস করতে কার্নেল ঠিকানা (অর্থাৎ, target_addr) নির্দেশ করে। ব্রাউজার JavaScript পরিবেশ (§৬.১) এর বিপরীতে, ব্যবহারকারী-প্রদত্ত ডেটা সিস্টেম কলে ব্যাপকভাবে স্যানিটাইজ করা হয়, তাই একটি স্বেচ্ছাচারী কার্নেল পয়েন্টার তৈরি করা কঠিন।
\ উদাহরণস্বরূপ, access_ok() নিশ্চিত করে যে ব্যবহারকারী-প্রদত্ত পয়েন্টার ব্যবহারকারী স্পেসে নির্দেশ করে, এবং array_index_nospec ম্যাক্রো ব্যবহারকারী-প্রদত্ত ইনডেক্স দিয়ে স্পেকুলেটিভ আউট-অফ-বাউন্ডস অ্যাক্সেস প্রতিরোধ করে। সুতরাং, guess_ptr একটি বিদ্যমান কার্নেল পয়েন্টার হওয়া উচিত, বিশেষভাবে দুর্বল পয়েন্টার যা মেমোরি কারাপশন ঘটায়। উদাহরণস্বরূপ, use-after-free (UAF) -এ একটি ডাংলিং পয়েন্টার বা বাফার ওভারফ্লোতে একটি আউট-অফ-বাউন্ডস পয়েন্টার ব্যবহার করা যেতে পারে। শেষত, TEST-এ, test_ptr ডিরেফারেন্স করা উচিত, এবং test_ptr ব্যবহারকারী স্পেস থেকে অ্যাক্সেসযোগ্য হওয়া উচিত। ক্যাশ স্টেট পরিমাপ সহজ করতে, test_ptr একটি সিস্টেম কল আর্গুমেন্টের মাধ্যমে প্রদত্ত একটি ব্যবহারকারী স্পেস পয়েন্টার হওয়া উচিত।
\ ==আবিষ্কৃত গ্যাজেট।== উপরে উল্লিখিত প্রয়োজনীয়তা পূরণ করে TIKTAG গ্যাজেট খুঁজে পেতে আমরা Linux কার্নেলের সোর্স কোড ম্যানুয়ালি বিশ্লেষণ করেছি। ফলস্বরূপ, আমরা snd_timer_user_read()-এ একটি সম্ভাব্য শোষণযোগ্য TIKTAG-v1 গ্যাজেট খুঁজে পেয়েছি (চিত্র ১০)। এই গ্যাজেট TIKTAG-v1 (§৫.১) এর প্রয়োজনীয়তা পূরণ করে। লাইন ১০-এ (অর্থাৎ, BR), switch স্টেটমেন্ট একটি ব্যবহারকারী-নিয়ন্ত্রণযোগ্য মান tu->tread (অর্থাৎ, cond_ptr) দিয়ে ব্রাঞ্চ মিসপ্রিডিকশন ট্রিগার করে। লাইন ১৪-১৭-এ (অর্থাৎ, CHECK), tread (অর্থাৎ, guess_ptr) চারটি লোড নির্দেশাবলী দ্বারা ডিরেফারেন্স করা হয়। tread একটি struct snd_timer_tread64 অবজেক্ট নির্দেশ করে যা আক্রমণকারী স্বেচ্ছাচারীভাবে বরাদ্দ এবং মুক্ত করতে পারে।
\ যদি একটি টেম্পোরাল ভালনারাবিলিটি tread-কে একটি ডাংলিং পয়েন্টারে রূপান্তরিত করে, এটি একটি guess_ptr হিসাবে ব্যবহার করা যেতে পারে। লাইন ২০-এ, (অর্থাৎ, TEST), একটি ব্যবহারকারী স্পেস পয়েন্টার buffer (অর্থাৎ, test_ptr) copy_to_user-এ ডিরেফারেন্স করা হয়। যেহেতু এই গ্যাজেট ব্যবহারকারী স্পেস থেকে সরাসরি পৌঁছানো যায় না, আমরা কার্নেল কোডে একটি সামান্য পরিবর্তন করেছি; আমরা লাইন ৬-এ ডিফল্ট কেসের জন্য আর্লি রিটার্ন সরিয়ে দিয়েছি। এটি নিশ্চিত করে যে বাফার শুধুমাত্র স্পেকুলেটিভ পাথে অ্যাক্সেস করা হয় স্পেকুলেটিভ এক্সিকিউশনের কারণে ক্যাশ স্টেট পার্থক্য পর্যবেক্ষণ করতে।
\ যদিও এই পরিবর্তন বাস্তব-বিশ্বের পরিস্থিতিতে বাস্তবসম্মত নয়, এটি অনুরূপ কোড পরিবর্তন করা হলে গ্যাজেটের সম্ভাব্য শোষণযোগ্যতা প্রদর্শন করে। আমরা আরও বেশ কয়েকটি সম্ভাব্য শোষণযোগ্য গ্যাজেট আবিষ্কার করেছি, কিন্তু আমরা ট্যাগ মিল এবং মিসম্যাচের মধ্যে ক্যাশ স্টেট পার্থক্য পর্যবেক্ষণ করতে সক্ষম হইনি। তবুও, আমরা মনে করি সেই গ্যাজেটগুলি শোষণের জন্য শক্তিশালী সম্ভাবনা রয়েছে। TIKTAG-ভিত্তিক আক্রমণ চালু করা জটিল এবং সংবেদনশীল ইঞ্জিনিয়ারিং জড়িত, এবং এইভাবে আমরা সমস্ত সম্ভাব্য ক্ষেত্রে পরীক্ষা করতে সক্ষম হইনি।
\ বিশেষভাবে, TIKTAG-v1 ভুল পাথ ইভেন্টগুলিতে স্পেকুলেশন সংকোচনের উপর নির্ভর করে, যা ব্রাঞ্চ মিসপ্রিডিকশন পাথে ঠিকানা অনুবাদ ফল্ট বা অন্যান্য ব্যতিক্রমও অন্তর্ভুক্ত করতে পারে। যেহেতু সিস্টেম কল জটিল নিয়ন্ত্রণ প্রবাহ জড়িত, স্পেকুলেশন সংকোচন প্রত্যাশিত হিসাবে ট্রিগার নাও হতে পারে। এছাড়াও, কার্নেল কোড পরিবর্তন হলে বেশ কয়েকটি গ্যাজেট শোষণযোগ্য হতে পারে। উদাহরণস্বরূপ, ip6mr_ioctl()-এ একটি TIKTAG-v1 গ্যাজেট যখন তার সিস্টেম কল পাথ (অর্থাৎ, ioctl) থেকে কল করা হয় তখন একটি MTE ট্যাগ লিকেজ আচরণ প্রদর্শন করেনি। তবে, গ্যাজেটটি সরল নিয়ন্ত্রণ প্রবাহ সহ অন্যান্য syscalls (যেমন, write) এ পোর্ট করা হলে ট্যাগ লিকেজ ছিল।
\ ==৬.২.৩. কার্নেল MTE বাইপাস আক্রমণ।== চিত্র ৯b Linux কার্নেলে MTE বাইপাস আক্রমণ চিত্রিত করে। একটি use-after-free ভালনারাবিলিটি উদাহরণ হিসাবে নিয়ে, আমরা ধরে নিই যে আক্রমণকারী একটি সংশ্লিষ্ট TIKTAG গ্যাজেট, SysTikTagUAF(), চিহ্নিত করেছে, যা ভালনারাবিলিটি দ্বারা তৈরি ডাংলিং পয়েন্টারের ট্যাগ চেক ফলাফল ফাঁস করতে সক্ষম। উদাহরণস্বরূপ, snd_timer_user_read()-এ TIKTAG-v1 গ্যাজেট (চিত্র ১০) tread-এর ট্যাগ চেক ফলাফল ফাঁস করতে পারে, যা একটি use-after-free বা double-free ভালনারাবিলিটি দ্বারা একটি ডাংলিং পয়েন্টার হতে পারে।
\ আক্রমণ নিম্নরূপ এগিয়ে যায়: প্রথমত, আক্রমণকারী একটি কার্নেল অবজেক্ট (অর্থাৎ, objvuln) মুক্ত করে এবং তার পয়েন্টার (অর্থাৎ, vuln_ptr) একটি ডাংলিং পয়েন্টার হিসাবে ছেড়ে দেয় ( ১ )। পরবর্তীতে, আক্রমণকারী SysAllocTarget() দিয়ে objvuln-এর ঠিকানায় আরেকটি কার্নেল অবজেক্ট (অর্থাৎ, objtarget) বরাদ্দ করে ( ২ )। তারপর, আক্রমণকারী একটি ব্যবহারকারী স্পেস বাফার (অর্থাৎ, ubuf) দিয়ে SysTikTag() আহ্বান করে ( ৩ ), এবং ubuf-এর অ্যাক্সেস লেটেন্সি পরিমাপ করে ট্যাগ চেক ফলাফল (অর্থাৎ, Tm == Tg) ফাঁস করে ( ৪ )। যদি ট্যাগ মিলে, আক্রমণকারী SysExploitUAF() ট্রিগার করে, একটি সিস্টেম কল যা use-after-free ভালনারাবিলিটি শোষণ করে ( ৫ )। অন্যথায়, আক্রমণকারী objtarget পুনরায় বরাদ্দ করে যতক্ষণ না ট্যাগ মিলে।
\ ==ক্যাশ সাইড-চ্যানেল ট্রিগার করা।== §৬.১.৩-এর মতো, একটি সফল TIKTAG গ্যাজেট শোষণের জন্য i) ব্রাঞ্চ ট্রেনিং, ii) ক্যাশ নিয়ন্ত্রণ, এবং iii) ক্যাশ পরিমাপ প্রয়োজন। ব্রাঞ্চ ট্রেনিংয়ের জন্য, আক্রমণকারী ব্যবহারকারী স্পেস থেকে ব্যবহারকারী-নিয়ন্ত্রিত ব্রাঞ্চ শর্ত দিয়ে ব্রাঞ্চ প্রিডিক্টর প্রশিক্ষণ দিতে এবং স্পেকুলেশন ট্রিগার করতে পারে। ক্যাশ নিয়ন্ত্রণের জন্য, আক্রমণকারী ব্যবহারকারী স্পেস বাফার (অর্থাৎ, ubuf) ফ্লাশ করতে পারে, যখন কার্নেল মেমোরি ঠিকানা ক্যাশ লাইন বাউন্সিং দিয়ে ইভিক্ট করা যেতে পারে [২৫]। ক্যাশ পরিমাপের জন্য, ubuf-এর অ্যাক্সেস লেটেন্সি ভার্চুয়াল কাউন্টার (অর্থাৎ, CNTVCT_EL0) বা একটি মেমোরি কাউন্টার-ভিত্তিক টাইমার (অর্থাৎ, CPU সাইকেল রেজোলিউশনের কাছাকাছি) দিয়ে পরিমাপ করা যেতে পারে।
\ ==মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করা।== TIKTAG গ্যাজেট MTE বাইপাস করতে এবং কার্নেল মেমোরি কারাপশন ভালনারাবিলিটি শোষণ করতে সক্ষম করে। আক্রমণকারী কার্নেলে TIKTAG গ্যাজেট আহ্বান করতে পারে স্পেকুলেটিভভাবে মেমোরি কারাপশন ট্রিগার করতে এবং ট্যাগ চেক ফলাফল পেতে। তারপর, আক্রমণকারী ট্যাগ চেক ফলাফল পেতে পারে, এবং শুধুমাত্র যদি ট্যাগ মিলে তবে মেমোরি কারাপশন ট্রিগার করতে পারে। আমরা §D-তে Linux কার্নেল MTE বাইপাস আক্রমণ প্রক্রিয়া বিস্তারিত করি।
\ ==৬.২.৪. প্রশমন।== Linux কার্নেলে TIKTAG গ্যাজেট প্রশমিত করতে, কার্নেল ডেভেলপারদের নিম্নলিখিত প্রশমনগুলি বিবেচনা করা উচিত:
i) স্পেকুলেশন ব্যারিয়ার: স্পেকুলেশন ব্যারিয়ার Linux কার্নেলে TIKTAG-v1 গ্যাজেট কার্যকরভাবে প্রশমিত করতে পারে। আক্রমণকারীদের ব্যবহারকারী স্পেস বাফারের মাধ্যমে ট্যাগ চেক ফলাফল ফাঁস করা থেকে বিরত রাখতে, ব্যবহারকারী স্পেস ঠিকানা অ্যাক্সেস করে এমন কার্নেল ফাংশন, যেমন copy_to_user এবং copy_from_user, স্পেকুলেশন ব্যারিয়ার দিয়ে শক্ত করা যেতে পারে। §৫.১-এ বর্ণিত হিসাবে, স্টোর অ্যাক্সেস দিয়ে ট্যাগ চেক ফলাফল ফাঁস করা স্টোর অ্যাক্সেস (অর্থাৎ, TEST) এর আগে একটি স্পেকুলেশন ব্যারিয়ার স্থাপন করে প্রশমিত করা যেতে পারে।
\ উদাহরণস্বরূপ, copy_to_user ব্যবহার করে গ্যাজেট প্রশমিত করতে, copy_to_user আহ্বানের আগে একটি স্পেকুলেশন ব্যারিয়ার ঢোকানো যেতে পারে। ব্যবহারকারী স্পেস বাফারে লোড অ্যাক্সেস ব্যবহার করে গ্যাজেটের জন্য, ব্রাঞ্চ এবং কার্নেল মেমোরি অ্যাক্সেস (অর্থাৎ, CHECK) এর মধ্যে ঢোকানো হলে ব্যারিয়ার গ্যাজেট প্রশমিত করে। উদাহরণস্বরূপ, copy_from_user ব্যবহার করে গ্যাজেট প্রশমিত করতে, কার্নেল ডেভেলপারদের কন্ডিশনাল ব্রাঞ্চ, কার্নেল মেমোরি অ্যাক্সেস এবং copy_from_user() এর প্যাটার্ন খুঁজে পেতে কার্নেল কোড বেস সাবধানে বিশ্লেষণ করা উচিত এবং ব্রাঞ্চ এবং কার্নেল মেমোরি অ্যাক্সেসের মধ্যে একটি স্পেকুলেশন ব্যারিয়ার ঢোকানো উচিত।
\ ii) গ্যাজেট নির্মাণ প্রতিরোধ: Linux কার্নেলে সম্ভাব্য TIKTAG গ্যাজেট নির্মূল করতে, কার্নেল সোর্স কোড বিশ্লেষণ এবং প্যাচ করা যেতে পারে। যেহেতু TIKTAG গ্যাজেট কম্পাইলার অপটিমাইজেশন দ্বারাও তৈরি করা যেতে পারে, একটি বাইনারি বিশ্লেষণ পরিচালিত করা যেতে পারে। প্রতিটি আবিষ্কৃত গ্যাজেটের জন্য, নির্দেশাবলী পুনর্বিন্যাস করা যেতে পারে বা গ্যাজেট নির্মাণ প্রতিরোধ করতে অতিরিক্ত নির্দেশাবলী ঢোকানো যেতে পারে, §৫.১ এবং §৫.২-এ প্রশমন কৌশল অনুসরণ করে।
:::info লেখকগণ:
:::
:::info এই পেপার CC ৪.০ লাইসেন্সের অধীনে arxiv-এ উপলব্ধ।
:::
\


