শেল অ্যারিমেটিক মূল্যায়নে নিরবচ্ছিন্ন ডেটা ব্যবহারের সুরক্ষা সম্পর্কিত প্রভাব


17

একটি মন্তব্য একটি থেকে সাম্প্রতিক প্রশ্ন , Stéphane Chazelas উল্লেখ ডবল প্রথম বন্ধনী নিরাপত্তা প্রভাব আছে যেমন পাটীগণিত যে:

x=$((1-$x))

বেশিরভাগ গোলাগুলিতে

আমার গুগল দক্ষতা মরিচা বলে মনে হচ্ছে এবং আমি কিছুই খুঁজে পাচ্ছি না। ডাবল প্রথম বন্ধনীর গণিতের সুরক্ষা সম্পর্কিত কী কী প্রভাব রয়েছে?

উত্তর:


22

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

এমন:

x='(PATH=2)'

তারপর:

x=$((1-$x)))

সেট PATHকরার পার্শ্ব প্রতিক্রিয়া রয়েছে 2(একটি আপেক্ষিক পথ যা খুব ভাল আক্রমণকারীটির নিয়ন্ত্রণে থাকতে পারে)। আপনি বা এর PATHসাথে প্রতিস্থাপন করতে পারেন ... ব্যাশ, জেডএস বা কেএসএর ক্ষেত্রেও একই ঘটনা ঘটে (ড্যাশ বা যশ নয় যা কেবলমাত্র ভেরিয়েবলগুলিতে সংখ্যার ধ্রুবক গ্রহণ করে)।LD_LIBRARY_PATHIFSx=$((1-x))

মনে রাখবেন যে:

x=$((1-$x))

$x(POSIX অনুযায়ী optionচ্ছিক) --(হ্রাস) অপারেটর (হ্রাস) অপারেটর বাস্তবায়িত করে এমন কয়েকটি শেলের মধ্যে নেতিবাচক মানের জন্য সঠিকভাবে কাজ করবে না x=-1, এর অর্থ শেলটিটি মূল্যায়ন করতে বলার অর্থ1--1 পাটিগণিতের এক্সপ্রেশন । "$((1-x))"যেমন সমস্যা নেই xএর (আগে নয়) গাণিতিক মূল্যায়ন অংশ হিসেবে সম্প্রসারিত করা হয়।

ইন bash, zshএবং ksh(নয় dashবা yash), যদি xহয়:

x='a[0$(uname>&2)]'

তারপরে প্রসারণ $((1-$x))বা $((1-x))সেই unameআদেশটি কার্যকর করার কারণ ঘটায় (জন্য zsh,a একটি অ্যারের পরিবর্তনশীল করা প্রয়োজন, কিন্তু এক ব্যবহার করতে পারেন psvarযে জন্য উদাহরণস্বরূপ)।

সংক্ষেপে বলা যায়, এক uninitialised না ব্যবহার করা উচিত বা শাঁস মধ্যে গাণিতিক এক্সপ্রেশন বাইরের তথ্য (দয়া করে মনে রাখবেন গাণিতিক মূল্যায়ন দ্বারা করা সম্ভব অ sanitized $((...))(ওরফে $[...]মধ্যে bashবা zsh) কিন্তু এছাড়াও শেল উপর নির্ভর করে let, [/ test, declare/typeset/export..., return, break, continue, exit, printf, printবিল্টিনস, অ্যারে সূচক ((..))এবং [[...]]কয়েকটি নাম নির্ধারণ করে)।

কোনও ভেরিয়েবলটিতে আক্ষরিক দশমিক পূর্ণসংখ্যার সংখ্যা রয়েছে তা যাচাই করতে আপনি POSIXly ব্যবহার করতে পারেন:

case $var in
  ("" | - | *[!0123456789-]* | ?*-*) echo >&2 not a valid number; exit 1;;
esac

সাবধান হন যে [0-9]কোনও কোনও লোকেলগুলিতে 0123456789 এর বেশি মিল রয়েছে [[:digit:]]OK ঠিক আছে তবে আমি এটিতে বাজি ধরব না।

এছাড়াও মনে রাখবেন যে শীর্ষস্থানীয় শূন্যগুলির সাথে সংখ্যাগুলি কিছু প্রসঙ্গে ( 010কখনও কখনও 10, কখনও কখনও 8) অষ্টাল হিসাবে বিবেচিত হয় এবং সাবধান হন যে উপরের চেকটি আপনার সিস্টেম দ্বারা সমর্থিত সর্বাধিক পূর্ণসংখ্যার চেয়ে সম্ভাব্য বৃহত্তর সংখ্যার মাধ্যমে প্রবাহিত হবে (অথবা আপনি যা যা আবেদন করবেন) সেই পূর্ণসংখ্যাটি এতে ব্যবহার করুন; উদাহরণস্বরূপ বাশ 18446744073709551616 কে 2 64 হিসাবে বিবেচনা করে )। সুতরাং আপনি এই ক্ষেত্রে বিবৃতিতে অতিরিক্ত চেক যুক্ত করতে চাইবেন:

(0?* | -0?*)
  echo >&2 'Only decimal numbers without leading 0 accepted'; exit 1;;
(-??????????* | [!-]?????????*)
  echo >&2 'Only numbers from -999999999 to 999999999 supported'; exit 1;;

উদাহরণ:

$ export 'x=psvar[0$(uname>&2)]'
$ ksh93 -c 'echo "$((x))"'
Linux
ksh93: psvar: parameter not set
$ ksh93 -c '[ x -lt 2 ]'
Linux
ksh93: [: psvar: parameter not set
$ bash -c 'echo "$((x))"'
Linux
0
$ bash -c '[[ $x -lt 2 ]]'
Linux
$ bash -c 'typeset -i a; export a="$x"'
Linux
$ bash -c 'typeset -a a=([x]=1)'
Linux
$ bash -c '[ -v "$x" ]'
Linux
$ mksh -c '[[ $x -lt 2 ]]'
Linux
$ zsh -c 'echo "$((x))"'
Linux
0
$ zsh -c 'printf %d $x'
Linux
0
$ zsh -c 'integer x'
Linux
$ zsh -c 'exit $x'
Linux

এখানে আরও পড়ুন:


x='P=3'; : $(($x + 5))সেট হবে P8, কিন্তু x='P=3'; : $((x + 5))সেট হবে Pথেকে 3(ইন zsh, kshবা bash)। "একই সাথে ঘটে $((x + 1))..." এখন সঠিক নয়; এটি পুরানো হিসাবে সেট PATHকরা হবে 2
মশবির

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