PATH তে থাকা ডিরেক্টরিটির জন্য কেন '-execdir' ক্রিয়াটি নিরাপদ ব্যবহার করছেন?


19

কেন ব্যবহারের -execdirসময় অনুসন্ধানের ক্রিয়া সংমিশ্রণটি ব্যবহার করা নিরাপদ -execনয়?

আমি যখন নীচের কমান্ডটি চালাচ্ছি তখন আমি নিম্নলিখিত প্রম্পট বার্তাটি পেয়ে যাচ্ছি:

/path/to/currentDir/$ find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

find: The current directory is included in the PATH environment variable, which is insecure 
in combination with the -execdir action of find.  Please remove the current directory 
from your $PATH (that is, remove "." or leading or trailing colons)

কী কারণে এই প্রম্পট প্রদর্শিত হতে পারে?

উত্তর:


22

আপনি ভুল প্রোগ্রাম চালাতে পারেন। কেউ আপনাকে তাদের প্রোগ্রামটি চালাতে পারে।

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

এটি অন্য ব্যবহারকারীর দ্বারা আপনি তাদের প্রোগ্রাম চালানোর জন্য ইচ্ছাকৃতভাবে কাজে লাগাতে পারেন, যা আপনি চালানোর চেষ্টা করছেন এমন প্রোগ্রামের পরিবর্তে ডেটা সুরক্ষা ক্ষতি বা লঙ্ঘন করতে পারে। বা, প্রায়শই, এর ফলে সমস্যা সমাধানের চেষ্টা না করেও অনিচ্ছাকৃতভাবে ভুল প্রোগ্রামটি চালিত হতে পারে।

আপনার সবকিছু যদি PATHএনভায়রনমেন্ট ভেরিয়েবল একটি সুনির্দিষ্ট পাথ, এই ত্রুটিটি ঘটতে করা উচিত নয়, এমনকি যদি ডিরেক্টরি আপনাকে অনুসন্ধান করছেন এবং -execdirথেকে ing হয় অন্তর্ভুক্ত PATH। (আমি এটি খতিয়ে দেখেছি যে এটি কাজ করে।) যদি আপনি বিশ্বাস করেন যে আপনার কোনও আপেক্ষিক ডিরেক্টরি নেই $PATHতবে এখনও এই ত্রুটিটি পাচ্ছেন, দয়া করে আপনার প্রশ্নটি আউটপুট সহ বিশদ সহ আপডেট করুন echo "$PATH"

একটি দৃ concrete় উদাহরণ।

কী ভুল হতে পারে তার উদাহরণ হিসাবে ধরুন:

  • এলিস হয়েছে .তার মধ্যে $PATHকারণ তিনি যাই হোক না কেন ডিরেক্টরির সে এর প্রোগ্রাম চালানোর সক্ষম হতে চায় cdসঙ্গে তাদের নাম পূর্বে লিখুন করতে বিরক্ত ছাড়াই 'থেকে ঘ ./
  • অ্যালিসের ফ্রিনিমি ইভ /home/eve/sharedএলিসের সাথে ভাগ করে নিয়েছে ।
  • ইভটি .cতার সাথে ভাগ করা ফাইলগুলিতে অ্যালিসের পরিসংখ্যান (লাইন, শব্দ, বাইট) চায় ।

সুতরাং অ্যালিস রান করে:

find ~eve/shared -name \*.c -execdir wc {} \;

দুর্ভাগ্যক্রমে অ্যালিসের জন্য, ইভ তার নিজস্ব স্ক্রিপ্ট তৈরি করেছে, নাম দিয়েছে wc, নির্বাহযোগ্য ( chmod +x) সেট করেছে এবং এর অধীনে যে কোনও ডিরেক্টরিতে স্পষ্টতই এটি স্থাপন করেছে /home/eve/shared। ইভটির স্ক্রিপ্টটি দেখতে এমন দেখাচ্ছে:

#!/bin/sh
/usr/bin/wc "$@"
do_evil    # Eve replaces this command with whatver evil she wishes to do

সুতরাং যখন এলিস ব্যবহারসমূহ findসঙ্গে -execdirচালানোর জন্য wcফাইল হবা ভাগ করেছেন, এবং এটা ইভ কাস্টম হিসাবে একই ডিরেক্টরির মধ্যে ফাইলগুলিতে পায় wcস্ক্রিপ্ট, ইভ এর wcরান - অ্যালিসের বিশেষাধিকার সব!

(কৌতুকপূর্ণ হওয়ার কারণে, ইভটি তার wcস্ক্রিপ্টটিকে সিস্টেমের জন্য একটি র‌্যাপার হিসাবে কাজ করেছে wc, তাই অ্যালিসও জানবে না যে কিছু ভুল হয়েছে, অর্থাৎ do_evilএটি চালানো হয়েছিল However তবে, সহজ - এবং আরও পরিশীলিত - বৈচিত্রগুলি সম্ভব)। )

কীভাবে এটি findপ্রতিরোধ করে।

findআপেক্ষিক ডিরেক্টরি থাকা অবস্থায় -execdirপদক্ষেপ নিতে অস্বীকার করে এই সুরক্ষা সমস্যাটি ঘটতে বাধা দেয়$PATH

find নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে দুটি ডায়গনিস্টিক বার্তা সরবরাহ করে।

  • যদি .এটি থাকে $PATHতবে তা (যেমন আপনি দেখেছেন) এটি বলে:

    find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)

    .বিশেষত এটি সাধারণ হিসাবে এটির ক্ষেত্রে সম্ভবত এটির জন্য একটি বিশেষ বার্তা রয়েছে ।

  • একটি আপেক্ষিক ছাড়া অন্য পথ যদি ., --say fooমধ্যে --appears $PATHএবং আপনি চালাতে findসঙ্গে -execdir, এটা বলেন:

    find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH

একেবারে আপেক্ষিক পথ না রাখাই $PATHভাল।

ঝুঁকি .বা অন্যান্য আত্মীয় পাথ $PATHযখন একটি ইউটিলিটি যা স্বয়ংক্রিয়ভাবে ডিরেক্টরি পরিবর্তন, যা কেন ব্যবহার বিশেষত অতিরিক্ত হয় findআপনি ব্যবহার দেওয়া হবে না -execdirএই অবস্থায়।

তবে আপেক্ষিক পাথগুলি বিশেষতঃ .আপনার $PATHমধ্যে অন্তর্নিহিত ঝুঁকিপূর্ণ এবং যাইহোক সত্যই সেরা এড়ানো যায়। উপরের উদাহরণে কাল্পনিক পরিস্থিতি বিবেচনা করুন। মনে করুন দৌড়ানোর পরিবর্তে findঅ্যালিস সহজেই cdছুটে যায় ~eve/shared/blahএবং চালায় wc *.c। যদি blahইভটির wcস্ক্রিপ্ট থাকে তবে do_evilএটি এলিস হিসাবে চালায়।


2
আপনি খুব ভাল শিক্ষক তৈরি করার আগে আপনি এটি শুনেছেন কিনা আমি জানি না :)
হিমাইল

5
যারা নেটে দরকারী স্টাফ লেখেন তারা সবাই হাইমাইল, ইতিমধ্যে শিক্ষক :-)
সিরো সান্তিলি 事件 改造 中心 法轮功 六四

5

এখানে অনেক বিস্তারিত তথ্য রয়েছে । আর একটি দুর্দান্ত রেফারেন্স এখানে । প্রথম রেফারেন্স থেকে উদ্ধৃতি দিতে:

বিকল্প -execdir হ'ল GNU- এ প্রবর্তিত আরও আধুনিক বিকল্প-অনুসন্ধানের আরও নিরাপদ সংস্করণ তৈরির চেষ্টা attempt এটিতে দুটি গুরুত্বপূর্ণ বর্ধনের সাথে-এক্সেকের মতো একই শব্দার্থক রয়েছে:

এটি সর্বদা ফাইলের জন্য নিখুঁত পথ সরবরাহ করে (কোনও ফাইলের সাথে সম্পর্কিত পাথ ব্যবহার করা-এক্সেকের ক্ষেত্রে সত্যই বিপজ্জনক)।

নিখুঁত পথ সরবরাহ করা ছাড়াও এটি সুরক্ষার জন্য প্যাথ ভেরিয়েবলটিও পরীক্ষা করে

দ্বিতীয় রেফারেন্স থেকে:

বর্তমান ডিরেক্টরিটি AT PATH এনভায়রনমেন্ট ভেরিয়েবলের অন্তর্ভুক্ত করা হলে '-execdir' ক্রিয়া কিছু করতে অস্বীকার করে। এটি প্রয়োজনীয় কারণ কারণ '-execdir' একই ডিরেক্টরিতে প্রোগ্রামগুলি চালায় যেখানে এটি ফাইলগুলি সন্ধান করে - সাধারণভাবে, এই জাতীয় ডিরেক্টরি অবিশ্বস্ত ব্যবহারকারীদের দ্বারা লিখিত হতে পারে। অনুরূপ কারণে, '-execdir' কমান্ডের নামে 'to}' প্রদর্শিত হতে দেয় না।


আপনি কি দয়া করে আপনার উত্তরটি প্রসারিত করতে পারেন কেন "যদি PATH env ভেরিয়েবলটিতে বিন্দু উপস্থিত থাকে তবে আপনি ভুল ডিরেক্টরি থেকে নির্বাহযোগ্যকে বেছে নিতে পারেন" ? কোন ভুল ডিরেক্টরি ? এবং কেন এটি সুরক্ষিত করার জন্য আমাদের এটি করতে হবে ? ধন্যবাদ
সু

আমি আশা করি আমার আপডেট হওয়া পোস্টের দ্বিতীয় লিঙ্কটি আপনার প্রশ্নের উত্তর দেবে
রন

3

মূল সমস্যাটি সিস্টেম ভেরিয়েবলের মান নিয়ে PATHযা এতে আপেক্ষিক ফোল্ডার ধারণ করে, তাই সুরক্ষার কারণে findকমান্ড আপনাকে বাইনারিগুলি কার্যকর করতে দেয় না, কারণ এটি সম্ভবত ভুল প্রোগ্রামগুলি কার্যকর করতে পারে।


সুতরাং উদাহরণস্বরূপ, সতর্কতা অনুসারে যদি আপনার পাথে আপনার বর্তমান দির থাকে তবে:

বর্তমান ডিরেক্টরিটি PATH এনভায়রনমেন্ট ভেরিয়েবলের অন্তর্ভুক্ত।

এবং আপনি আপনার আদেশ চালাবেন:

find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

যদি এতে আপনার স্থানীয় স্ক্রিপ্ট থাকে ( rmএক্সিকিউটেবল ফ্ল্যাগ সহ) এতে rm -fr /থাকে তবে এটি আপনার সমস্ত ফাইল সরিয়ে ফেলতে পারে, কারণ প্রত্যাশিত মৃত্যুদণ্ড কার্যকর করার পরিবর্তে /bin/rmআপনি rmবর্তমান দির থেকে কার্যকর করবেন , তাই সম্ভবত আপনি যা চেয়েছিলেন তা তা নয়।


পার্শ্ব নোট হিসাবে, এটি ট্র্যাভিস সিআই ( জিএইচ # 2811 ) এ সমস্যা হিসাবে পরিচিত যখন এটি ত্রুটির সাথে ব্যর্থ হয়:

সন্ধান করুন: প্রাসঙ্গিক পথ /। / নোড_মডিউলস / বিিন'কে PATH এনভায়রনমেন্ট ভেরিয়েবলের অন্তর্ভুক্ত করা হয়েছে, যা সন্ধানের-এক্সেকডির পদক্ষেপের সাথে একাত্মকভাবে সুরক্ষিত। দয়া করে entry PATH থেকে এন্ট্রিটি সরিয়ে দিন

সুতরাং সমাধানটি হল PATH ভেরিয়েবল থেকে প্রভাবিত এন্ট্রি সরানো, যেমন

PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'`

ড্রাগস দ্বারা প্রস্তাবিত হিসাবে । এই বাগের অগ্রগতি GH # 4862 এ অনুসরণ করা যেতে পারে ।


এখানে বাশ সংস্করণটি কার্যকরী:

PATH=${PATH//:\.\/node_modules\/\.bin/}

ব্যবহারের উদাহরণ ( PATHনির্দিষ্ট কমান্ডে ফিল্টার করা উত্তোলন):

env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f

এখানে এমন একটি sedযা সমস্ত জিনিস পছন্দ findকরে না তা মুছে ফেলবে বলে মনে হচ্ছে: Askubuntu.com
সান্তিলি 事件 改造 中心 法轮功 六四 事件

3

xargsএবং bash -c cdকার্যকরী

ঠিক আছে আমি যাচ্ছি:

find . -type f |
  xargs -I '{}' bash -c 'cd "$(dirname "{}")" && pwd && echo "$(basename "{}")"'

sed কার্যসংক্রান্ত

আগের কাজের তুলনায় কিছুটা কম সুন্দর:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" find . -execdir echo '{}' \;

একটি টেস্টকেস:

[ "$(printf '/a/b::c/d:/e/f\n' | sed -E 's/(^|:)[^\/][^:]*//g')" = '/a/b:/e/f' ] || echo fail

জন্য rename: বিশেষভাবে, এছাড়াও আপনি কিছু পার্ল Regex-Fu নিয়ে কাজ করতে পারেন /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

আরটিএফএস আশা করছে ক্রাশ হবে

যাদের findমতামতকে উপেক্ষা করার কোনও উপায় রয়েছে বলে আশাবাদী তাদের জন্য, আমি এটি কোনও উত্সের সাহায্যে নষ্ট করব:

সেখান থেকে আমরা দেখতে পাচ্ছি যে পথ চেকিং বন্ধ করার কোনও উপায় নেই।

সঠিক নিয়মটি এটি যাচাই করে: PATHহ'ল হয় যদি খালি থাকে বা শুরু না করে তবে ব্যর্থ /

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