এটি ঠিক কী করে? আমি বুঝতে পারি না কীভাবে আপনি এটির সাথে বেস মেমোরিটি অ্যাক্সেস করতে পারবেন ... কিন্ডা অদ্ভুত বলে মনে হচ্ছে। এটি নিরাপদ?
dd if=/dev/urandom of=/dev/mem
এটি ঠিক কী করে? আমি বুঝতে পারি না কীভাবে আপনি এটির সাথে বেস মেমোরিটি অ্যাক্সেস করতে পারবেন ... কিন্ডা অদ্ভুত বলে মনে হচ্ছে। এটি নিরাপদ?
dd if=/dev/urandom of=/dev/mem
উত্তর:
আসলে, বেশিরভাগ প্ল্যাটফর্মে, এটি কেবল একটি ত্রুটি নিয়ে ব্যর্থ হয় তবে এটি হার্ডওয়্যার আর্কিটেকচারের উপর নির্ভর করে। আপনি কোনও অনিবদ্ধ ব্যবহারকারী হিসাবে কমান্ডটি চালনা না করাতে নিঃসংশয় নিশ্চয়ই কোনও নিশ্চয়তা নেই। একটি অনিবদ্ধ ব্যবহারকারীর সাথে, কমান্ডটি পুরোপুরি নিরীহ কারণ আপনি খুলতে পারবেন না /dev/mem
।
আপনি যখন রুট হিসাবে কোনও কমান্ড চালাবেন, আপনি কী করছেন তা আপনার জানা উচিত। কার্নেল কখনও কখনও আপনাকে বিপজ্জনক কিছু করতে বাধা দেয়, তবে সবসময় নয়। /dev/mem
সেই সম্ভাব্য বিপদজনক জিনিসগুলির মধ্যে একটি যেখানে আপনি সত্যিই আপনি কী করছেন তা জানা উচিত।
/dev/mem
লিনাক্সে লেখার জন্য কীভাবে কাজ করা যায় তা নিয়ে আমি চলতে চলেছি । অন্যান্য নীতিমালাগুলিতে সাধারণ নীতি একই রকম হয় তবে কার্নেলের বিকল্পগুলির মতো জিনিসগুলি সম্পূর্ণ আলাদা।
কোনও প্রক্রিয়া যখন কোনও ডিভাইস ফাইল পড়তে বা লিখতে হয় তখন কার্নেল পর্যন্ত হয়। একটি ডিভাইস ফাইলে অ্যাক্সেস ড্রাইভারের মধ্যে এমন কিছু কোড চালায় যা এই ডিভাইস ফাইলটি পরিচালনা করে। উদাহরণস্বরূপ, লেখা /dev/mem
ফাংশন ডাকে write_mem
মধ্যেdrivers/char/mem.c
। এই ফাংশনটিতে 4 টি আর্গুমেন্ট লাগে: একটি ডেটা স্ট্রাকচার যা ওপেন ফাইলকে উপস্থাপন করে, লেখার জন্য ডেটারের একটি পয়েন্টার, লেখার জন্য বাইটের সংখ্যা এবং ফাইলে বর্তমান অবস্থান।
মনে রাখবেন যে কলরারের কাছে প্রথমে ফাইলটি খোলার অনুমতি থাকলে আপনি কেবল এটি পেতে পারেন। ডিভাইস ফাইলগুলি সাধারণত ফাইলের অনুমতি মেনে চলে। স্বাভাবিক অনুমতি /dev/mem
করছে crw-r-----
মালিকানাধীন root:kmem
, তাই আপনি যদি রুট ছাড়াই লেখার জন্য এটা খোলার চেষ্টা, আপনি শুধু পাবেন "এর অনুমতি অস্বীকার করেছেন" (EACCESS)। তবে আপনি যদি রুট হন (বা যদি রুট এই ফাইলটির অনুমতি পরিবর্তন করে থাকে), খোলার মধ্য দিয়ে যায় এবং তারপরে আপনি একটি লেখার চেষ্টা করতে পারেন।
write_mem
ফাংশনের কোডটি কিছু বিড়াল চেক করে তোলে, তবে এই চেকগুলি খারাপ কিছু থেকে রক্ষা করার জন্য যথেষ্ট নয়। এটির প্রথম কাজটি হ'ল বর্তমান ফাইলের অবস্থানটিকে *ppos
একটি শারীরিক ঠিকানায় রূপান্তর করা । যদি এটি ব্যর্থ হয় (বাস্তবে, কারণ আপনি 32-বিট শারীরিক ঠিকানাগুলির সাথে প্ল্যাটফর্মে রয়েছেন তবে 64৪-বিট ফাইল অফসেট এবং ফাইল অফসেটটি 2 ^ 32 এর চেয়ে বড়), লিখনটি EFBIG (ব্যর্থ ফাইলটি খুব বড়) এর সাথে ব্যর্থ হয়। পরবর্তী চেকটি হ'ল লেখার জন্য শারীরিক ঠিকানার পরিসরটি এই নির্দিষ্ট প্রসেসরের আর্কিটেকচারে বৈধ কিনা এবং সেখানে ফলশ্রুতিতে একটি ব্যর্থতার ফলাফল (খারাপ ঠিকানা) address
এর পরে, স্পার্ক এবং এম 68 কে-তে, প্রথম প্রথম দৈহিক পৃষ্ঠায় লেখার যে কোনও অংশ নিঃশব্দে এড়ানো যায়।
আমরা এখন মূল লুপে পৌঁছেছি যা ব্লকগুলির ডেটার উপরে পুনরাবৃত্তি করে যা একটি এমএমইউ পৃষ্ঠার মধ্যে ফিট করতে পারে ।
/dev/mem
ভার্চুয়াল মেমোরি নয়, শারীরিক স্মৃতি অ্যাক্সেস করে তবে মেমরিতে ডেটা লোড এবং সঞ্চয় করার জন্য প্রসেসরের নির্দেশাবলী ভার্চুয়াল ঠিকানা ব্যবহার করে, সুতরাং কোডটি কিছু ভার্চুয়াল ঠিকানায় শারীরিক মেমরির মানচিত্রের ব্যবস্থা করতে হবে। লিনাক্সে, প্রসেসরের আর্কিটেকচার এবং কার্নেল কনফিগারেশনের উপর নির্ভর করে, এই ম্যাপিংটি স্থায়ীভাবে বিদ্যমান বা ফ্লাইতে তৈরি করতে হবে; এটিই xlate_dev_mem_ptr
(এবং unxlate_dev_mem_ptr
যা কিছু xlate_dev_mem_ptr
করেন তা বাতিল করে দেয়) এর কাজ। তারপরে ফাংশনটি copy_from_user
পাঠানো বাফার থেকে পড়েwrite
সিস্টেম কল এবং কেবলমাত্র ভার্চুয়াল ঠিকানায় লেখায় যেখানে শারীরিক স্মৃতি বর্তমানে ম্যাপ করা আছে। কোডটি সাধারণ মেমরি স্টোর নির্দেশিকা নির্গত করে এবং এর অর্থ হার্ডওয়্যার পর্যন্ত।
কোনও দৈহিক ঠিকানায় লেখার বিষয়টি নিয়ে আলোচনা করার আগে, আমি এই লেখার আগে ঘটে যাওয়া একটি চেক নিয়ে আলোচনা করব। লুপ ভিতরে, ফাংশন page_is_allowed
ব্লক নির্দিষ্ট ঠিকানায় ব্যবহারের কার্নেল কনফিগারেশন অপশন CONFIG_STRICT_DEVMEM
সক্রিয় করা হয় (যা ডিফল্টভাবে ক্ষেত্রে দেখা যায়): শুধুমাত্র ঠিকানাগুলি দ্বারা অনুমোদিত devmem_is_allowed
মাধ্যমে পৌঁছে যাবে /dev/mem
লেখ অন্যদের জন্য EPERM সঙ্গে ব্যর্থ হয়, (অপারেশন অনুমতি নয়)। এই বিকল্পের বিবরণে বলা হয়েছে:
যদি এই বিকল্পটি চালু হয় এবং IO_STRICT_DEVMEM = n হয় তবে / dev / mem ফাইলটি কেবলমাত্র PCI স্পেস এবং BIOS কোড এবং ডেটা অঞ্চলগুলিতে ব্যবহারকারীদের স্পেস অ্যাক্সেসের অনুমতি দেয়। এটি ডোজমু এবং এক্স এবং / ডেভ / মেমের সমস্ত সাধারণ ব্যবহারকারীদের জন্য যথেষ্ট।
এটি খুব x86- কেন্দ্রিক বর্ণনা। প্রকৃতপক্ষে, আরও সাধারণভাবে, CONFIG_STRICT_DEVMEM
শারীরিক মেমরিগুলিতে র্যামের মানচিত্রে ঠিকানাগুলিতে অ্যাক্সেস অবরুদ্ধ করে তবে র্যামে ম্যাপ না করে এমন ঠিকানাগুলিতে অ্যাক্সেসের অনুমতি দেয়। প্রসেসরের আর্কিটেকচারের উপর শারীরিক ঠিকানার কোন রেঞ্জের মঞ্জুরি দেওয়া হয়েছে তার বিবরণ নির্ভর করে তবে এগুলি সমস্তই র্যাম বাদ দেয় যেখানে কার্নেলের এবং ব্যবহারকারীর স্থল প্রক্রিয়াগুলির ডেটা সংরক্ষণ করা হয়। অতিরিক্ত বিকল্প CONFIG_IO_STRICT_DEVMEM
(উবুন্টু 18.04 হিসাবে অক্ষম) ব্লক শারীরিক ঠিকানাগুলিতে অ্যাক্সেস করে যা কোনও ড্রাইভার দাবি করে।
শারীরিক মেমরিটি সেই মানচিত্রটিকে র্যামে সম্বোধন করে । তাহলে এমন শারীরিক মেমরি ঠিকানা রয়েছে যা র্যামে ম্যাপ করে না? হ্যাঁ. ঠিকঠাকটিতে কোনও লিখিতকরণের অর্থ কী তা নিয়ে আমি উপরে প্রতিশ্রুতি দিয়েছিলাম।
কোনও মেমরি স্টোর নির্দেশ অগত্যা র্যাম লিখতে পারে না। প্রসেসর ঠিকানাটি বিভক্ত করে এবং সিদ্ধান্ত নেয় যে কোন পেরিফেরিয়ালে স্টোরটি প্রেরণ করা হবে। (আমি যখন "প্রসেসর" বলি তখন পেরিফেরিয়াল কন্ট্রোলারগুলি আমি অন্তর্ভুক্ত করি যা একই উত্পাদনকারী থেকে আসে না)) র্যাম কেবলমাত্র পেরিফেরিয়ালগুলির মধ্যে একটি। প্রেরণ পদ্ধতি কীভাবে প্রেরণ করা হয় তা প্রসেসরের আর্কিটেকচারের উপর নির্ভর করে তবে সমস্ত আর্কিটেকচারে ফান্ডামেন্টাল কম বেশি এক রকম হয়। প্রসেসরটি মূলত ঠিকানার উচ্চতর বিটগুলি পচিয়ে দেয় এবং এগুলিকে কয়েকটি সারণীতে সন্ধান করে যা হার্ড-কোডড তথ্য, কিছু বাস অনুসন্ধানের মাধ্যমে প্রাপ্ত তথ্য এবং সফ্টওয়্যার দ্বারা কনফিগার করা তথ্যের উপর ভিত্তি করে পপুলেটে থাকে। প্রচুর ক্যাচিং এবং বাফারিং জড়িত থাকতে পারে তবে সংক্ষেপে এই পচনের পরে,বাস এবং তারপরে এটি মোকাবেলা করার জন্য পেরিফেরিয়াল পর্যন্ত। (বা টেবিলের অনুসন্ধানের ফলাফলটি হতে পারে যে এই ঠিকানায় কোনও পেরিফেরিয়াল নেই, সেক্ষেত্রে প্রসেসর একটি ফাঁদ অবস্থায় প্রবেশ করে যেখানে এটি কার্নেলে কিছু কোড চালায় যা সাধারণত কলিং প্রক্রিয়াটির জন্য একটি সিগবাসের ফলাফল দেয়))
কোনও ঠিকানার একটি স্টোর যা র্যামের মানচিত্রের জন্য এই ঠিকানায় পূর্বে সঞ্চিত মানটি ওভাররাইট করা ব্যতীত অন্য কিছুই "না" করে, সেই ঠিকানায় একই ঠিকানাতে পরবর্তী লোড শেষ সঞ্চিত মানটি ফিরিয়ে দেবে promise তবে এমনকি র্যামের কয়েকটি ঠিকানা রয়েছে যা এইভাবে আচরণ করে না: এর কয়েকটি রেজিস্টার রয়েছে যা রিফ্রেশ রেট এবং ভোল্টেজের মতো জিনিসগুলি নিয়ন্ত্রণ করতে পারে।
সাধারণভাবে, একটি হার্ডওয়্যার রেজিষ্টারে একটি পঠন বা লিখন হার্ডওয়্যারকে যা করার জন্য প্রোগ্রাম করা হয় তা তাই করে। হার্ডওয়্যারের বেশিরভাগ অ্যাক্সেসগুলি এইভাবে কাজ করে: সফ্টওয়্যার (সাধারণত কার্নেল কোড) একটি নির্দিষ্ট শারীরিক ঠিকানা অ্যাক্সেস করে, এটি বাসে পৌঁছে যা প্রসেসরের পেরিফেরিয়ালে সংযুক্ত করে এবং পেরিফেরিয়াল তার কাজটি করে। কিছু প্রসেসরের (বিশেষত x86) পৃথক সিপিইউ নির্দেশনা রয়েছে যা পেরিফেরিয়ালগুলিতে পাঠ্য / লেখার কারণ যা মেমরি লোড এবং স্টোর থেকে পৃথক, তবে x86 তেও অনেক পেরিফেরিয়াল লোড / স্টোরের মাধ্যমে পৌঁছে যায়।
কমান্ডটি dd if=/dev/urandom of=/dev/mem
ঠিকানা 0 তে পেরিফেরিয়াল ম্যাপযুক্ত যাবতীয় এলোমেলো তথ্য লিখে (এবং পরবর্তী ঠিকানাগুলি, যতক্ষণ লেখক সফল হয়)। বাস্তবে, আমি প্রত্যাশা করি যে অনেকগুলি আর্কিটেকচারে, শারীরিক ঠিকানার 0 এর সাথে কোনও পেরিফেরিয়াল ম্যাপ করা থাকে না, বা র্যাম রয়েছে, এবং তাই প্রথম লেখার প্রচেষ্টা ব্যর্থ হয়। তবে যদি ঠিকানার ঠিকানায় কোনও পেরিফেরাল ম্যাপ করা থাকে বা আপনি যদি অন্য কোনও ঠিকানায় লেখার জন্য আদেশটি পরিবর্তন করেন তবে আপনি পেরিফেরিয়ালে অপ্রত্যাশিত কিছু ট্রিগার করবেন। বর্ধিত ঠিকানাগুলিতে এলোমেলো তথ্য সহ, এটি আকর্ষণীয় কিছু করার সম্ভাবনা নেই, তবে নীতিগতভাবে এটি কম্পিউটারটি বন্ধ করে দিতে পারে (সম্ভবত এটির কোনও ঠিকানা রয়েছে যা বাস্তবে এটি করে) কিছু বিআইওএস সেটিং ওভাররাইট করে এটি বুট করা অসম্ভব করে তোলে বা কিছুটিকে আঘাতও করে তোলে বগি পেরিফেরাল এমনভাবে হয় যাতে এটি ক্ষতি করে।
alias Russian_roulette='dd if=/dev/urandom of=/dev/mem seek=$((4096*RANDOM+4096*32768*RANDOM))'
CONFIG_STRICT_DEVMEM
সক্ষম করা থাকলে এবং প্রকৃতপক্ষে আপনি কার্নেলের ক্ষতি করতে পারবেন না ।
প্রতি ম্যানুয়াল পৃষ্ঠা মেম (4) :
/ dev / میم হ'ল একটি অক্ষর ডিভাইস ফাইল যা কম্পিউটারের মূল মেমরির একটি চিত্র। এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, সিস্টেমটি পরীক্ষা করতে (এবং এমনকি প্যাচ)।
সুতরাং তত্ত্ব অনুসারে, dd if=/dev/urandom of=/dev/mem
আপনি যে শারীরিক স্মৃতি ইনস্টল করেছেন তার পুরো ঠিকানা স্থানটি ওভাররাইট করা উচিত এবং কার্নেল এবং অন্যান্য প্রোগ্রামগুলি মেমরি থেকে চালিত হওয়ার ফলে এটি সিস্টেমকে কার্যকরভাবে ক্র্যাশ করা উচিত । অনুশীলনে, সীমা আছে। একই মানুষ পৃষ্ঠা থেকে:
লিনাক্স ২.6.২6 এবং আর্কিটেকচারের উপর নির্ভর করে, CONFIG_STRICT_DEVMEM কার্নেল কনফিগারেশন বিকল্পটি এই ফাইলটির মাধ্যমে অ্যাক্সেস করতে পারে এমন অঞ্চলগুলিকে সীমাবদ্ধ করে।
ভার্চুয়াল মেশিন উবুন্টু 18.04 এ চেষ্টা করে এটি মূলের অনুমতি থাকা সত্ত্বেও dd: writing to '/dev/mem': Operation not permitted
এমনকি ত্রুটি প্রদান করে । উবুন্টু উইকি থেকে :sudo
crw-r-----
/ দেব / মেমো সুরক্ষা
কিছু অ্যাপ্লিকেশন (Xorg) ব্যবহারকারীর স্থান থেকে শারীরিক মেমরির সরাসরি অ্যাক্সেস প্রয়োজন। এই অ্যাক্সেসটি সরবরাহ করার জন্য বিশেষ ফাইল / দেব / মেম বিদ্যমান। অতীতে, কোনও আক্রমণকারীর রুট অ্যাক্সেস থাকলে এই ফাইলটি থেকে কার্নেল মেমরিটি দেখতে এবং পরিবর্তন করা সম্ভব হয়েছিল। CONFIG_STRICT_DEVMEM কার্নেল বিকল্পটি ডিভাইসবিহীন মেমরির অ্যাক্সেস (মূল নামে CONFIG_NONPROMISC_DEVMEM নামকরণ করা) ব্লক করার জন্য চালু করা হয়েছিল।
প্রযুক্তিগতভাবে, এটি নিরাপদ নয় (যেহেতু এটি সিস্টেমটি ক্র্যাশ করবে) এবং যদি কার্নেল বিকল্পটি CONFIG_STRICT_DEVMEM
অক্ষম করা হয় তবে এটি একটি সুরক্ষা গর্ত, তবে আমি এখনও অবধি যা দেখছি সেই বিকল্পটি সক্ষম করা থাকলে কমান্ড চলবে না। ক্রস সাইট ডুপ্লিকেট অনুসারে , একটি রিবুট এটির সাথে যে কোনও সমস্যা সমাধান করবে, তবে অবশ্যই সেই সময় র্যামের ডেটা নষ্ট হবে এবং ডিস্কে ফ্লাশ হবে না (যদি কোনও হ'ল ছিল)।
এর আগে ডুপ্লিকেট লিঙ্কে একটি প্রস্তাবিত পদ্ধতি রয়েছে যার busybox devmem
ফলে আপনি যদি র্যামের সাথে গোলমাল করার জন্য দৃ determined়প্রতিজ্ঞ হন তবে সর্বোপরি কোনও উপায় থাকতে পারে।
CONFIG_STRICT_DEVMEM
, আপনি মেমরি অঞ্চলগুলিতে অ্যাক্সেস করতে পারেন যেখানে পেরিফেরিয়াল ম্যাপ করা থাকে, যা হ'ল পুরো বিষয়টি /dev/mem
। আপনি পেরিফেরিয়ালগুলিতে এলোমেলো জিনিস লিখলে, কিছু ঘটতে পারে। আপনি ম্যাপড নয় এমন কোনও ঠিকানা অ্যাক্সেস করার চেষ্টা করলে আপনি "অপারেশন অনুমোদিত নয়" পাবেন এবং কমান্ডটি ঠিকানা 0 থেকে শুরু হবে কিনা ঠিকানা 0 মানচিত্রের কোনওটি হার্ডওয়ার আর্কিটেকচারের উপর নির্ভর করে। সবার জন্য আমি জানি এটি কোনও পিসিতে কখনই মানচিত্রের মানচিত্র নাও থাকতে পারে তবে এটি সাধারণভাবে নিরাপদ নয়।
head -c 1024 </dev/mem | od -tx1
), কিন্তু আমি এই ব্যবহার করা হয় যখন প্রসেসর বাস্তব মোড (8088 মোড) নয় জানি না। এগুলি 64৪-বিট মোডে ব্যবহার করা যাবে বলে আমি মনে করি না: সর্বোপরি, ৮০৮৮ বিঘ্নিত ভেক্টরগুলির কাছে ঠিকানার জন্য 32 বিট রয়েছে। এবং উপায় দ্বারা এটি CONFIG_STRICT_DEVMEM
সেট সহ অ্যাক্সেসযোগ্য , তাই আমার ধারণা লিনাক্স এটি ব্যবহার করে না।