কোনও ব্যবহারকারী মোড প্রোগ্রামকে কার্নেল স্পেস মেমরি অ্যাক্সেস করতে এবং আইএন এবং আউট নির্দেশাবলী কার্যকর করতে সিপিইউ মোডের উদ্দেশ্যকে পরাস্ত করে না?


19

সিপিইউ ব্যবহারকারী মোডে থাকা অবস্থায়, সিপিইউ অধিকারযুক্ত নির্দেশাবলী কার্যকর করতে পারে না এবং কার্নেল স্পেস মেমরি অ্যাক্সেস করতে পারে না।

এবং যখন সিপিইউ কার্নেল মোডে থাকে, সিপিইউ সমস্ত নির্দেশাবলী কার্যকর করতে পারে এবং সমস্ত মেমরি অ্যাক্সেস করতে পারে।

এখন লিনাক্সে, কোনও ব্যবহারকারী মোড প্রোগ্রাম সমস্ত মেমরি অ্যাক্সেস /dev/memকরতে পারে (ব্যবহার করে ) এবং দুটি সুবিধাপ্রাপ্ত নির্দেশাবলী কার্যকর করতে পারে INএবং OUT( iopl()আমার মনে হয়) ব্যবহার করে ।

সুতরাং লিনাক্সের কোনও ব্যবহারকারী মোড প্রোগ্রাম বেশিরভাগ জিনিস (আমার মনে হয় বেশিরভাগ জিনিস) করতে পারে যা কার্নেল মোডে করা যায়।

কোনও ব্যবহারকারী মোড প্রোগ্রামকে এই সমস্ত শক্তি থাকতে দেয় না কি সিপিইউ মোডের উদ্দেশ্যকে পরাস্ত করে?

উত্তর:


23

সুতরাং লিনাক্সের কোনও ব্যবহারকারী মোড প্রোগ্রাম বেশিরভাগ জিনিস (আমার মনে হয় বেশিরভাগ জিনিস) করতে পারে যা কার্নেল মোডে করা যায়।

ভাল, সমস্ত ব্যবহারকারী মোড প্রোগ্রামগুলি পারে না, কেবল উপযুক্ত সুযোগ-সুবিধা রয়েছে। এবং এটি কার্নেল দ্বারা নির্ধারিত।

/dev/memসাধারণ ফাইল সিস্টেম অ্যাক্সেস অনুমতি এবং CAP_SYS_RAWIOক্ষমতা দ্বারা সুরক্ষিত । iopl()এবং ioperm()একই ক্ষমতা দ্বারা সীমাবদ্ধ হয়।

/dev/memসম্পূর্ণ কার্নেল থেকে সংগ্রহ করা যেতে পারে ( CONFIG_DEVMEM)।

কোনও ব্যবহারকারী মোড প্রোগ্রামকে এই সমস্ত শক্তি থাকতে দেয় না কি সিপিইউ মোডের উদ্দেশ্যকে পরাস্ত করে?

ভাল হয়ত. এটি নির্ভর করে যে আপনি ব্যবহারকারী-স্থান প্রক্রিয়াগুলি করতে সক্ষম হবেন তার উপর নির্ভর করে। ব্যবহারকারী-স্পেস প্রক্রিয়াগুলি যদি তাদের /dev/sda(বা সমতুল্য) অ্যাক্সেস পায় তবে পুরো হার্ড ড্রাইভকেও ট্র্যাশ করতে পারে , যদিও এটি স্টোরেজ অ্যাক্সেস পরিচালনা করার জন্য একটি ফাইল সিস্টেম ড্রাইভারের উদ্দেশ্যকে পরাস্ত করে।

(তারপরে এমনও আছে যে iopl()আইপি ৩ privile-তে সিপিইউ সুবিধার মোডগুলি ব্যবহার করে কাজ করে, তাই তাদের উদ্দেশ্যকে পরাভূত করা ভালভাবে বলা যায় না))


2
এমনকি সমস্ত সুবিধাপ্রাপ্ত নির্দেশাবলীর ioplঅনুমতি দেয় না , সুতরাং এটি নিশ্চিত করার জন্য এটি কার্যকর যে কোনও বগি ব্যবহারকারী-স্পেস প্রোগ্রামটি দুর্ঘটনাক্রমে কোনও দূষিত ফাংশন পয়েন্টারের মাধ্যমে ঝাঁপিয়ে পড়ে না যা এক্সিকিউটেবল মেমোরিতে বাইট দিয়ে শুরু করে । আমি সুরক্ষার কিছু কারণের সাথে একটি উত্তর যুক্ত করেছি কারণ ব্যবহারকারী-স্থান প্রক্রিয়াগুলি তাদের সুবিধাগুলি উন্নত করতে কেন কার্যকর। invd0F 08
পিটার কর্ডস

16

শুধু একই ভাবে যে modprobeকার্নেল মধ্যে নতুন কোড লোড করে "নষ্ট" নিরাপত্তা।

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

  • killএটি আরও সহজেই সক্ষম হওয়া , যদি না এটি এইচডাব্লুড লক করে।
  • ফাইল সিস্টেমে ফাইলগুলি থেকে এটির কোড / ডেটা দাবি করার পৃষ্ঠা রয়েছে। (কার্নেলের মেমরিটি পৃষ্ঠাতে সক্ষম নয়)
  • এটির নিজস্ব ভার্চুয়াল ঠিকানা স্থান দেওয়া যেখানে এক্স সার্ভারের বাগগুলি কেবল কার্নেলটি না নিলে X সার্ভারটি ক্র্যাশ করতে পারে

এটি সুরক্ষার জন্য খুব বেশি কিছু করে না তবে বড় নির্ভরযোগ্যতা এবং সফ্টওয়্যার আর্কিটেকচার সুবিধা রয়েছে।

কার্নেলের মধ্যে গ্রাফিক্স ড্রাইভারগুলি বেকিং করা হলে এক্স ক্লায়েন্ট এবং এক্স সার্ভারের মধ্যে প্রসঙ্গের সুইচগুলি হ্রাস করতে পারে, যেমন একটি ব্যবহারকারী-> কার্নেল-> ব্যবহারকারীর অন্য ব্যবহার-স্থান প্রক্রিয়াতে ডেটা পাওয়ার পরিবর্তে, তবে এক্স সার্ভারগুলি historতিহাসিকভাবে খুব বড় এবং খুব বগিযুক্ত তাদের পুরো কার্নেল করতে চাই


হ্যাঁ, এগুলিকে privs সঙ্গে ক্ষতিকারক কোড পারে উপর কার্নেল যদি এটা করতে চেয়েছিলেন, ব্যবহার নিতে /dev/memকার্নেল কোড পরিবর্তন করা।

বা x86-তে উদাহরণস্বরূপ, আইও এর সুবিধাপ্রাপ্তির স্তরটি 0 এ রিং করার জন্য cliএকটি ioplসিস্টেম কল করার পরে সেই কোরটিতে বিঘ্ন অক্ষম করার জন্য একটি নির্দেশিকা চালান ।

তবে এমনকি x86 iopl"কেবল" কিছু নির্দেশকে অ্যাক্সেস দেয় : ইন / আউট (এবং স্ট্রিং সংস্করণগুলি ইন / আউটস) এবং ক্লিপ / স্টি। এটি আপনাকে "মডেল নির্দিষ্ট রেজিস্টারগুলি" ব্যবহার rdmsrবা wrmsrপড়তে বা লিখতে দেয় না (উদাহরণস্বরূপ IA32_LSTARযা x86-64 syscallনির্দেশের জন্য কার্নেল এন্ট্রি পয়েন্ট ঠিকানা নির্ধারণ করে ), বা lidtবিঘ্নিত-বর্ণনাকারী টেবিলটি প্রতিস্থাপন করতে ব্যবহার করবে (যা আপনাকে পুরোপুরি গ্রহণ করতে দেয়) বিদ্যমান কার্নেল থেকে মেশিনের ওপরে, কমপক্ষে সেই কোরটিতে)

আপনি নিয়ন্ত্রণ রেজিস্টারগুলিও পড়তে পারবেন না (সিআর 3 এর মতো যা শীর্ষ স্তরের পৃষ্ঠা-ডিরেক্টরিটির দৈহিক ঠিকানা ধারণ করে, যা আক্রমণাত্মক প্রক্রিয়াটি আরও বেশি আইংয়ের /dev/memবিকল্প হিসাবে নিজের পৃষ্ঠা সারণিগুলিকে সংশোধন করার জন্য অফসেট হিসাবে দরকারী বলে মনে করতে পারে । )mmap/dev/mem

invd(সমস্ত ক্যাশে বাতিল ছাড়া লেখা-ব্যাক !! ( ব্যবহারের ক্ষেত্রে আগে র্যাম কনফিগার করা গোড়ার দিকে বায়োস =)) অন্য মজার এক যে সবসময় পূর্ণ সিপিএল 0 (বর্তমান বিশেষাধিকার স্তর) প্রয়োজন, না শুধু IOPL হয়। এমনকি wbinvdতৈরী কারণ এটি এত ধীর (এবং interruptible নয়), এবং ফ্লাশ হয়েছে সব সব কোর জুড়ে ক্যাশে। (দেখুন কোনও প্রোগ্রামের সাথে সম্পর্কিত সিপিইউর পুরো ক্যাশেটি ফ্লাশ করার কোনও উপায় আছে? এবং ডাব্লুবিআইএনভিডি নির্দেশাবলীর ব্যবহার )

কোড হিসাবে একটি খারাপ ঠিকানার চলমান ডেটাতে লাফিয়ে ফেলার ফলসগুলি এইভাবে কোনও ইউজার-স্পেস এক্স সার্ভারে দুর্ঘটনাক্রমে এই নির্দেশাবলীর কোনওটি কার্যকর করতে পারে না।


বর্তমান সুবিধা স্তর (সুরক্ষিত এবং দীর্ঘ মোডে) হ'ল cs(কোড বিভাগের নির্বাচক) এর কম 2 বিটmov eax, cs/ and eax, 3সুবিধার স্তরটি পড়তে যে কোনও মোডে কাজ করে।

সুবিধার স্তরটি লিখতে, আপনি একটি করুন jmp farবা call farসেট করুন CS:RIP(তবে লক্ষ্য বিভাগের জন্য জিডিটি / এলডিটি এন্ট্রি পুরানো সুবিধাগুলির স্তরের উপর ভিত্তি করে এটিকে সীমাবদ্ধ করতে পারে, যার কারণে ব্যবহারকারী-স্থান নিজেকে উন্নত করতে এটি করতে পারে না)। অথবা আপনি কার্নেল এন্ট্রি পয়েন্টে 0 বাজে রিং ব্যবহার করতে intবা ব্যবহার করতে পারেন syscall


আসলে, আমি বেশ নিশ্চিত যে এটি কেবলমাত্র ইনটেল পার্সেসের "নির্বাচক" কোড। এটি সম্ভবত ৮০৮6 / 88৮৮৮-তে একটি বিভাগ ছিল, তবে সম্ভবত ৮০৮66-এর মধ্যে এটি নির্বাচক হিসাবে উল্লেখ করা হয়েছিল, এবং আমি মনে করি না যে তারা আনুষ্ঠানিকভাবে সেই পরিভাষাটি পরিবর্তন করেছে।
একটি সিভিএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.