কিভাবে একটি শিশু প্রক্রিয়া একটি পাসওয়ার্ড পাস?


18

কমান্ড লাইনে একটি পাসওয়ার্ড (আমার প্রোগ্রাম থেকে শুরু হওয়া কোনও শিশু প্রক্রিয়াতে) পাসওয়ার্ডটি অনিরাপদ হিসাবে পরিচিত (কারণ এটি পিএস কমান্ডের সাথে অন্য ব্যবহারকারীরাও দেখতে পাবেন)। পরিবর্তে এটি পরিবেশের পরিবর্তনশীল হিসাবে পাস করা কি ঠিক হবে?

এটি পাস করার জন্য আমি আর কী ব্যবহার করতে পারি? (পরিবেশের পরিবর্তনশীল ব্যতীত) সবচেয়ে সহজ সমাধানটি কোনও পাইপ ব্যবহার করা মনে হয় তবে এই সহজ সমাধানটি সহজ নয়।

আমি পার্ল মধ্যে প্রোগ্রাম।


2
কেন এটি সহজ নয়? এটি আলাদা / নামযুক্ত পাইপ হতে হবে না, কেবল নিয়মিত স্টিডিন / আউট করবে ... এটি কোনও ভাষায় খুব বেশি ঝামেলা হওয়া উচিত নয়। আপনি এটি আগ্রহের প্রক্রিয়াগুলি (যা এটির চেয়ে বেশি শক্ত) এর দ্বারা কেবল পঠনযোগ্য তা নিশ্চিত করতে পারলে আপনি এটি একটি সরল কনফিগ ফাইলে রাখতে পারেন।
frostschutz

1
আপনি যদি বাচ্চাকে এক্সিকিউটে কল না করেন তবে কিছু করার প্রয়োজন ছাড়াই আপনার কাছে পাসওয়ার্ডের একটি অনুলিপি রয়েছে।
জেমস ইয়ংম্যান

উত্তর:


26

প্রক্রিয়া যুক্তি সকল ব্যবহারকারীর কাছে দৃশ্যমান, তবে পরিবেশটি কেবল একই ব্যবহারকারীর কাছে দৃশ্যমান ( কমপক্ষে লিনাক্সে এবং আমি প্রতিটি আধুনিক ইউনিক্স বৈকল্পিকের জন্য ভাবি)। সুতরাং এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে পাসওয়ার্ড দেওয়া নিরাপদ। যদি কেউ আপনার পরিবেশের ভেরিয়েবলগুলি পড়তে পারে তবে তারা আপনার মতো প্রক্রিয়া চালাতে পারে, সুতরাং এটি ইতিমধ্যে শেষ game

পরিবেশের বিষয়বস্তুগুলি অপ্রত্যক্ষভাবে ফাঁস হওয়ার কিছুটা ঝুঁকির মধ্যে রয়েছে, উদাহরণস্বরূপ আপনি যদি psকিছু তদন্ত করতে যান এবং দুর্ঘটনাক্রমে কোনও পাবলিক জায়গায় গোপনীয় পরিবেশের ভেরিয়েবলগুলি সহ ফলাফলটি অনুলিপি করে আটকে দেন। আরেকটি ঝুঁকি হ'ল আপনি পরিবেশের পরিবর্তনশীল এমন একটি প্রোগ্রামে পাস করুন যার প্রয়োজন নেই (প্রক্রিয়াটির শিশুদের সহ যা পাসওয়ার্ডের প্রয়োজন হয়) এবং সেই প্রোগ্রামটি তার পরিবেশের পরিবর্তনশীলগুলি প্রকাশ করে কারণ এটি তাদের গোপনীয় হওয়ার আশা করেনি। মাধ্যমিক ফাঁসের এই ঝুঁকিগুলি কতটা খারাপ তা নির্ভর করে পাসওয়ার্ড সহ প্রক্রিয়াটি কীভাবে চালায় (এটি কতক্ষণ চলবে? এটি কী উপ-প্রক্রিয়া চালায়?)।

পাসওয়ার্ড দুর্ঘটনাক্রমে এমন কোনও চ্যানেল যা কোনও পাইপের মতো নকশাকৃত নকশাকৃত নকশাকৃত নয় এমন কোনও চ্যানেল দিয়ে পাস করার মাধ্যমে এটি নিশ্চিত হওয়া সহজ। প্রেরণ পক্ষের পক্ষে এটি করা বেশ সহজ। উদাহরণস্বরূপ, যদি আপনার শেল ভেরিয়েবলের পাসওয়ার্ড থাকে তবে আপনি এটি করতে পারেন

echo "$password" | theprogram

যদি theprogramতার স্ট্যান্ডার্ড ইনপুটটিতে পাসওয়ার্ডটি আশা করে। মনে রাখবেন যে এটি নিরাপদ কারণ echoএকটি বিল্টিন; এটি বাহ্যিক কমান্ডের সাহায্যে নিরাপদ হবে না কারণ psআউটপুটটিতে যুক্তিটি প্রকাশিত হবে । একই প্রভাব অর্জনের আরেকটি উপায় হ'ল একটি নথির সাথে:

theprogram <<EOF
$password
EOF

কিছু প্রোগ্রাম যাদের পাসওয়ার্ডের প্রয়োজন হয় এটি নির্দিষ্ট ফাইল বর্ণনাকারীর কাছ থেকে পড়তে বলা যেতে পারে। আপনার যদি অন্য কোনও কিছুর জন্য স্ট্যান্ডার্ড ইনপুট প্রয়োজন হয় তবে আপনি স্ট্যান্ডার্ড ইনপুট ব্যতীত কোনও ফাইল বর্ণনাকারী ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এর সাথে gpg:

get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP

প্রোগ্রামটি যদি কোনও ফাইল বর্ণনাকারীর কাছ থেকে পড়তে বলা যায় না তবে একটি ফাইল থেকে পড়তে বলা যেতে পারে তবে আপনি des / dev / fd / 3 এর মতো ফাইলের নাম ব্যবহার করে একটি ফাইল বর্ণনাকারীর কাছ থেকে পড়তে বলতে পারেন।

theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF

Ksh, bash বা zsh এ, আপনি প্রক্রিয়া প্রতিস্থাপনের মাধ্যমে আরও স্পষ্টভাবে এটি করতে পারেন।

theprogram --password-from-file=<(echo "$password")

সোলারিস 9 এবং তার /usr/ucb/psচেয়েও পুরনো, এটি নির্ধারিত মূল ছিল যাতে অন্য প্রক্রিয়াগুলির পরিবেশগত পরিবর্তনগুলি পড়তে এবং প্রদর্শন করতে পারে - এটি সোলারিস 10 এ সরানো হয়েছে, সুতরাং উপরের "প্রতিটি অন্যান্য আধুনিক ইউনিক্স রূপ" উত্তরটি সোলারিস রিলিজগুলিতে 2005 এবং পরবর্তী সময়ে প্রযোজ্য।
alanc

@ এল্যাঙ্ক আসলে, আমি আজকাল সোলারিস <10 কে আধুনিক হিসাবে বিবেচনা করি না। সোলারিস 9 উইন্ডোজ এক্সপির মতো প্রায় পুরানো!
গিলস 'অশুভ হওয়া বন্ধ করুন'

গিলস: এমন অনেক দিন আছে যে সোলারিস ১১ টি আধুনিকের কথা বিবেচনা করে আমার এখন খুব কঠিন হয়েছে যে সোলারিস ১১ এখন ৫ বছরেরও বেশি সময়
পেরিয়ে গেছে

10

যুক্তি বা পরিবেশের ভেরিয়েবলের মাধ্যমে সরাসরি পাসওয়ার্ডটি পাস করার পরিবর্তে

#!/bin/bash
#filename: passwd_receiver
echo "The password is: $1"

কোনও ফাইল নাম পাস করতে একই যুক্তি বা পরিবেশের পরিবর্তনশীল ব্যবহার করুন :

#!/bin/bash
#filename: passwd_receiver
echo "The password is: $(< "$1")"

তারপরে আপনি হয় অনুমতি-সুরক্ষিত নিয়মিত ফাইলটি পাস করতে পারেন (যদিও এটি আপনাকে একই ব্যবহারকারীর অধীনে চলমান অন্যান্য প্রক্রিয়া থেকে রক্ষা করবে না), /dev/stdinএবং এটিতে পাইপ (যা আফাইক আপনাকে একই ব্যবহারকারীর অধীনে চলমান অন্যান্য প্রক্রিয়া থেকে রক্ষা করবে):

 echo PASSWORD | ./passwd_receiver /dev/stdin 

আপনি যদি /dev/stdinএখানে ব্যবহার করেন তবে এটি একটি পাইপ হওয়া জরুরী । যদি এটি টার্মিনাল হয় তবে এটি একই ব্যবহারকারীর অধীনে চলমান অন্যান্য প্রক্রিয়া দ্বারা পঠনযোগ্য হবে।

আপনার যদি /dev/stdinঅন্য কোনও কিছুর জন্য ইতিমধ্যে আপনার ব্যবহারের প্রয়োজন হয় , আপনি যদি এমন শেল ব্যবহার করেন যা এটি সমর্থন করে তবে আপনি প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন যা পাইপগুলি ব্যবহারের সমতুল্য:

./passwd_receiver <(echo PASSWORD)

নামযুক্ত পাইপগুলি (এফআইএফও) দেখতে একইরকম হতে পারে তবে সেগুলি অবিচ্ছিন্ন।

এই সমাধানগুলিও পুরোপুরি সুরক্ষিত নয়, তবে আপনি যদি যথেষ্ট পরিমাণে অদলবদলের কোনও স্মৃতিতে সীমাবদ্ধ সিস্টেমে না থাকেন তবে এগুলি পর্যাপ্ত পরিমাণে থাকতে পারে।

আদর্শভাবে, আপনি এই ফাইলগুলি (পাইপ একটি ফাইলও হ'ল) ম্লোক (2) সহ নানস্যাভেবল হিসাবে চিহ্নিত মেমোরিতে পড়তে চেয়েছিলেন, যা সাধারণত পাসওয়ার্ড হ্যান্ডলিং প্রোগ্রামগুলি যেমন gnupg করে।

মন্তব্য:

  1. ফাইলডেস্কিপ্টর নম্বরগুলি পাস করা তাত্ত্বিকভাবে ফাইলের নামগুলি পাস করার মতো ফাইল হিসাবে ভাল, তবে ফাইলের নামগুলি আরও ব্যবহারিক, কারণ <()আপনাকে ফাইল ফাইল দেয়, ফাইলডস্ক্রিপ্টর নম্বর নয় (এবং coprocআপনাকে এফডি_সিএলএক্সইসিইসি চিহ্নিত চিহ্নযুক্ত ফাইলাইস্ক্রিপ্টর দেয় , যা এই পরিপ্রেক্ষিতে এই ফাইলড্রিস্ক্রিপ্টরদের অযোগ্য করে তোলে)।

  2. যদি আপনি এমন লিনাক্স সিস্টেমে থাকেন যেখানে
    /proc/sys/kernel/yama/ptrace_scopeসেট করা থাকে 0, তবে আফিক, একই ব্যবহারকারীর অধীনে চলমান অন্যান্য প্রক্রিয়া থেকে নিজেকে রক্ষা করার কোনও বুলেটপ্রুফ উপায় নেই (তারা আপনার প্রক্রিয়াটি সংযুক্ত করতে এবং আপনার স্মৃতি পড়তে পিট্রেস ব্যবহার করতে পারে)

  3. আপনার যদি কেবলমাত্র পৃথক (ননরুট) ব্যবহারকারীদের অধীনে চলমান প্রক্রিয়াগুলি থেকে আপনার পাসওয়ার্ডকে দূরে রাখতে হয়, তবে আর্গুমেন্ট, পরিবেশের ভেরিয়েবল, পাইপ এবং অনুমতি সুরক্ষিত ফাইলগুলি সবই করবে।


7

না, পরিবেশের ভেরিয়েবলগুলি খুব সহজেই পড়া যায় এবং শিশু প্রক্রিয়াগুলিতে ফাঁস হয়। একটি পাইপ ব্যবহার করে এটি পাস।


2
"পরিবেশের পরিবর্তনশীল ... শিশু প্রক্রিয়াগুলিতে ফাঁস" এটি পরিবেশের ভেরিয়েবল ব্যবহারের পুরো বিষয়টি point উত্তরাধিকার সূত্রে প্রাপ্ত না হলে এগুলি অকেজো হবে। "পরিবেশের ভেরিয়েবলগুলি খুব সহজেই পড়া যায়", না সেগুলি হয় না।
প্যাট্রিক

2
চলকটি পড়ুন, আনসেট করুন। এটা কঠিন না. এবং আপনি পাইপ সম্পর্কে একই যুক্তি ব্যবহার করতে পারেন। যদি পাইপটি না পড়ে থাকে তবে এটি শিশু প্রক্রিয়াতে চলে গেছে এবং শিশু প্রক্রিয়াটি এটি পড়তে পারে এবং পাসওয়ার্ডটি পেতে পারে।
প্যাট্রিক

1
@Patrick unsetting এনভায়রনমেন্ট ভেরিয়েবল এর নথিভুক্ত মানে অগত্যা অবস্থান থেকে মান মাজা না কোথায় psএবং /procতা দেখতে পারেন।
zwol

1
কিছু সিস্টেম আপনাকে স্বেচ্ছাসেবী প্রক্রিয়াগুলির পরিবেশের পরিবর্তনগুলি পড়তে দেয়? আমার মনে হয় না লিনাক্স এটি অন্যের মালিকানাধীন প্রক্রিয়াগুলির জন্য মঞ্জুরি দেয় এবং আপনি যদি একই ব্যবহারকারী হন তবে আপনি কেবল ptrace()লক্ষ্যবস্তু করতে পারেন এবং যেকোনভাবে এটির স্মৃতি পড়তে পারেন।
ইল্কাচ্চু

5
এই উত্তরটি ভুল। পরিবেশের ভেরিয়েবলগুলি অন্য ব্যবহারকারীর দ্বারা পড়া যায় না।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

1

আর কিছু না মানলে লিনাক্স কী ধরে রাখার পরিষেবাটি (কার্নেল কীরিংগুলি) বিবেচনা করুন।

শুরু করুন: সুরক্ষা / কী.টেক্সট । ডিফল্ট কীরিংগুলির মধ্যে একটি পিতামাতা এবং শিশু প্রক্রিয়াগুলির মধ্যে ক্লোন করা যেতে পারে।

এটি সহজ সমাধান নয়, তবে এটি রয়েছে এবং এটি বজায় রাখা এবং ব্যবহার করা হবে বলে মনে হয় (এটি গত বছর অ্যান্ড্রয়েড বাগেও জড়িত ছিল))

আমি এর "রাজনৈতিক" স্থিতি সম্পর্কে জানি না, তবে আমার একই রকম প্রয়োজন ছিল এবং একটি গিলি বাইন্ডিংয়ের কাজ শুরু করে। প্রাক বিদ্যমান বিদ্যমান পার্ল সমর্থন জুড়ে আসে না।

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