සියලු අර්ථකථනය කළ හැකි ක්රියාත්මක කළ හැකි දේවල (එනම් #!
රේඛාවකින් ආරම්භ වන ක්රියාත්මක කළ හැකි ) ලිනක්ස් සෙටූයිඩ් බිට් නොසලකා හරියි . මෙම comp.unix.questions නිතර අසන පැන setuid ෂෙල් අක්ෂර සමග ආරක්ෂක ගැටළු පැහැදිලි කරයි. මෙම ගැටළු වර්ග දෙකකි: ෂෙබාං ආශ්රිත සහ ෂෙල් සම්බන්ධ; මම පහත වැඩි විස්තර වෙත යන්නෙමි.
ඔබ ආරක්ෂාව ගැන තැකීමක් නොකරන්නේ නම් සහ ලිනක්ස් යටතේ සෙටූයිඩ් ස්ක්රිප්ට් වලට ඉඩ දීමට අවශ්ය නම්, ඔබට කර්නලය ඇලවිය යුතුය. කර්නල් 3.x වන විට, මම ඔබට ඇමතුමක් එකතු කිරීමට අවශ්ය හිතන්නේ install_exec_creds
තුළ load_script
වන ලෙස ඉල්ලා පෙර, ක්රියාව open_exec
, නමුත් මම පරීක්ෂා කර නැත.
සෙටුයිඩ් ෂෙබාං
#!
සාමාන්යයෙන් ෂෙබාං ( ) ක්රියාත්මක කරන ක්රමයට ආවේණික වූ ධාවන තත්වයක් ඇත :
- කර්නලය ක්රියාත්මක කළ හැකි දේ විවෘත කරන අතර එය ආරම්භ වන බව සොයා ගනී
#!
.
- කර්නලය ක්රියාත්මක කළ හැකි දේ වසා දමා ඒ වෙනුවට පරිවර්තකය විවෘත කරයි.
- කර්නලය විධාන ලැයිස්තුවට (ලෙස
argv[1]
) ස්ක්රිප්ටයට යන මාර්ගය ඇතුළු කර පරිවර්තකය ක්රියාත්මක කරයි.
මෙම ක්රියාවට නැංවීම සමඟ සෙටූයිඩ් ස්ක්රිප්ට් වලට ඉඩ දෙන්නේ නම්, ප්රහාරකයෙකුට අත්තනෝමතික ස්ක්රිප්ට් එකක් ආයාචනා කළ හැකිය, පවතින සෙටූයිඩ් ස්ක්රිප්ටයකට සංකේතාත්මක සබැඳියක් නිර්මාණය කිරීම, එය ක්රියාත්මක කිරීම සහ කර්නලය 1 වන පියවර සිදු කිරීමෙන් පසුව සහ පරිවර්තකයා වෙත යාමට පෙර සබැඳිය වෙනස් කිරීමට කටයුතු කිරීම. එහි පළමු තර්කය විවෘත කිරීම. මේ හේතුව නිසා, බොහෝ යුනිසස් ෂෙබාන්ග් එකක් හඳුනාගත් විට සෙටූයිඩ් බිට් නොසලකා හරියි .
මෙම ක්රියාවට නැංවීම සඳහා එක් ක්රමයක් වනුයේ පරිවර්තකයා එය විවෘත කරන තුරු කර්නලයට ස්ක්රිප්ට් ගොනුව අගුළු දැමීමයි (මෙය ගොනුව සම්බන්ධ කිරීම හෝ නැවත ලිවීම පමණක් නොව මාර්ගයේ ඕනෑම නාමාවලියක් නම් කිරීමද වළක්වා ගත යුතුය). නමුත් යුනික්ස් පද්ධති අනිවාර්ය අගුල් වලින් y ත් වීමට නැඹුරු වන අතර සංකේතාත්මක සම්බන්ධතා මඟින් නිවැරදි අගුලු අංගයක් විශේෂයෙන් දුෂ්කර හා ආක්රමණශීලී වනු ඇත. මම හිතන්නේ නැහැ කවුරුවත් මේ විදියට කරයි කියලා.
යුනික්ස් පද්ධති කිහිපයක් (ප්රධාන වශයෙන් OpenBSD, NetBSD සහ Mac OS X, මේ සියල්ලටම කර්නල් සැකසුම සක්රීය කිරීම අවශ්ය වේ) අතිරේක අංගයක් භාවිතා කරමින් ආරක්ෂිත සෙටූයිඩ් ෂෙබාං ක්රියාත්මක කරයි: මාර්ගය යනු ගොනු විස්තර කරුවන් N හි දැනටමත් විවෘත කර ඇති ගොනුවයි (එබැවින් විවෘත කිරීම දළ වශයෙන් සමාන වේ ). බොහෝ යුනික්ස් පද්ධති (ලිනක්ස් ඇතුළුව) සතුව ස්ක්රිප්ට් නොමැත./dev/fd/N
/dev/fd/N
dup(N)
/dev/fd
- කර්නලය ක්රියාත්මක කළ හැකි දේ විවෘත කරන අතර එය ආරම්භ වන බව සොයා ගනී
#!
. ක්රියාත්මක කළ හැකි ගොනු විස්තරය 3 යැයි කියමු.
- කර්නලය පරිවර්තකය විවෘත කරයි.
- කර්නලය
/dev/fd/3
තර්ක ලැයිස්තුව (ලෙස argv[1]
) ඇතුළු කර පරිවර්තකය ක්රියාත්මක කරයි.
ස්වෙන් Mascheck ගේ shebang පිටුව ඇතුළු unices හරහා shebang පිළිබඳ තොරතුරු ගොඩක් ඇති setuid සහයෝගය .
සෙටූයිඩ් පරිවර්තකයන්
ඔබේ මෙහෙයුම් පද්ධතිය සෙටූයිඩ් ෂෙබාං සඳහා සහය දක්වන නිසා හෝ ඔබ ස්වදේශීය ද්විමය එතුම භාවිතා කර ඇති නිසා (වැනි sudo
) ඔබේ වැඩසටහන මූලයක් ලෙස ක්රියාත්මක කිරීමට ඔබ සමත් වී ඇතැයි සිතමු . ඔබ ආරක්ෂක වළක් විවෘත කර තිබේද? සමහර විට . මෙහි ඇති ගැටළුව අර්ථකථනය කර එදිරිව සම්පාදනය කරන ලද වැඩසටහන් ගැන නොවේ . ගැටළුව වන්නේ වරප්රසාද සහිතව ක්රියාත්මක වන්නේ නම් ඔබේ ධාවන කාල පද්ධතිය ආරක්ෂිතව හැසිරේද යන්නයි .
ඕනෑම ගතිකව සම්බන්ධිත දේශීය ද්විමය ක්රියාත්මක කළ හැකි ආකාරයකින් ගතික පැටවුම (උදා /lib/ld.so
) විසින් අර්ථ නිරූපණය කරනු ලැබේ, එමඟින් වැඩසටහනට අවශ්ය ගතික පුස්තකාල පටවනු ලැබේ. බොහෝ යුනිසස් වලදී, ඔබට පරිසරය හරහා ගතික පුස්තකාල සඳහා සෙවුම් මාර්ගය වින්යාසගත කළ හැකිය ( LD_LIBRARY_PATH
පරිසර විචල්යයට පොදු නමකි), සහ ක්රියාත්මක කරන ලද ද්විමය ( LD_PRELOAD
) වෙත අතිරේක පුස්තකාල පවා පටවන්න . වැඩසටහනේ ආයාචකයාට විශේෂයෙන් සකසන libc.so
ලද $LD_LIBRARY_PATH
(වෙනත් උපක්රම අතර) ස්ථානගත කිරීමෙන් එම වැඩසටහනේ සන්දර්භය තුළ අත්තනෝමතික කේත ක්රියාත්මක කළ හැකිය . සියළුම බුද්ධිමත් පද්ධති LD_*
සෙටූයිඩ් ක්රියාත්මක කළ හැකි විචල්යයන් නොසලකා හරියි .
දී ෂෙල් වෙඩි , පරිසරය විචල්ය එවැනි sh, csh සහ එම ව ත්පන්න ලෙස ස්වයංක්රීයව ෂෙල් පරාමිතීන් බවට පත් වේ. වැනි පරාමිතීන් මගින් PATH
, IFS
හා, තවත් බොහෝ, තිර පිටපත් invoker ෂෙල් පිටපත් ගේ සන්දර්භය තුළ අත්තනෝමතික කේතය ක්රියාත්මක කිරීමට බොහෝ අවස්ථා ඇත. ස්ක්රිප්ට් වරප්රසාද සහිතව ආයාචනා කර ඇති බව අනාවරණය වුවහොත් සමහර ෂෙල් වෙඩි මෙම විචල්යයන් සුපුරුදු පෙරනිමි ලෙස සකසයි, නමුත් මා විශ්වාස කරන විශේෂිත ක්රියාත්මක කිරීමක් ඇති බව මම නොදනිමි.
බොහෝ ධාවන කාල පරිසරයන් (ස්වදේශීය, බයිට් කේතය හෝ අර්ථ නිරූපණය කළත්) සමාන ලක්ෂණ ඇත. ස්වදේශික කේතය ධාවනය කරන අය බොහෝ විට ගතික සම්බන්ධතාවයට වඩා උද්යෝගිමත් කිසිවක් නොකරයි (පූර්වාරක්ෂාව අවශ්ය වේ).
පර්ල් යනු සැලකිය යුතු ව්යතිරේකයකි. එය ආරක්ෂිත ආකාරයකින් සෙටූයිඩ් ස්ක්රිප්ට් සඳහා පැහැදිලිවම සහය දක්වයි . ඇත්ත වශයෙන්ම, ඔබේ මෙහෙයුම් පද්ධතිය ස්ක්රිප්ට් වල ඇති සෙටූයිඩ් බිට් නොසලකා හැරියද ඔබේ ස්ක්රිප්ටයට සෙටූයිඩ් ධාවනය කළ හැකිය. මෙයට හේතුව, පර්ල් විසින් අවශ්ය චෙක්පත් සිදුකරන සහ අපේක්ෂිත වරප්රසාද සහිතව අපේක්ෂිත ස්ක්රිප්ට් වල පරිවර්තකය නැවත පණගන්වන සෙටූයිඩ් මූල සහායකයකු සමඟ ය. පර්ල්සෙක් අත්පොතෙහි මෙය පැහැදිලි කර ඇත . එය කලින් භාවිතා කළ සෙටූයිඩ් පර්ල් ස්ක්රිප්ට් #!/usr/bin/suidperl -wT
වෙනුවට අවශ්ය වූ #!/usr/bin/perl -wT
නමුත් බොහෝ නවීන පද්ධතිවල #!/usr/bin/perl -wT
එය ප්රමාණවත් වේ.
මෙම ගැටළු වළක්වා ගැනීම සඳහා දේශීය ද්විමය එතුම භාවිතා කිරීම කිසිවක් නොකරන බව සලකන්න . ඇත්ත වශයෙන්ම, එය තත්වය වඩාත් නරක අතට හැරවිය හැකිය , මන්ද එය ඔබගේ ධාවන කාල පරිසරය වරප්රසාද සහිතව ආයාචනා කර ඇති බව අනාවරණය කර ගැනීමෙන් සහ එහි ධාවන කාල වින්යාසය මඟ හැරීම නිසා විය හැකිය.
ස්වදේශික ද්විමය එතුමකින් පරිසරය සනීපාරක්ෂාව කරන්නේ නම් ෂෙල් ස්ක්රිප්ටයක් ආරක්ෂිත කළ හැකිය . ස්ක්රිප්ට් ඕනෑවට වඩා උපකල්පන නොකිරීමට වගබලා ගත යුතුය (උදා: වත්මන් නාමාවලිය ගැන) නමුත් මෙය සිදු වේ. පරිසරය සනීපාරක්ෂාව සඳහා එය සකසා ඇති බැවින් ඔබට සුඩෝ භාවිතා කළ හැකිය. අසාදු ලේඛණ ලැයිස්තුගත කිරීම දෝෂ සහිත බැවින් සෑම විටම සුදු ලැයිස්තු ගත කරන්න. සුඩෝ සමඟ, env_reset
විකල්පය සක්රිය කර ඇති බවත්, setenv
එය අක්රිය කර ඇති බවත් env_file
, env_keep
එය අඩංගු වන්නේ අහිංසක විචල්යයන් පමණක් බවත් තහවුරු කරගන්න .
ටීඑල්, ඩීආර්:
- සෙටූයිඩ් ෂෙබාං අනාරක්ෂිත නමුත් සාමාන්යයෙන් නොසලකා හරිනු ලැබේ.
- ඔබ වරප්රසාද සහිත වැඩසටහනක් ක්රියාත්මක කරන්නේ නම් (එක්කෝ සුඩෝ හෝ සෙටූයිඩ් හරහා), ස්වදේශික කේතයක් හෝ පර්ල් එකක් ලියන්න, නැතහොත් පරිසරය සනීපාරක්ෂාව කරන එතුමකින් වැඩසටහන ආරම්භ කරන්න (
env_reset
විකල්පය සමඟ සුඩෝ වැනි ).
¹ ඔබ "setuid" සඳහා "setgid" ආදේශ නම්, මෙම සාකච්ඡා මෙහිලා අදාළ; ස්ක්රිප්ට් වල ලිනක්ස් කර්නලය විසින් ඒවා නොසලකා හරිනු ලැබේ