ভিএম কীভাবে মূলের মালিকানাধীন ফাইলগুলি চুরি করে?


39

নিম্নলিখিত সাক্ষ্য:

sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 root  staff    0 19 Dec 12:38 temp

sh-3.2$ echo nope > temp
sh: temp: Permission denied

sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits

sh-3.2$ ls -al
total 8
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 glen  staff    7 19 Dec 12:38 temp

কোনওভাবে ভিম এই মূল-মালিকানাধীন ফাইলটি নিয়েছে এবং এটি ব্যবহারকারীর মালিকানাধীন ফাইলে পরিবর্তন করেছে!

ব্যবহারকারী কেবল ডিরেক্টরিটির মালিক হলে এটি কেবল কাজ করে বলে মনে হয় - তবে এটি এখনও সম্ভব হয় না বলে মনে হয়। কীভাবে ব্যাখ্যা করা যায় যে এটি কীভাবে হয়?

উত্তর:


51

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

ভিম অদলবদল ফাইলগুলি ব্যবহার করে এবং ফাইলগুলিকে পানির নিচে ঘুরিয়ে দেয়, যাতে এটি আপনাকে শেলের মতো একই ফাইলটিতে লেখার জন্য কেন মনে হয় তা ব্যাখ্যা করে তবে এটি একই জিনিস নয়। 2

সুতরাং, ভিম কী করে তা এখানে নেমে আসে:

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

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

2 আপডেট: মন্তব্যগুলিতে উল্লিখিত হিসাবে, ভিম মালিকানা পরিবর্তনের জন্য আসলে এইভাবে তা করেন না, কারণ tempফাইলের ইনোড নম্বরটি পরিবর্তিত হয় না ( ls -liআগে এবং পরে কোমরিং )। ব্যবহার করে straceআমরা দেখতে পাই ঠিক কী vimহয়। মজার অংশটি এখানে:

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

এটি দেখায় যে এটি কেবল লিঙ্কমুক্ত হয় , তবে ফাইল বিবরণকারীটিকে এটি বন্ধ করে না temp। এটি কেবল তার সম্পূর্ণ বিষয়বস্তু ( more text bla\nআমার ক্ষেত্রে) ওভাররাইট করে । আমি অনুমান করি এটি কেন ইনোড নম্বর পরিবর্তন করে না তা ব্যাখ্যা করে।


3
FWIW আপনি যাচাই করতে পারেন এটি ls -ilআগে এবং পরে চালিয়ে যাচ্ছিল ... যদি tempএর ইনোড নম্বরটি পরিবর্তিত হয় তবে আপনি জানেন যে এটি একই নামের একটি আলাদা ফাইল।
অকেজো

3
কেউ যোগ করতে পারে যে আরএম আসলে ফাইলটি সরিয়ে দেয় না, তবে কেবলমাত্র ফাইলটির একটি লিঙ্ক সরিয়ে দেয়, এবং লিঙ্কের সংখ্যা 0 কমে যাওয়ার আগে ফাইলটি মুছে ফেলা হবে না। rm কেবল ডিরেক্টরিতে ফাইলটিতে প্রবেশ সরিয়ে দেয়। রুটের যদি অন্য ডিরেক্টরিতে ফাইলের অন্য লিঙ্ক (হার্ড লিঙ্ক) থাকে তবে ব্যবহারকারী ফাইলটি সরাতে পারবেন না।
অঙ্কিত

1
@ ব্যবহার না করে আমি চেষ্টা করেছি এবং মালিক এবং টাইমস্ট্যাম্প পরিবর্তিত হলেও নম্বরটি পরিবর্তন হয়নি!
amyassin

1
@ এমায়াসিন আপনি ঠিক বলেছেন! আমি আমার উত্তরটি একটি স্ট্রেসের সংক্ষেপে ব্যাখ্যা করে আপডেট করেছি।
gertvdijk

1
উইন্ডোজ বনাম ইউনিক্স অনুমতি সম্পর্কে আপনার নোটের একপাশে, আপনি যদি ইউনিক্সে উইন্ডোজের মতো আচরণ চান, আপনি মূলের মালিকানাধীন একটি ডিরেক্টরি তৈরি করতে পারেন (বা অন্য কোনও ব্যবহারকারী যার সর্বজনীন অপসারণ / পুনর্নামকরণ / ইত্যাদি অনুমতি থাকতে হবে) এবং স্টিকি সেট করতে পারেন ডিরেক্টরিতে বিট। তারপরে ব্যবহারকারীরা কেবল তাদের নিজস্ব ফাইল মুছতে সক্ষম হবেন।
ম্যাথু ক্রামলে

16

আগে:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

পরে:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

ভিম অনুমতি বাধা ভেঙে না। সাবধানতার সাথে তালিকাভুক্ত ফাইল তথ্যটি একবার দেখুন তবে আপনি জানতে পারেন যে ভিম আসলে আসল ফাইলটি মুছে ফেলেছে (কারণ আপনার ফাইলটি অপসারণ করার অনুমতি রয়েছে যদিও আপনি এর সামগ্রী পরিবর্তন করতে পারবেন না) তারপরে আপনার নিজের একটি নতুন ফাইল তৈরি করা হয়েছে ( মালিক আর 'রুট' নয়) দেখুন।

এবং আপনি যখন ভিএম-তে মূল ফাইলটি সম্পাদনা করছেন তখন এটি সতর্ক করে যে আপনি কেবল পঠনযোগ্য ফাইল পরিবর্তন করছেন। সুতরাং আপনি যখন কমান্ডটি টাইপ করবেন :wq!(অপারেশনকে জোর করুন), কেবলমাত্র ভিএমই কি করতে পারে তা হ'ল বিদ্যমান ফাইলটি মুছুন এবং একটি নতুন ফাইল তৈরি করুন যা অভিন্ন নাম রয়েছে।

আশা করি এইটি কাজ করবে.


1

ইনোড নম্বরটি দেখতে -iবিকল্পটি ব্যবহার করুন ls, যা কোনও ফাইল বা অন্য বস্তুর অনন্য শনাক্তকারী (ফাইল সিস্টেমের মধ্যে)।

আপনি দেখতে পাবেন যে ফাইলটি একটি ভিন্ন অবজেক্টের সাথে প্রতিস্থাপন করা হয়েছিল: ইনোড নম্বরটি সম্ভবত পরিবর্তিত হবে।

একই ইনোড নম্বরটি দেখানো কোনও কিছুর প্রমাণ নয়: একটি ইনোড নম্বর পুনর্ব্যবহার করা যায়। আমরা যদি কোনও ফাইলের শেষ লিঙ্কটি সরিয়ে ফেলি এবং তারপরে একটি নতুন ফাইল তৈরি করি, আমরা একই ইনোড নম্বর সহ একটি পেতে পারি। তবে নতুনটি তৈরির পরে যদি পুরানো ফাইলটি সরানো হয় তবে তা ঘটতে পারে না। যেমন mv file file.tmp; touch file; rm file.tmp। আমার সন্দেহ হয় ভিম আসলে এর সাথে কিছুটা মিলে যায় echo new_content > tmpfile; mv tmpfile filemvঅপারেশন অনুবাদ হবে renameসিস্টেম কল, তাই inode সংখ্যার নিয়োগ একটি পুনঃনামকরণ যা গন্তব্য থেকে লিঙ্ক মুক্ত করবে কিভাবে ফাইল সিস্টেম কার্যকরী উপর নির্ভর করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.