Env x = '() {:;}; 'bash do සහ එය අනාරක්ෂිත වන්නේ ඇයි?


245

පෙනෙන ආකාරයට අවදානමක් (CVE-2014-6271) ඇත: Bash විශේෂයෙන් සකසන ලද පරිසර විචල්‍ය කේත එන්නත් කිරීමේ ප්‍රහාරය

සිදුවන්නේ කුමක්දැයි වටහා ගැනීමට මම උත්සාහ කරමි, නමුත් මට එය වැටහී ඇති බව මට සම්පූර්ණයෙන්ම විශ්වාස නැත. echoතනි උපුටා දැක්වීම්වල මෙන් එය ක්‍රියාත්මක කරන්නේ කෙසේද ?

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

සංස්කරණය 1 : පැච් පද්ධතියක් මේ වගේ ය:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

සංස්කරණය 2 : ඊට සම්බන්ධ අවදානමක් / පැච් එකක් ඇත: CVE-2014-7169 තරමක් වෙනස් පරීක්ෂණයක් භාවිතා කරයි:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

නොගැලපෙන ප්‍රතිදානය :

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

අර්ධ වශයෙන් (මුල් අනුවාදය) ඇලවූ ප්‍රතිදානය :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test

CVE-2014-7169 දක්වා සහ ඇතුලත් කළ ප්‍රතිදානය :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

3 වන සංස්කරණය : කතාව දිගටම කරගෙන යන්නේ:


එය ක්‍රියාත්මක වන්නේ දෝංකාරය නොවේ. x හි ක්‍රියාකාරී අර්ථ දැක්වීම. X හි අර්ථ දක්වා ඇති ශ්‍රිතය කිසියම් රහසිගත යටි වැඩක් කරන්නේ නම්, x ශ්‍රිතය තාත්වික නම් බැෂ් හට ප්‍රතිලාභ අගය පරීක්ෂා කළ හැකි ක්‍රමයක් නොමැත. පරීක්ෂණ කේතයේ ශ්‍රිතය හිස් බව සැලකිල්ලට ගන්න. පරීක්ෂා නොකළ ප්‍රතිලාභ අගයක් ස්ක්‍රිප්ට් එන්නත් කිරීමට හේතු වේ. ස්ක්‍රිප්ට් එන්නත් කිරීම වරප්‍රසාද ඉහළ නැංවීමට සහ වරප්‍රසාද ඉහළ නැංවීම මූල ප්‍රවේශයට මග පාදයි. පැච් එක x ලෙස ශ්‍රිතයක් ලෙස නිර්මාණය කිරීම අක්‍රීය කරයි
eyoung100

26
eyoung100, කිසිදු ගත්තේ echo ඇත ක්රියාත්මක වීම. වචනය vulnerableප්‍රතිදානයේ දිස්වන නිසා එය ක්‍රියාත්මක වන බව ඔබට පෙනේ. ප්‍රධාන ගැටළුව වන්නේ ක්‍රියාකාරී අර්ථ දැක්වීමෙන් පසුවද කේතය විග්‍රහ කර ක්‍රියාත්මක කිරීමයි . තවත් උදාහරණයක් සඳහා seclists.org/oss-sec/2014/q3/650 හි /bin/idකොටස බලන්න .
මයිකල්

4
ඉක්මන් පැත්තක අදහස් දැක්වීමක් පමණි. මුදා හැර ඇති පැච් එක අර්ධ පැච් එකක් පමණක් වන අතර පද්ධති තවමත් අවදානමට ලක්ව ඇති බව රෙඩ් හැට් උපදෙස් දී තිබේ.
පීටර්

2
ou eyoung100 වෙනස නම් ශ්‍රිතය තුළ ඇති කේතය ක්‍රියාත්මක වන්නේ පරිසර විචල්‍යය පැහැදිලිව හැඳින්වූ විට පමණි. ශ්‍රිත අර්ථ දැක්වීමෙන් පසු කේතය නව බාෂ් ක්‍රියාවලියක් ආරම්භ වන සෑම අවස්ථාවකම ක්‍රියාත්මක වේ.
ඩේවිඩ් ෆැරල්

1
අමතර විස්තර සඳහා stackoverflow.com/questions/26022248/… බලන්න
බාර්මාර්

Answers:


210

පරිසර විචල්යයන් ලෙස අපනයනය කරන ලද කාර්ය නිර්වචන බාෂ් ගබඩා කරයි. අපනයනය කරන ලද කාර්යයන් මේ ආකාරයෙන් පෙනේ:

$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() {  bar
}

එනම්, පරිසර විචල්‍යයට fooවචනාර්ථයෙන් අන්තර්ගතයන් ඇත:

() {  bar
}

බෑෂ් හි නව අවස්ථාවක් දියත් කරන විට, එය විශේෂයෙන් සකසන ලද පරිසර විචල්‍යයන් සොයන අතර ඒවා ක්‍රියාකාරී අර්ථ දැක්වීම් ලෙස අර්ථ නිරූපණය කරයි. ඔබට එය තනිවම ලිවිය හැකි අතර එය තවමත් ක්‍රියාත්මක වන බව බලන්න:

$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function

අවාසනාවකට මෙන්, නූල් වලින් (පරිසර විචල්‍යයන්) ශ්‍රිත අර්ථ දැක්වීම් විග්‍රහ කිරීම අපේක්ෂිත ප්‍රමාණයට වඩා පුළුල් බලපෑම් ඇති කළ හැකිය. නොගැලපෙන අනුවාද වලදී, එය ශ්‍රිත අර්ථ දැක්වීම අවසන් වීමෙන් පසුව සිදුවන අත්තනෝමතික විධානයන් ද අර්ථ නිරූපණය කරයි. මෙයට හේතුව පරිසරයේ පිළිගත හැකි ක්‍රියාකාරීත්වයට සමාන නූල් නිර්ණය කිරීමේදී ප්‍රමාණවත් නොවීමයි. උදාහරණයක් වශයෙන්:

$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function

ක්‍රියාකාරී අර්ථ දැක්වීමෙන් පිටත දෝංකාරය බැෂ් ආරම්භයේදී අනපේක්ෂිත ලෙස ක්‍රියාත්මක කර ඇති බව සලකන්න. ශ්‍රිත අර්ථ දැක්වීම සිදුවීම සඳහා ඇගයීම සහ සූරාකෑම ලබා ගැනීම සඳහා වූ පියවරක් පමණි, ශ්‍රිත අර්ථ දැක්වීම සහ භාවිතා කරන පරිසර විචල්‍යය අත්තනෝමතික ය. කවචය පරිසර විචල්‍යයන් දෙස fooබලයි , දකින අතර , එය ක්‍රියාකාරී අර්ථ දැක්වීමක් කෙබඳු දැයි දන්නා සීමාවන් සපුරාලන බවක් පෙනේ, එය රේඛාව ඇගයීමට ලක් කරයි, නොදැනුවත්වම දෝංකාරය ක්‍රියාත්මක කරයි (එය ඕනෑම විධානයක් විය හැකිය, අනිෂ්ට හෝ නොවේ).

මෙය අනාරක්ෂිත යැයි සලකනු ලබන්නේ විචල්‍යයන් සාමාන්‍යයෙන් ඒවාට ඉඩ දී හෝ අපේක්ෂා නොකරන බැවින් ඒවා තුළ ඇති අත්තනෝමතික කේත ආයාචනා කිරීමට සෘජුවම හේතු වේ. සමහර විට ඔබේ වැඩසටහන විශ්වාස කළ නොහැකි පරිශීලක ආදානයෙන් පරිසර විචල්‍යයන් සකසයි. කේතයේ ප්‍රකාශිත එවැනි හේතුවක් නිසා එම පරිසර විචල්‍යය භාවිතා කරමින් පරිශීලකයාට ඔබේ පැහැදිලි අභිප්‍රාය නොමැතිව අත්තනෝමතික විධානයන් ක්‍රියාත්මක කළ හැකි වන පරිදි එම පරිසර විචල්‍යයන් හැසිරවිය හැකි වීම අතිශයින්ම අනපේක්ෂිත ය.

ශක්‍ය ප්‍රහාරයකට උදාහරණයක් මෙන්න. ඔබ එහි සේවාදායකයේ ජීවිත කාලය පුරාම කොහේ හරි අවදානමට ලක්විය හැකි කවචයක් ධාවනය කරන වෙබ් සේවාදායකයක් ධාවනය කරයි. මෙම වෙබ් සේවාදායකය පරිසර විචල්‍යයන් bash ස්ක්‍රිප්ටයකට යවයි, උදාහරණයක් ලෙස, ඔබ CGI භාවිතා කරන්නේ නම්, HTTP ඉල්ලීම පිළිබඳ තොරතුරු බොහෝ විට වෙබ් සේවාදායකයෙන් පරිසර විචල්‍යයන් ලෙස ඇතුළත් වේ. උදාහරණයක් ලෙස, HTTP_USER_AGENTඔබේ පරිශීලක නියෝජිතයාගේ අන්තර්ගතයට සැකසිය හැක. මෙයින් අදහස් කරන්නේ ඔබ ඔබේ පරිශීලක නියෝජිතයා '() like වැනි දෙයක් ලෙස රවටන්නේ නම්; }; echo foo ', එම ෂෙල් ස්ක්‍රිප්ට් ක්‍රියාත්මක වන echo fooවිට ක්‍රියාත්මක වේ. නැවතත්, echo fooද්වේෂ සහගත හෝ නැති ඕනෑම දෙයක් විය හැකිය.


3
මෙය Zsh වැනි වෙනත් Bash වැනි කවචයකට බලපාන්නේද?
ඇමීලියෝ වස්කස්-රීනා

3
@ user815423426 නැත, zsh ට මෙම අංගය නොමැත. Ksh විසින් එය වෙනස් ආකාරයකින් ක්‍රියාවට නංවා ඇති අතර, කාර්යයන් සම්ප්‍රේෂණය කළ හැක්කේ ඉතා පටු තත්වයන් යටතේ පමණක් වන අතර, පරිසරය හරහා නොව ෂෙල් ෆෝක්ස් නම් පමණි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

20
@ user815423426 rc යනු පරිසරයේ ක්‍රියාකාරිත්වය පසු කරන අනෙක් කවචය වන නමුත් එහි විචල්‍යය "fn_" සමඟ පෙරවදන ලද නම් සහිත වන අතර ඒවා අර්ථ නිරූපණය කරනු ලබන්නේ ආයාචනා කළ විට පමණි.
ස්ටෙෆාන් චසෙලාස්

18
@ ස්ටෙෆාන් චැසෙලාස් - දෝෂය වාර්තා කිරීම ගැන ස්තූතියි.
මුවන් දඩයක්කාරයා

14
@gnclmorais ඔබ අදහස් කළේ ඔබ දුවන export bar='() { echo "bar" ; }'; zsh -c barබවත් එය දර්ශනය barවනවාට වඩා zsh:1: command not found: bar? පරීක්ෂණය සැකසීමට ඔබ භාවිතා කරන කවචය සමඟ ඔබ භාවිතා කරන කවචය පටලවා නොගන්නා බව ඔබට විශ්වාසද?
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

86

සිදුවන්නේ කුමක්ද යන්න තවදුරටත් නිරූපණය කිරීමට මෙය උපකාරී වේ:

$ export dummy='() { echo "hi"; }; echo "pwned"'
$ bash
pwned
$

ඔබ අවදානමට ලක්විය හැකි කවචයක් ධාවනය කරන්නේ නම්, ඔබ නව උපසිරැසියක් ආරම්භ කරන විට (මෙන්න, හුදෙක් බාෂ් ප්‍රකාශය භාවිතා කිරීමෙන්), අත්තනෝමතික කේතය ( echo "pwned") එහි ආරම්භයේ කොටසක් ලෙස වහාම ක්‍රියාත්මක වන බව ඔබට පෙනෙනු ඇත . පෙනෙන විදිහට, කවචය පරිසර විචල්‍යයේ (ව්‍යාජ) ක්‍රියාකාරී අර්ථ දැක්වීමක් ඇති බව දකින අතර, එම ශ්‍රිතය එහි පරිසරය තුළ අර්ථ දැක්වීම සඳහා අර්ථ දැක්වීම ඇගයීමට ලක් කරයි (එය ශ්‍රිතය ක්‍රියාත්මක නොකරන බව සලකන්න: එය 'හායි' මුද්‍රණය කරයි.)

අවාසනාවකට මෙන්, එය හුදෙක් ශ්‍රිත අර්ථ දැක්වීම තක්සේරු නොකරයි, එය ශ්‍රිත අර්ථ දැක්වීම අනුගමනය කරන අනිෂ්ට ප්‍රකාශ (ය) ඇතුළුව පරිසර විචල්‍යයේ වටිනාකමෙහි සමස්ත පා text ය ඇගයීමට ලක් කරයි. ආරම්භක ශ්‍රිත අර්ථ දැක්වීමකින් තොරව පරිසර විචල්‍යය ඇගයීමට ලක් නොකරන අතර එය හුදෙක් පෙළක් ලෙස පරිසරයට එකතු වන බව සලකන්න. ක්‍රිස් ඩවුන් පෙන්වා දුන් පරිදි, මෙය අපනයනය කරන ලද ෂෙල් ක්‍රියාකාරකම් ආනයනය කිරීම සඳහා නිශ්චිත යාන්ත්‍රණයකි.

නව කවචයේ අර්ථ දක්වා ඇති ශ්‍රිතය අපට දැක ගත හැකිය (එය අපනයනය කළ බවට එය සලකුණු කර ඇත), අපට එය ක්‍රියාත්මක කළ හැකිය. තවද, ව්‍යාජ විචල්‍යයක් ලෙස ව්‍යාජ ආනයනය කර නොමැත:

$ declare -f
dummy ()
{
    echo "hi"
}
declare -fx dummy
$ dummy
hi
$echo $dummy
$

මෙම ශ්‍රිතය නිර්මාණය කිරීම හෝ එය ක්‍රියාත්මක කිරීම සඳහා කරන කිසිවක් සූරාකෑමේ කොටසක් නොවේ - එය සූරාකෑම ක්‍රියාත්මක කරන වාහනය පමණි. කාරණය නම්, අපනයනය කරන ලද පරිසර විචල්‍යයකට ඇතුළත් වන පෙළ නූලකින් අවම හා වැදගත් නොවන ක්‍රියාකාරී අර්ථ දැක්වීමකට පෙර අනිෂ්ට කේත සැපයීමට ප්‍රහාරකයෙකුට හැකි නම්, එය උපසිරැසියක් ආරම්භ කළ විට එය ක්‍රියාත්මක වන අතර එය පොදු සිදුවීමකි බොහෝ පිටපත් වල. තවද, එය පිටපතෙහි වරප්‍රසාද සහිතව ක්‍රියාත්මක කරනු ඇත.


18
පිළිගත් පිළිතුර ඇත්ත වශයෙන්ම මෙය කියවන්නේ ඔබ එය පරෙස්සමින් කියවන්නේ නම්, මෙම පිළිතුර වඩාත් පැහැදිලි සහ වඩා ප්‍රයෝජනවත් බව මට පෙනී ගියේ එය අර්ථ දැක්වීම ඇගයීම (ශ්‍රිතය ක්‍රියාත්මක කරනවාට වඩා) ගැටළුව බවයි.
natevw

1
exportඅනෙක් අයට සිටියදී මෙම උදාහරණයට අණ envලැබෙන්නේ ඇයි? මම කල්පනා කරමින් envපාරිසරික විචල්ය තවත් bash shell ආරම්භ වන විට කැඳවා ඇති බව නිරූපණය සඳහා භාවිතා කොට ඇත. එසේ නම් මෙය ක්‍රියාත්මක වන්නේ කෙසේදexport
හරිස්

මේ මොහොත දක්වාම පිළිගත් පිළිතුරක් ලැබී නොමැත. එකක් පිළිගැනීමට පෙර මම තවත් දින කිහිපයක් බලා සිටිමි. මෙම පිළිතුරේ අවාසිය නම්, එය මුල් විධානය බිඳ නොදැමීම හෝ ප්‍රශ්නයේ මුල් විධානයෙන් මෙම පිළිතුරේ ඇති විධානයන් ලබා ගන්නේ කෙසේද යන්න සාකච්ඡා නොකිරීමයි. ඒ හැර එය හොඳ පැහැදිලි කිරීමකි.
ජිපී

@ralph - දෙකම envසහ exportඅපනයන පරිසර නිර්වචන ඒවා උපසිරැසියකින් ලබා ගත හැකිය. ගැටළුව ඇත්ත වශයෙන්ම මෙම අපනයනය කරන ලද අර්ථ දැක්වීම් උප පරිසරයක පරිසරයට ආනයනය කරන්නේ කෙසේද යන්න සහ විශේෂයෙන් ක්‍රියාකාරී අර්ථ දැක්වීම් ආනයනය කරන යාන්ත්‍රණය තුළ ය.
sdenham

1
@ralph - envසමහර විකල්ප සහ පරිසර විචල්‍යයන් සහිත විධානයක් ක්‍රියාත්මක කරයි. මුල් ප්‍රශ්න උදාහරණ වලදී, envනූලකට සකසා x, bash -cක්‍රියාත්මක කිරීමට විධානයක් සමඟ අමතන්න. ඔබ එසේ කළහොත් env x='foo' vim, Vim දියත් කරනු ඇති අතර, එහිදී ඔබට එහි අඩංගු කවචය / පරිසරය සමඟ ඇමතිය හැකිය !echo $x, එය මුද්‍රණය වනු ඇත foo, නමුත් ඔබ පිටව ගියහොත් සහ echo $xඑය නිර්වචනය නොකෙරේ, මන්ද එය පැවතියේ vim ක්‍රියාත්මක වන විට පමණි envවිධානය හරහා . මෙම exportවිධානය වෙනුවට වත්මන් පරිසරය තුළ දිගටම පවතින වටිනාකම් කාණ්ඩ උප කබොළ ලකුණු එසේ පසුව ඔවුන් භාවිතා කරනු ඇත.
ගැරී ෆික්ස්ලර්

72

මා මෙය ලිව්වේ ඉහත ක්‍රිස් ඩවුන් විසින් ලබා දුන් විශිෂ්ට පිළිතුර නැවත නිබන්ධනය කිරීමෙනි.


බාෂ් වලදී ඔබට මේ වගේ ෂෙල් විචල්‍යයන් තිබිය හැකිය

$ t="hi there"
$ echo $t
hi there
$

පෙරනිමියෙන්, මෙම විචල්‍යයන් ළමා ක්‍රියාවලීන්ගෙන් උරුම නොවේ.

$ bash
$ echo $t

$ exit

නමුත් ඔබ ඒවා අපනයනය සඳහා සලකුණු කළහොත්, බාෂ් විසින් ධජයක් සකසනු ඇත, එයින් අදහස් වන්නේ ඒවා උපසිරැසි වල පරිසරයට යන බවයි ( envpපරාමිතිය එතරම් දැකිය නොහැකි වුවද , mainඔබේ සී වැඩසටහනේ පරාමිතීන් තුනක් ඇත: main(int argc, char *argv[], char *envp[])එහිදී අවසාන දර්ශකයන්ගේ අරාව අරාවකි ඒවායේ අර්ථ දැක්වීම් සහිත ෂෙල් විචල්‍යයන්ගේ).

එබැවින් tපහත පරිදි අපනයනය කරමු :

$ echo $t
hi there
$ export t
$ bash
$ echo $t
hi there
$ exit

ඉහත tඋපසිරැසියෙහි නිර්වචනය කර නොමැති අතර, එය අපනයනය කිරීමෙන් පසුව දැන් පෙනේ ( export -n tඔබට එය අපනයනය කිරීම නැවැත්වීමට අවශ්‍ය නම් භාවිතා කරන්න).

නමුත් bash හි කාර්යයන් වෙනස් සත්වයෙකි. ඔබ ඒවා මෙසේ ප්‍රකාශ කරයි:

$ fn() { echo "test"; }

දැන් ඔබට ශ්‍රිතය වෙනත් ෂෙල් විධානයක් ලෙස ඇමතීමෙන් එය ක්‍රියාත්මක කළ හැකිය:

$ fn
test
$

නැවත වරක්, ඔබ උපසිරැසියක් ඇති කළහොත්, අපගේ කාර්යය අපනයනය නොවේ:

$ bash
$ fn
fn: command not found
$ exit

අපට ශ්‍රිතයක් අපනයනය කළ හැක්කේ export -f:

$ export -f fn
$ bash
$ fn
test
$ exit

මෙන්න උපක්‍රමශීලී කොටස: අපනයන ශ්‍රිතයක් fnපරිසර විචල්‍යයක් බවට පරිවර්තනය වන්නේ අපගේ ෂෙල් විචල්‍යය අපනයනය කළ ආකාරයටම ය t. fnදේශීය විචල්‍යයක් වූ විට මෙය සිදු නොවේ , නමුත් අපනයනයෙන් පසුව අපට එය ෂෙල් විචල්‍යයක් ලෙස දැකිය හැකිය. කෙසේ වෙතත්, ඔබට එකම නමක් සහිත සාමාන්‍ය (එනම් ක්‍රියාකාරී නොවන) ෂෙල් විචල්‍යයක් තිබිය හැකිය . විචල්යයේ අන්තර්ගතය මත පදනම්ව bash වෙන්කර හඳුනා ගනී:

$ echo $fn

$ # See, nothing was there
$ export fn=regular
$ echo $fn
regular
$ 

දැන් අපට envඅපනයනය සඳහා සලකුණු කර ඇති සියලුම ෂෙල් විචල්‍යයන් පෙන්වීමට භාවිතා කළ හැකි අතර නිත්‍ය fnසහ ශ්‍රිතය යන දෙකම fnපෙන්වයි:

$ env
.
.
.
fn=regular
fn=() {  echo "test"
}
$

උප කවචයක් අර්ථ දැක්වීම් දෙකම ඇතුළත් කරයි: එකක් සාමාන්‍ය විචල්‍යයක් ලෙස සහ එකක් ශ්‍රිතයක් ලෙස:

$ bash
$ echo $fn
regular
$ fn
test
$ exit

fnඅප ඉහත සඳහන් කළ පරිදි හෝ සෘජුවම සාමාන්‍ය විචල්‍ය පැවරුමක් ලෙස ඔබට අර්ථ දැක්විය හැකිය :

$ fn='() { echo "direct" ; }'

මෙය ඉතා අසාමාන්‍ය දෙයක් බව සලකන්න! සාමාන්‍යයෙන් අපි සින්ටැක්ස් fnසමඟ ඉහත පරිදි ශ්‍රිතය අර්ථ දක්වනු ඇත fn() {...}. නමුත් බාෂ් එය පරිසරය හරහා අපනයනය කරන බැවින්, අපට ඉහත නිත්‍ය අර්ථ දැක්වීමට කෙලින්ම "කෙටිමං" කළ හැකිය. (ඔබගේ දෙබස් කවන ශිල්පීනියක ප්රතිවිරුද්ධව, සමහර විට) මෙම බව සටහන නොවන නව කාර්යය ප්රතිඵලය fnවත්මන් ෂෙල් වලින් ලබා ගත හැක. නමුත් ඔබ ** උප ** කවචයක් බිහි කළහොත් එය එසේ වනු ඇත.

ශ්‍රිතයේ අපනයනය අවලංගු fnකර නව නිත්‍යය fn(ඉහත පෙන්වා ඇති පරිදි) නොවෙනස්ව තබමු.

$ export -nf fn

දැන් ශ්‍රිතය fnතවදුරටත් අපනයනය නොකෙරේ, නමුත් නිත්‍ය විචල්‍යය fnවන අතර එය එහි අඩංගු වේ () { echo "direct" ; }.

දැන් උප කුලකයක් නිත්‍ය විචල්‍යයක් දකින විට එය ආරම්භ වන්නේ ()ඉතිරිය ශ්‍රිත අර්ථ දැක්වීමක් ලෙස ය. නමුත් මෙය සිදුවන්නේ නව කවචයක් ආරම්භ වූ විට පමණි . අප ඉහත දුටු පරිදි, සාමාන්‍ය ෂෙල් විචල්‍යයක් ඇරඹීමෙන් ()එය ශ්‍රිතයක් ලෙස හැසිරීමට හේතු නොවේ. ඔබ උපසිරැසියක් ආරම්භ කළ යුතුය.

දැන් "ෂෙල්ෂොක්" දෝෂය:

අප දුටු පරිදි, නව කවචයක් නිත්‍ය විචල්‍යයක ()අර්ථ දැක්වීම එය සමඟ ආරම්භ වන විට එය ශ්‍රිතයක් ලෙස අර්ථ නිරූපණය කරයි. කෙසේ වෙතත්, ශ්‍රිතය අර්ථ දක්වන සංවෘත වරහනෙන් පසුව වැඩි යමක් ලබා දෙන්නේ නම්, එය එහි ඇති ඕනෑම දෙයක් ක්‍රියාත්මක කරයි .

මෙම අවශ්‍යතා, නැවත වරක්:

  1. නව බෑෂ් බිහි වී ඇත
  2. පරිසර විචල්‍යයක් අන්තර්ගත වේ
  3. මෙම පරිසර විචල්‍යය "()" සමඟ ආරම්භ වන අතර පසුව වරහන් තුළ ක්‍රියාකාරී ශරීරයක් අඩංගු වන අතර පසුව විධාන ඇත

මෙම අවස්ථාවේ දී, අවදානමට ලක්විය හැකි බැෂ් විසින් දෙවන විධානයන් ක්‍රියාත්මක කරනු ඇත.

උදාහරණයක්:

$ export ex='() { echo "function ex" ; }; echo "this is bad"; '
$ bash
this is bad
$ ex
function ex
$

නිතිපතා අපනයනය කරන ලද විචල්‍යය exශ්‍රිතයක් ලෙස අර්ථකථනය කරන ලද උපසෙල් වෙත යවන ලද exනමුත් පසුපස විධානයන් ක්‍රියාත්මක කරනු ලැබුවේ ( this is bad) උප කුලකය ඇති වූ විට ය.


සිනිඳු එක්-පේළියේ පරීක්ෂණය පැහැදිලි කිරීම

ෂෙල්ෂොක් අවදානම පරීක්ෂා කිරීම සඳහා ජනප්‍රිය එක්-ලයිනර් එකක් @ ජිපීගේ ප්‍රශ්නයේ සඳහන් කර ඇත්තේ:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

මෙන්න බිඳවැටීමකි: පළමුව :බැෂ් සඳහා කෙටිමං පමණි true. trueසහ :දෙකම (ඔබ එය අනුමාන කළ) සත්‍ය ලෙස තක්සේරු කරයි:

$ if true; then echo yes; fi
yes
$ if :; then echo yes; fi
yes
$

දෙවනුව, envවිධානය (බාෂ් ලෙසද සාදා ඇත) පරිසර විචල්‍යයන් මුද්‍රණය කරයි (අප ඉහත දුටු පරිදි) එම විධානයට ලබා දී ඇති අපනයන විචල්‍යයක් (හෝ විචල්‍යයන්) bash -cසහිත තනි විධානයක් ක්‍රියාත්මක කිරීමට භාවිතා කළ හැකි අතර එහි සිට තනි විධානයක් ක්‍රියාත්මක කරයි. විධාන රේඛාව:

$ bash -c 'echo hi'
hi
$ bash -c 'echo $t'

$ env t=exported bash -c 'echo $t'
exported
$

එබැවින් මේ සියල්ල එකට මැහුම් කිරීමෙන්, අපට විධානයක් ලෙස බාෂ් ධාවනය කළ හැකිය, එයට යම්කිසි ව්‍යාජ දෙයක් කළ හැකිය (වැනි bash -c echo this is a test) සහ ආරම්භ වන විචල්‍යයක් අපනයනය කරන්න, ()එවිට උපසෙල් එය ශ්‍රිතයක් ලෙස අර්ථ නිරූපණය කරයි. ෂෙල් ෂොක් තිබේ නම්, එය වහාම උප කුලකයේ ඕනෑම පසුපස විධාන ක්‍රියාත්මක කරයි. අප පසු කරන ශ්‍රිතය අපට අදාල නොවන බැවින් (නමුත් විග්‍රහ කළ යුතුය!) අපි සිතිය හැකි කෙටිම වලංගු ශ්‍රිතය භාවිතා කරමු:

$ f() { :;}
$ f
$ 

මෙහි ශ්‍රිතය fමඟින් :විධානය ක්‍රියාත්මක වන අතර එය සත්‍ය වන අතර පිටවෙයි. දැන් එම “නපුරු” විධානයට එකතු කර නිත්‍ය විචල්‍යයක් උප කුලකයකට අපනයනය කරන්න. මෙන්න නැවත එක්-ලයිනර් ය:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

ඒ නිසා xසමග සරල වලංගු කාර්යය නිතිපතා විචල්ය අපනයනය echo vulnerableඅවසානය දක්වා මත tacked. මෙය bash වෙත සම්මත කර ඇති අතර, bash xවිසින් ශ්‍රිතයක් ලෙස අර්ථ නිරූපණය කරයි (එය අප ගණන් ගන්නේ නැත) එවිට සමහර විට shellshock තිබේ echo vulnerableනම් එය ක්‍රියාත්මක කරයි .

this is a testපණිවිඩය ඉවත් කිරීමෙන් අපට එක් ලයිනර් ටිකක් කෙටි කළ හැකිය :

$ env x='() { :;}; echo vulnerable' bash -c :

මෙය කරදර නොවන this is a testනමුත් නිහ :command විධානය නැවත ක්‍රියාත්මක කරයි. (ඔබ ඉවත්ව ගියහොත් ඔබ -c :උපසිරැසියෙහි හිඳ අතින් පිටවිය යුතුය.) සමහර විට වඩාත්ම පරිශීලක-හිතකාමී අනුවාදය මෙය විය හැකිය:

$ env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock"

12
හොඳ පැහැදිලි කිරීමක්. මෙම ප්‍රශ්නයට බොහෝ අදහස් ලැබෙමින් පවතී (බොහෝ විට සෑම කෙනෙකුම අනෙක් අය මෙන් මනා දැනුමක් ඇති අය නොවිය හැකිය) සහ කිසිවෙකු තවමත් { :;};සත්‍ය වශයෙන්ම පවසන දේ සඳහා වචන කිහිපයක් වැය කර නැතැයි මම විශ්වාස කරමි . එය මගේ මතය අනුව ඔබේ පිළිතුරට කදිම එකතු කිරීමක් වනු ඇත. ඔබේ උදාහරණයේ සිට ප්‍රශ්නයේ මුල් විධානය දක්වා ඔබ ලබා ගන්නේ කෙසේද යන්න පැහැදිලි කළ හැකිද?
ජිපී

20

ඔබට වැඩසටහනකට අත්තනෝමතික පරිසර විචල්‍යයන් පෝෂණය කළ හැකි නම්, ඔබ තෝරාගත් පුස්තකාල පැටවීමෙන් ඔබට එය ඕනෑම දෙයක් කිරීමට හේතු විය හැකිය. බොහෝ අවස්ථාවන්හීදී මෙය පරිසර විචල්‍යයන් ලබා ගන්නා වැඩසටහනේ අවදානමක් ලෙස නොසැලකේ, නමුත් පිටස්තරයෙකුට අත්තනෝමතික පරිසර විචල්‍යයන්ගෙන් පෝෂණය විය හැකි යාන්ත්‍රණය තුළ ය.

කෙසේ වෙතත් CVE-2014-6271 වෙනස් වේ.

පරිසර විචල්‍යයක විශ්වාසදායක දත්ත තිබීමේ වරදක් නැත. වැඩසටහන් හැසිරීම වෙනස් කළ හැකි පරිසර විචල්‍යයන් කිසිවක් එයට ඇතුළත් නොවන බවට යමෙකුට සහතික විය යුතුය. තව ටිකක් සාරාංශයක් තබන්න, විශේෂිත ආයාචනයක් සඳහා, ඔබට පරිසර විචල්‍ය නම් වල සුදු ලැයිස්තුවක් නිර්මාණය කළ හැකිය, ඒවා පිටස්තරයෙකු විසින් කෙලින්ම නියම කිරීමට අවසර දෙනු ලැබේ.

CVE-2014-6271 සන්දර්භය තුළ ඉදිරිපත් කර ඇති උදාහරණයක් වන්නේ ලොග්ෆයිල් විග්‍රහ කිරීම සඳහා භාවිතා කරන ස්ක්‍රිප්ට් ය. පාරිසරික විචල්‍යයන් තුළ විශ්වාසදායක නොවන දත්ත සම්ප්‍රේෂණය කිරීම සඳහා ඒවාට ඉතා නීත්‍යානුකූල අවශ්‍යතාවයක් තිබිය හැකිය. ඇත්ත වශයෙන්ම එවැනි පරිසර විචල්‍යයක නම තෝරාගෙන ඇත්තේ එයට කිසිදු අහිතකර බලපෑමක් ඇති නොවන බැවිනි.

නමුත් මෙම විශේෂිත බාෂ් අවදානම පිළිබඳ නරක දේ මෙන්න. ඕනෑම විචල්ය නාමයකින් එය සූරාකෑමට හැකිය. ඔබ නමින් පරිසර විචල්‍යයක් නිර්මාණය කරන්නේ නම් GET_REQUEST_TO_BE_PROCESSED_BY_MY_SCRIPT, ඔබේම පිටපතට අමතරව වෙනත් වැඩසටහනක් එම පරිසර විචල්‍යයේ අන්තර්ගතය අර්ථ නිරූපණය කරනු ඇතැයි ඔබ අපේක්ෂා නොකරයි. නමුත් මෙම bash දෝෂය ගසාකෑමෙන් සෑම පරිසර විචල්‍යයක්ම ප්‍රහාරක දෛශිකයක් බවට පත්වේ.

මෙයින් අදහස් කරන්නේ පරිසර විචල්‍යයන්ගේ නම් රහසක් යැයි අපේක්ෂා නොකරන බවයි. ඊට සම්බන්ධ පරිසර විචල්‍යයන්ගේ නම් දැන ගැනීම ප්‍රහාරයක් පහසු නොකරයි.

නම් program1ඇමතුම් program2හැරීම ඇමතුම් තුළ වන program3, එසේ නම් program1දත්ත යන්න නොහැකි program3පරිසරයක් විචල්ය හරහා. සෑම වැඩසටහනකටම එය සකසන පරිසර විචල්‍යයන්ගේ නිශ්චිත ලැයිස්තුවක් සහ එය ක්‍රියාත්මක වන නිශ්චිත ලැයිස්තුවක් ඇත. ඔබ විසින් හඳුනා ගෙන නොමැත නමක් තෝරා ගන්නවා නම් program2, ඔබ දත්ත උරුම විය හැකි program1කිරීමට program3මෙම අයහපත් මත බලපාන කවර ෙහෝ ලක්ෂණයක් සහිත වීම ගැන නොතකන program2.

අපනයනය කරන ලද විචල්‍යයන්ගේ නිශ්චිත නම් program1සහ අර්ථකථනය කරන ලද විචල්‍යයන්ගේ නම් දන්නා ප්‍රහාරකයෙකුට නම් program2මාලාව අතර අතිච්ඡාදනය නොමැති නම් 'program2` හි හැසිරීම වෙනස් කිරීමට මෙම දැනුම ප්‍රයෝජනයට ගත නොහැක.

නමුත් මෙම නම් කඩා program2වූයේ bashමෙම දෝෂය හේතුවෙන් නිසා, තිර bashසෑම පරිසර විචල්ය කේත ලෙස අර්ථ නිරූපණය වනු ඇත.


1
"සෑම පරිසර විචල්‍යයක්ම ප්‍රහාරක දෛශිකයක් බවට පත්වේ" - එය මා අතපසු කළ කොටසයි. ස්තූතියි.
wrschneider

9

ඔබ සම්බන්ධ කළ ලිපියෙන් එය පැහැදිලි කර ඇත ...

bash shell එක ඇමතීමට පෙර ඔබට විශේෂයෙන් සැකසූ අගයන් සහිත පරිසර විචල්‍යයන් නිර්මාණය කළ හැකිය. මෙම විචල්‍යයන්ට කේත අඩංගු විය හැකි අතර එය කවචය ක්‍රියාත්මක කළ විගස ක්‍රියාත්මක වේ.

එහි තේරුම -c "echo this is a test"කේතය කැඳවනු ලබන විට තනි උපුටා දැක්වීම්වල කේතය ක්‍රියාත්මක කිරීමයි.

තරමක් සීමිත ක්‍රියාත්මක කිරීමක දී වුවද, Bash හට කාර්යයන් ඇත, තවද මෙම bash ශ්‍රිතයන් පරිසර විචල්‍යයන්ට ඇතුළත් කළ හැකිය. මෙම ශ්‍රිත අර්ථ දැක්වීම්වල අවසානයට අතිරේක කේත එකතු කළ විට මෙම දෝෂය අවුලුවනු ලැබේ (පරිසර විචල්‍යය තුළ).

ඔබ විසින් පළ කරන ලද කේත උදාහරණයෙන් කියවෙන්නේ, පැවරුම සිදු කිරීමෙන් පසු ආයාචිත බැෂ් විසින් මෙම නූල ඇගයීම නතර නොකරන බවයි. මෙම නඩුවේ කාර්ය පැවරුමක්.

ඔබ විසින් පළ කරන ලද කේත ස්නිපටයේ ඇත්ත වශයෙන්ම විශේෂ දෙය නම්, මට තේරෙන පරිදි, අපට ක්‍රියාත්මක කිරීමට අවශ්‍ය කේතයට පෙර ශ්‍රිත අර්ථ දැක්වීමක් යෙදීමෙන් සමහර ආරක්ෂක යාන්ත්‍රණයන් මග හැරිය හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.