গুগলের পল টার্নার দ্বারা লিখিত মন্তব্যে স্যাজবিজে উল্লেখ করা নিবন্ধটি নীচে আরও বিশদভাবে ব্যাখ্যা করেছে, তবে আমি এটির একটি শট দেব:
এই মুহুর্তে সীমিত তথ্য থেকে যতদূর আমি একসাথে এটি টুকরো টুকরো করতে পারি, একটি রেটপোলিন হ'ল একটি রিটার্ন ট্রামপোলিন যা একটি অনন্ত লুপ ব্যবহার করে যা কখনও কখনও অপ্রত্যক্ষ লাফের লক্ষ্য নিয়ে সিপিইউকে অনুমান করা থেকে বিরত রাখতে কার্যকর হয় না।
অ্যান্ডি ক্লিনের কার্নেল শাখায় এই সমস্যাটি দেখানোর জন্য প্রাথমিক পদ্ধতির দেখা যেতে পারে :
এটি নতুন __x86.indirect_thunk
কলটির সাথে পরিচয় করিয়ে দেয় যা কল টার্গেট লোড করে যার মেমরি ঠিকানা (যা আমি কল করব ADDR
) স্ট্যাকের উপরে সঞ্চয় করা হয় এবং RET
নির্দেশ ব্যবহার করে জাম্প কার্যকর করে । থঙ্কটি নিজেই তখন NOSPEC_JMP / CALL ম্যাক্রো ব্যবহার করে ডাকা হয় , যা অনেকগুলি (সমস্ত না থাকলে) পরোক্ষ কল এবং জাম্প প্রতিস্থাপনের জন্য ব্যবহৃত হয়েছিল। ম্যাক্রো কেবল স্ট্যাকের উপর কল টার্গেটটি রাখে এবং প্রয়োজনে রিটার্ন ঠিকানাটি সঠিকভাবে সেট করে (অ-লিনিয়ার নিয়ন্ত্রণ প্রবাহটি দ্রষ্টব্য):
.macro NOSPEC_CALL target
jmp 1221f /* jumps to the end of the macro */
1222:
push \target /* pushes ADDR to the stack */
jmp __x86.indirect_thunk /* executes the indirect jump */
1221:
call 1222b /* pushes the return address to the stack */
.endm
call
শেষে স্থান নির্ধারণ করা প্রয়োজনীয় যাতে অপ্রত্যক্ষ কল শেষ হয়ে গেলে নিয়ন্ত্রণ প্রবাহ NOSPEC_CALL
ম্যাক্রোর ব্যবহারের পিছনে অব্যাহত থাকে , তাই এটি নিয়মিত স্থানে ব্যবহার করা যেতে পারেcall
থঙ্কটি নিজেই নীচে দেখায়:
call retpoline_call_target
2:
lfence /* stop speculation */
jmp 2b
retpoline_call_target:
lea 8(%rsp), %rsp
ret
নিয়ন্ত্রণ প্রবাহটি এখানে কিছুটা বিভ্রান্তি পেতে পারে, সুতরাং আমাকে স্পষ্ট করে বলি:
call
বর্তমান নির্দেশ পয়েন্টারটিকে (লেবেল 2) স্ট্যাকের দিকে ঠেলে দেয়।
lea
স্ট্যাক পয়েন্টারে 8 যোগ করুন , কার্যকরভাবে সর্বাধিক ধাক্কা দেওয়া চতুর্ভুজটি বাতিল করুন, এটিই সর্বশেষ রিটার্ন ঠিকানা (2 লেবেলে)। এর পরে, স্ট্যাক পয়েন্টের শীর্ষে রিয়েল রিটার্নের ঠিকানা এডিডিআর আবার।
ret
*ADDR
কল স্ট্যাকের শুরুতে স্ট্যাক পয়েন্টারটিতে ঝাঁপ দেয় এবং পুনরায় সেট করে।
শেষ পর্যন্ত, এই পুরো আচরণটি ব্যবহারিকভাবে সরাসরি ঝাঁপ দেওয়ার সমতুল্য *ADDR
। আমাদের একটি সুবিধাটি হ'ল শাখার ভবিষ্যদ্বাণী রিটার্ন স্টেটমেন্টগুলির জন্য ব্যবহৃত হয় (রিটার্ন স্ট্যাক বাফার, আরএসবি), call
নির্দেশটি কার্যকর করার সময় , অনুমান করা হয় যে সংশ্লিষ্ট ret
বিবৃতিটি লেবেল 2 এ চলে যাবে।
লেবেল 2 এর অংশটি আসলে কখনই কার্যকর হয় না, এটি কেবল একটি অসীম লুপ যা তাত্ত্বিকভাবে নির্দেশাবলী দিয়ে নির্দেশ পাইপলাইনে পূরণ করবে JMP
। ব্যবহারের LFENCE
, PAUSE
বা আরো সাধারণভাবে একটি নির্দেশ ঘটাচ্ছে নির্দেশ পাইপলাইন স্টল যে এই ফটকামূলক সঞ্চালনের কোন ক্ষমতা ও সময় নষ্ট থেকে CPU- র স্টপ। এটি কারণ কারণ যদি retpoline_call_target এ কলটি স্বাভাবিকভাবে ফিরে আসে LFENCE
তবে পরের নির্দেশটি কার্যকর করা হবে। এটিই শাখার ভবিষ্যদ্বাণীকারী আসল প্রত্যাবর্তনের ঠিকানার ভিত্তিতে (লেবেল 2) ভবিষ্যদ্বাণী করবে
ইন্টেলের আর্কিটেকচার ম্যানুয়াল থেকে উদ্ধৃতি দিতে:
LFENCE অনুসরণ করার নির্দেশাবলী LFENCE এর আগে মেমরি থেকে নেওয়া হতে পারে তবে LFENCE সম্পূর্ণ না হওয়া পর্যন্ত এগুলি কার্যকর করা হবে না।
তবে নোট করুন যে স্পেসিফিকেশনটিতে কখনই উল্লেখ করা হয়নি যে LFENCE এবং PAUSE পাইপলাইনটি স্টল করে দেয়, তাই আমি এখানে লাইনগুলির মাঝে কিছুটা পড়ছি।
এখন আপনার মূল প্রশ্নে ফিরে আসুন: দুটি ধারণার সংমিশ্রণের কারণে কার্নেল মেমরির তথ্য প্রকাশ সম্ভব is
যদিও জল্পনা-কল্পনাটি ভুল ছিল তখন জল্পনা-কল্পনা কার্যকর করা উচিত পার্শ্ব-প্রতিক্রিয়া মুক্ত, অনুমানমূলক বাস্তবায়ন এখনও ক্যাশে শ্রেণিবিন্যাসকে প্রভাবিত করে । এর অর্থ হ'ল যখন কোনও মেমরি লোডটি অনুমানমূলকভাবে কার্যকর করা হয়, তখনও এটি একটি ক্যাশে লাইনটি উচ্ছেদ হতে পারে। ক্যাশে শ্রেণিবিন্যাসের এই পরিবর্তনটি একই ক্যাশে সেটটিতে ম্যাপ করা মেমরির অ্যাক্সেসের সময়টি সাবধানতার সাথে পরিমাপের মাধ্যমে চিহ্নিত করা যেতে পারে।
এমনকি পাঠানো মেমরির উত্স ঠিকানাটি যখন কার্নেল মেমরি থেকে নিজে পড়েছিল তখন আপনি নির্বিচারে মেমরির কিছু বিটগুলি ফাঁস করতে পারেন।
ইন্টেল সিপিইউগুলির অপ্রত্যক্ষ শাখার ভবিষ্যদ্বাণী কেবল উত্স নির্দেশের সর্বনিম্ন 12 বিট ব্যবহার করে, সুতরাং ব্যবহারকারী-নিয়ন্ত্রিত মেমরি ঠিকানাগুলির সাথে সমস্ত 2 ^ 12 সম্ভাব্য পূর্বাভাসের ইতিহাসকে বিষ প্রয়োগ করা সহজ। এর পরে, যখন কার্নেলের মধ্যে অপ্রত্যক্ষ লাফের পূর্বাভাস দেওয়া হয় তখন কার্নেল সুবিধাগুলি দ্বারা অনুমানমূলকভাবে সম্পাদন করা যায়। ক্যাশে-টাইমিং সাইড-চ্যানেল ব্যবহার করে, আপনি এভাবে নির্বিচারে কার্নেল মেমরি ফাঁস করতে পারেন।
আপডেট: কার্নেল মেলিং তালিকায় , একটি চলমান আলোচনা রয়েছে যা আমাকে বিশ্বাস করতে পরিচালিত করে যে রিটপলগুলি শাখার পূর্বাভাস সম্পর্কিত বিষয়গুলি সম্পূর্ণরূপে প্রশমিত করে না, যেমন রিটার্ন স্ট্যাক বাফার (আরএসবি) খালি চলেছে, আরও সাম্প্রতিক ইন্টেল আর্কিটেকচার (স্কাইলেক +) পিছনে পড়েছে দুর্বল শাখা টার্গেট বাফারকে (বিটিবি):
বিটিবি থেকে আগত ভবিষ্যদ্বাণীগুলি এড়ানোর জন্য শোধন কৌশল হিসাবে রেটপলিনগুলি রিটার্নের জন্য অপ্রত্যক্ষ শাখাকে বদলে দেয়, কারণ আক্রমণকারী দ্বারা তাদের বিষাক্ত করা যেতে পারে। স্কাইলেক + এর সমস্যাটি হ'ল কোনও আরএসবি আন্ডারফ্লো বিটিবি পূর্বাভাস ব্যবহার করে ফিরে আসে, যা আক্রমণকারীকে জল্পনা নিয়ন্ত্রণ করতে দেয়।