ෂෙල් ස්ක්‍රිප්ට් මත සෙටූයිඩ් කිරීමට ඉඩ දෙන්න


197

මෙම setuidඅවසර ටිකක් අද්මිනිස්ත්රාසිකකරු සඵල පරිශීලක හිමිකරු වෙනුවට අංකය සහිත වැඩසටහනක් ක්රියාත්මක කිරීමට ලිනක්ස් කියයි:

> cat setuid-test.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

> gcc -o setuid-test setuid-test.c
> ./setuid-test

1000

> sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
> ./setuid-test

65534

කෙසේ වෙතත්, මෙය අදාළ වන්නේ ක්‍රියාත්මක කළ හැකි අයට පමණි; ෂෙල් ස්ක්‍රිප්ට් සෙටූයිඩ් බිට් නොසලකා හරියි:

> cat setuid-test2

#!/bin/bash
id -u

> ./setuid-test2

1000

> sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2
> ./setuid-test2

1000

විකිපීඩියාව පවසන්නේ :

ආරක්ෂක අඩුපාඩු වැඩි වීමේ සම්භාවිතාව නිසා, බොහෝ මෙහෙයුම් පද්ධති ක්‍රියාත්මක කළ හැකි ෂෙල් ස්ක්‍රිප්ට් සඳහා යොදන විට සෙටූයිඩ් ගුණාංගය නොසලකා හරිනු ලැබේ.

මම එම අවදානම් භාර ගැනීමට කැමැත්තෙන් සිටිමි යැයි සිතමු, ක්‍රියාත්මක කළ හැකි ආකාරයටම ෂෙල් ස්ක්‍රිප්ට් වලද සෙටූයිඩ් බිට් එක සමාන ලෙස සලකන ලෙස ලිනක්ස් වෙත පැවසීමට ක්‍රමයක් තිබේද?

එසේ නොවේ නම්, මෙම ගැටළුව සඳහා පොදු විසඳුමක් තිබේද? මගේ වර්තමාන විසඳුම නම් , මුරපද විමසුමෙන් වැළකී , ලබා දී ඇති ස්ක්‍රිප්ටයක් මට අවශ්‍ය පරිශීලකයා ලෙස ක්‍රියාත්මක sudoersකිරීමට ඉඩ දීම ALLසඳහා ප්‍රවේශයක් එක් කිරීමයි NOPASSWD. මෙහි ඇති ප්‍රධාන අවාසිය නම් මට මෙය කිරීමට අවශ්‍ය sudoersසෑම අවස්ථාවකම ප්‍රවේශයක් ලබා ගැනීමේ අවශ්‍යතාවය සහ අමතන්නාට sudo some-scriptසාධාරණ වෙනුවට ඒ වෙනුවට අවශ්‍යතාවයයිsome-script

Answers:


214

සියලු අර්ථකථනය කළ හැකි ක්‍රියාත්මක කළ හැකි දේවල (එනම් #!රේඛාවකින් ආරම්භ වන ක්‍රියාත්මක කළ හැකි ) ලිනක්ස් සෙටූයිඩ් බිට් නොසලකා හරියි . මෙම comp.unix.questions නිතර අසන පැන setuid ෂෙල් අක්ෂර සමග ආරක්ෂක ගැටළු පැහැදිලි කරයි. මෙම ගැටළු වර්ග දෙකකි: ෂෙබාං ආශ්‍රිත සහ ෂෙල් සම්බන්ධ; මම පහත වැඩි විස්තර වෙත යන්නෙමි.

ඔබ ආරක්ෂාව ගැන තැකීමක් නොකරන්නේ නම් සහ ලිනක්ස් යටතේ සෙටූයිඩ් ස්ක්‍රිප්ට් වලට ඉඩ දීමට අවශ්‍ය නම්, ඔබට කර්නලය ඇලවිය යුතුය. කර්නල් 3.x වන විට, මම ඔබට ඇමතුමක් එකතු කිරීමට අවශ්ය හිතන්නේ install_exec_credsතුළ load_scriptවන ලෙස ඉල්ලා පෙර, ක්රියාව open_exec, නමුත් මම පරීක්ෂා කර නැත.


සෙටුයිඩ් ෂෙබාං

#!සාමාන්‍යයෙන් ෂෙබාං ( ) ක්‍රියාත්මක කරන ක්‍රමයට ආවේණික වූ ධාවන තත්වයක් ඇත :

  1. කර්නලය ක්‍රියාත්මක කළ හැකි දේ විවෘත කරන අතර එය ආරම්භ වන බව සොයා ගනී #!.
  2. කර්නලය ක්‍රියාත්මක කළ හැකි දේ වසා දමා ඒ වෙනුවට පරිවර්තකය විවෘත කරයි.
  3. කර්නලය විධාන ලැයිස්තුවට (ලෙස argv[1]) ස්ක්‍රිප්ටයට යන මාර්ගය ඇතුළු කර පරිවර්තකය ක්‍රියාත්මක කරයි.

මෙම ක්‍රියාවට නැංවීම සමඟ සෙටූයිඩ් ස්ක්‍රිප්ට් වලට ඉඩ දෙන්නේ නම්, ප්‍රහාරකයෙකුට අත්තනෝමතික ස්ක්‍රිප්ට් එකක් ආයාචනා කළ හැකිය, පවතින සෙටූයිඩ් ස්ක්‍රිප්ටයකට සංකේතාත්මක සබැඳියක් නිර්මාණය කිරීම, එය ක්‍රියාත්මක කිරීම සහ කර්නලය 1 වන පියවර සිදු කිරීමෙන් පසුව සහ පරිවර්තකයා වෙත යාමට පෙර සබැඳිය වෙනස් කිරීමට කටයුතු කිරීම. එහි පළමු තර්කය විවෘත කිරීම. මේ හේතුව නිසා, බොහෝ යුනිසස් ෂෙබාන්ග් එකක් හඳුනාගත් විට සෙටූයිඩ් බිට් නොසලකා හරියි .

මෙම ක්‍රියාවට නැංවීම සඳහා එක් ක්‍රමයක් වනුයේ පරිවර්තකයා එය විවෘත කරන තුරු කර්නලයට ස්ක්‍රිප්ට් ගොනුව අගුළු දැමීමයි (මෙය ගොනුව සම්බන්ධ කිරීම හෝ නැවත ලිවීම පමණක් නොව මාර්ගයේ ඕනෑම නාමාවලියක් නම් කිරීමද වළක්වා ගත යුතුය). නමුත් යුනික්ස් පද්ධති අනිවාර්ය අගුල් වලින් y ත් වීමට නැඹුරු වන අතර සංකේතාත්මක සම්බන්ධතා මඟින් නිවැරදි අගුලු අංගයක් විශේෂයෙන් දුෂ්කර හා ආක්‍රමණශීලී වනු ඇත. මම හිතන්නේ නැහැ කවුරුවත් මේ විදියට කරයි කියලා.

යුනික්ස් පද්ධති කිහිපයක් (ප්‍රධාන වශයෙන් OpenBSD, NetBSD සහ Mac OS X, මේ සියල්ලටම කර්නල් සැකසුම සක්‍රීය කිරීම අවශ්‍ය වේ) අතිරේක අංගයක් භාවිතා කරමින් ආරක්ෂිත සෙටූයිඩ් ෂෙබාං ක්‍රියාත්මක කරයි: මාර්ගය යනු ගොනු විස්තර කරුවන් N හි දැනටමත් විවෘත කර ඇති ගොනුවයි (එබැවින් විවෘත කිරීම දළ වශයෙන් සමාන වේ ). බොහෝ යුනික්ස් පද්ධති (ලිනක්ස් ඇතුළුව) සතුව ස්ක්‍රිප්ට් නොමැත./dev/fd/N/dev/fd/Ndup(N)/dev/fd

  1. කර්නලය ක්‍රියාත්මක කළ හැකි දේ විවෘත කරන අතර එය ආරම්භ වන බව සොයා ගනී #!. ක්‍රියාත්මක කළ හැකි ගොනු විස්තරය 3 යැයි කියමු.
  2. කර්නලය පරිවර්තකය විවෘත කරයි.
  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" ආදේශ නම්, මෙම සාකච්ඡා මෙහිලා අදාළ; ස්ක්‍රිප්ට් වල ලිනක්ස් කර්නලය විසින් ඒවා නොසලකා හරිනු ලැබේ


2
Os ජොෂ්: ආරක්ෂිත සෙටූයිඩ් ෂෙල් ස්ක්‍රිප්ට් කළ හැකි නමුත් ෂෙල් ක්‍රියාත්මක කරන්නා සහ ස්ක්‍රිප්ට් රචකයා යන දෙදෙනාම ඉතා ප්‍රවේශම් වන්නේ නම් පමණි. ස්වදේශීය කේතයට වඩා, මම පර්ල් නිර්දේශ කරමි, එහිදී පිටපත් රචකයාගේ පැත්තෙන් සුළු පරිශ්‍රමයකින් සෙටූයිඩ් ස්ක්‍රිප්ට් සුරක්‍ෂිත විය යුතු බවට ක්‍රියාත්මක කරන්නන් සැලකිලිමත් විය.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

3
පෙනෙන විදිහට suidperlදේවල් ඉවත් කර වසර ගණනාවක් තිස්සේ ඉවත් කිරීම සඳහා සලකුණු කර ඇත (නමුත් නොඅඩු ලෙස පවතී)
jmtd

7
suidperlපර්ල් 5.11 (5.12 ස්ථාවර) අනුව සත්‍ය වශයෙන්ම ඉවත් කර ඇත: perl5110delta:> "suidperl" ඉවත් කර ඇත. එය නිසි ලෙස සහාය නොදක්වන පද්ධතිවල සැකසුම් අවසර බිටු අනුකරණය කිරීමට යාන්ත්‍රණයක් සැපයීමට එය භාවිතා කළේය. perl5120delta:> "suidperl" තවදුරටත් පර්ල් හි කොටසක් නොවේ. එය නිසි ලෙස සහාය නොදක්වන පද්ධතිවල සැකසුම් අවසර බිටු අනුකරණය කිරීමට යාන්ත්‍රණයක් සැපයීමට එය භාවිතා කළේය.
රැන්ඩි ස්ටෝනර්

5
පර්ල් 5.6.1 ලියකියවිලි වලින් (දශකයකට පමණ පෙර) මෙම රේඛාවද සටහන් කරන්න ... perl561delta:> suidperl පෙරනිමියෙන් කිසිදු පර්ල් අනුවාදයක පෙරනිමියෙන් ගොඩනගා හෝ ස්ථාපනය කර නොමැති බව සලකන්න. Suidperl භාවිතය ඉතා හැරේ . ඔබට එය අවශ්‍ය යැයි ඔබ සිතන්නේ නම්, පළමුව සුඩෝ වැනි විකල්ප උත්සාහ කරන්න. Courtesan.com/sudo බලන්න .
රැන්ඩි ස්ටෝනර්

3
මට තේරෙන්නේ නැත: මෙය ගැටළු සඳහා හේතු පැහැදිලි කිරීමක් ලෙස පෙනේ, නමුත් OP හි ප්‍රශ්නයට සත්‍ය පිළිතුරක් මෙහි තිබේද? සෙටූයිඩ් ෂෙල් ස්ක්‍රිප්ට් ධාවනය කරන ලෙස මගේ මෙහෙයුම් පද්ධතියට පැවසීමට ක්‍රමයක් තිබේද?
ටොම්

57

මෙම ගැටළුව විසඳීමේ එක් ක්‍රමයක් නම් සෙටූයිඩ් බිට් භාවිතා කළ හැකි වැඩසටහනකින් ෂෙල් ස්ක්‍රිප්ට් ඇමතීමයි.
එය සුඩෝ වැනි දෙයක්. උදාහරණයක් ලෙස, සී වැඩසටහනකින් ඔබ මෙය ඉටු කරන්නේ කෙසේද යන්න මෙන්න:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 0 );   // you can set it at run time also
    system( "/home/pubuntu/setuid-test2.sh" );
    return 0;
 }

එය setuid-test2.c ලෙස සුරකින්න.
සම්පාදනය
කරන්න දැන් මෙම වැඩසටහනේ ද්විමය සැකසුම කරන්න:

su - nobody   
[enter password]  
chown nobody:nobody a.out  
chmod 4755 a.out  

දැන්, ඔබට එය ක්‍රියාත්මක කිරීමට හැකි විය යුතු අතර, ඔබගේ ස්ක්‍රිප්ට් එක කිසිවෙකුගේ අවසරයකින් තොරව ක්‍රියාත්මක වන බව ඔබට පෙනෙනු ඇත.
නමුත් මෙහිදී ඔබට ස්ක්‍රිප්ට් මාර්ගය දෘ c කේත කිරීම හෝ එය ඉහත exe වෙත විධාන රේඛා ලෙස යැවිය යුතුය.


26
විධාන රේඛා තර්කයක් ලෙස ස්ක්‍රිප්ට් එක සම්මත කිරීමට ඉඩ දෙන ලෙසට මම යෝජනා කරමි. එමඟින් වැඩසටහන ක්‍රියාත්මක කළ හැකි ඕනෑම කෙනෙකුට එම ස්ක්‍රිප්ට් එක නිර්වචනය කළ පරිශීලකයා ලෙස ක්‍රියාත්මක කිරීමේ හැකියාව ලබා දේ.
dsp

41
ස්ක්‍රිප්ටයේ සම්පූර්ණ මාර්ගය දෘඩ කේත කර තිබුණද මෙය අනාරක්ෂිත බව සලකන්න. කවචය පරිසරයෙන් විචල්‍යයන් උරුම කර ගන්නා අතර ඒවායින් බොහොමයක් ආරාධිතයාට අත්තනෝමතික කේත එන්නත් කිරීමට ඉඩ දෙයි. PATHසහ LD_LIBRARY_PATHපැහැදිලි දෛශික වේ. සමහර ෂෙල් වෙඩි ක්රියාත්මක $ENVහෝ $BASHENVහෝ ~/.zshenvඑසේ ඔබ තිර රචනය තුළ සියලු දී මෙම ආරක්ෂා නොහැකි, ඔවුන් නිසි තිර රචනය ක්රියාත්මක ආරම්භ පවා පෙර. වරප්‍රසාද සහිත ෂෙල් පිටපතක් ඉල්ලා සිටීමට ඇති එකම ආරක්ෂිත ක්‍රමය වන්නේ පරිසරය පිරිසිදු කිරීමයි . එය ආරක්ෂිතව කරන්නේ කෙසේදැයි සුඩෝ දනී. එබැවින් ඔබේම එතුම ලියන්න එපා, සුඩෝ භාවිතා කරන්න .
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

30
ඔහු හදිසියේම මේ සඳහා අවතක්සේරු කිරීම ගැන මට නරකක් දැනේ - අනාරක්ෂිත අනුවාදයන් ඇසීමට මට අවශ්‍ය යැයි මම විශේෂයෙන් කීවෙමි, මම එය කියූ විට ෂෙල් ස්ක්‍රිප්ට් තර්කයක් ගත් ක්‍රියාත්මක කළ හැකි යැයි සිතමින් සිටියෙමි. නිසැකවම එය විශාල වශයෙන් අනාරක්ෂිත ය, නමුත් පවතින හැකියාවන් මොනවාදැයි දැන ගැනීමට මට අවශ්‍ය විය
මයිකල් මොරොසෙක්

9
Il ගිලස්: FYI, ලිනක්ස් සෙටූයිඩ් LD_LIBRARY_PATHබිට් හමු වූ විට වෙනත් දේ අතර නොගැලපේ .
user1686

3
භාවිතා කිරීම වෙනුවට system, execපවුලෙන් එකක් භාවිතා කිරීම ඔබට වඩාත් සරල (හා වඩා කාර්යක්ෂම) විය හැකිය - බොහෝ දුරට ඉඩ execveඇත. ඒ ආකාරයෙන්, ඔබ නව ක්‍රියාවලියක් නිර්මාණය කිරීම හෝ කවචයක් ආරම්භ කිරීම නොකරන අතර ඔබට තර්ක ඉදිරිපත් කළ හැකිය (ඔබේ වරප්‍රසාදිත පිටපතට තර්ක ආරක්ෂාකාරීව හැසිරවිය හැකි යැයි උපකල්පනය කරන්න).
ටෝබි ස්පයිට්

24

මම මේ බෝට්ටුවේ ඇති පිටපත් කිහිපයක් උපසර්ග කරමි:

#!/bin/sh
[ "root" != "$USER" ] && exec sudo $0 "$@"

මෙය භාවිතා නොකරන setuidනමුත් වත්මන් ගොනුව සමඟ ක්‍රියාත්මක කරන බව සලකන්න sudo.


5
මෙය සෙටූයිඩ් භාවිතා නොකරන නමුත් ඔබට sudoවිමසුමක් ලබා දෙයි . (මට නම්, setuid මුළු අවස්ථාවකදී සියල්ල sudo යාමකින් තොරව root ලෙස ක්රියාත්මක කිරීමට ඉඩ ඇත.)
ලූක්

12

ඔබට ඇමතුමෙන් වැළකී සිටීමට අවශ්‍ය නම් ඔබට sudo some_scriptකළ හැක්කේ:

  #!/ust/bin/env sh

  sudo /usr/local/scripts/your_script

SETUID වැඩසටහන් මූල වරප්‍රසාද සමඟ ක්‍රියාත්මක වන බැවින් ඒවා අතිශයින්ම පරිස්සමින් සැලසුම් කළ යුතු අතර පරිශීලකයින්ට ඒවා මත විශාල පාලනයක් ඇත. ඔවුන් සෑම දෙයක්ම සනීපාරක්ෂාව පරීක්ෂා කළ යුතුය. ඔබට එය ස්ක්‍රිප්ට් සමඟ කළ නොහැක.

  • ෂෙල් වෙඩි යනු පරිශීලකයා සමඟ දැඩි ලෙස අන්තර්ක්‍රියා කරන විශාල මෘදුකාංගයකි. සෑම දෙයක්ම සනීපාරක්ෂාව පරීක්ෂා කිරීම පාහේ කළ නොහැක්කකි - විශේෂයෙන් බොහෝ කේත එවැනි ආකාරයකින් ක්‍රියාත්මක කිරීමට අදහස් නොකරන බැවින්.
  • ස්ක්‍රිප්ට් බොහෝ දුරට ඉක්මන් අපිරිසිදු විසඳුමක් වන අතර සාමාන්‍යයෙන් ඒවා ඉතා පරිස්සමින් සකස් නොකෙරේ. ඒවායින් බොහෝ භයානක ලක්ෂණ ඇත.
  • ඔවුන් වෙනත් වැඩසටහන් මත දැඩි ලෙස රඳා පවතී. කවචය පරීක්ෂා කිරීම ප්රමාණවත් නොවේ. sed, awkආදිය පරීක්ෂා කිරීම අවශ්‍ය වේ

sudoයම්කිසි සනීපාරක්ෂාව පිරික්සීමක් සපයන නමුත් එය ප්‍රමාණවත් නොවන බව කරුණාවෙන් සලකන්න - ඔබේම කේතයේ සෑම පේළියක්ම පරීක්ෂා කරන්න.

අවසාන සටහනක් ලෙස: හැකියාවන් භාවිතා කිරීම සලකා බලන්න. සාමාන්‍යයෙන් මූල වරප්‍රසාද අවශ්‍ය වන විශේෂ වරප්‍රසාද පරිශීලකයෙකු ලෙස ක්‍රියාත්මක කිරීමට ඒවා ඔබට ඉඩ දෙයි. කෙසේ වෙතත්, උදාහරණයක් ලෙස, pingජාලය හැසිරවීමට අවශ්‍ය වුවද , එයට ලිපිගොනු වෙත ප්‍රවේශය අවශ්‍ය නොවේ. කෙසේ වෙතත් ඒවා උරුම වී ඇත්දැයි මට විශ්වාස නැත.


2
මම හිතන්නේ /ust/bin/envවිය යුතුයි /usr/bin/env.
බොබ්

5

super [-r reqpath] විධානය [args]

නිශ්චිත පරිශීලකයින්ට මූලයන් මෙන් ස්ක්‍රිප්ට් (හෝ වෙනත් විධාන) ක්‍රියාත්මක කිරීමට සුපර් ඉඩ දෙයි; හෝ එය විධානය ක්‍රියාත්මක කිරීමට පෙර එක් විධානයකට අනුව uid, gid, සහ / හෝ අතිරේක කණ්ඩායම් සැකසිය හැකිය. ස්ක්‍රිප්ට් සෙටූඩ් රූට් බවට පත් කිරීම සඳහා ආරක්ෂිත විකල්පයක් වීමට අදහස් කෙරේ. සුපර් සාමාන්‍ය පරිශීලකයින්ට වෙනත් අය විසින් ක්‍රියාත්මක කිරීම සඳහා විධාන සැපයීමට ඉඩ දෙයි; මේවා ක්‍රියාත්මක වන්නේ විධානය ලබා දෙන පරිශීලකයාගේ uid, gid සහ කණ්ඩායම් සමඟ ය.

ඉල්ලූ විධානය ක්‍රියාත්මක කිරීමට පරිශීලකයාට අවසර තිබේදැයි බැලීමට සුපර් විසින් `` සුපර් ටැබ් '' ගොනුවක් විමසයි. අවසරය ලබා දෙන්නේ නම්, සුපර් විසින් pgm [args] ක්‍රියාත්මක කරනු ඇත, එහිදී pgm යනු මෙම විධානය සමඟ සම්බන්ධිත වැඩසටහනයි. (පෙරනිමියෙන් Root ක්‍රියාත්මක කිරීමට අවසර දී ඇත, නමුත් රීතියක් root බැහැර කළ හොත් එය ප්‍රතික්ෂේප කළ හැකිය. සාමාන්‍ය පරිශීලකයින්ට පෙරනිමියෙන් ක්‍රියාත්මක කිරීමට අවසර නැත.)

විධානය යනු සුපිරි වැඩසටහනට සංකේතාත්මක සබැඳියක් (හෝ දෘ link සබැඳියක් ද) නම්,% විධාන ආර්ග් ටයිප් කිරීම% සුපර් කමාන්ඩ් ආර්ග් ටයිප් කිරීමට සමාන වේ (විධානය සුපිරි නොවිය යුතුය, නැතහොත් එය හරහා ආරාධනා කරන බව සුපිරි හඳුනා නොගනී. සබැඳිය.)

http://www.ucolick.org/~will/RUE/super/README

http://manpages.ubuntu.com/manpages/utopic/en/man1/super.1.html


ආයුබෝවන්, වෙබ් අඩවියට සාදරයෙන් පිළිගනිමු! මෙහි පිළිතුරු වඩාත් සවිස්තරාත්මක වනු ඇතැයි අපි අපේක්ෂා කරමු. ඔබට ඔබේ පිළිතුර සංස්කරණය කර මෙම වැඩසටහන කුමක්ද සහ එය OP හි ගැටළුව විසඳීමට උපකාරී වන්නේ කෙසේද යන්න පැහැදිලි කළ හැකිද?
ටර්ඩන්

ස්තූතියි නිසාම්, ගොනුවේ පරිශීලකයා ලෙස වෙනත් පරිශීලකයෙකු විසින් ක්‍රියාත්මක කිරීමට ඉඩ ලබා දීම සඳහා ගිණුම් සඳහා සුපිරි වැනි දෙයක් සොයා ගැනීමට පැය ගණනක් උත්සාහ කිරීම.
චැඩ්

4

ස්ක්‍රිප්ටයේ නම sudo + සඳහා අන්වර්ථයක් නිර්මාණය කළ හැකිය. ඇත්ත වශයෙන්ම, එය සැකසීමට ඊටත් වඩා වැඩකි, මන්ද ඔබට පසුව අන්වර්ථයක්ද සැකසිය යුතුය, නමුත් එය සුඩෝ ටයිප් කිරීමෙන් ඔබව ගලවා ගනී.

නමුත් ඔබට භයානක ආරක්ෂක අවදානම් ගැන සැලකිලිමත් නොවන්නේ නම්, ෂෙල් ස්ක්‍රිප්ටයේ පරිවර්තකයා ලෙස සෙටූයිඩ් ෂෙල් එකක් භාවිතා කරන්න. එය ඔබට ප්‍රයෝජනවත් වේදැයි නොදනී, නමුත් මම හිතන්නේ එය එසේ විය හැකිය.

ඇත්ත වශයෙන්ම මෙය කිරීමට එරෙහිව මම උපදෙස් දෙන බව ප්‍රකාශ කිරීමට මට ඉඩ දෙන්න. මම එය අධ්‍යාපන අරමුණු සඳහා පමණක් සඳහන් කරමි ;-)


5
එය ක්‍රියාත්මක වනු ඇත. ඔබ ප්‍රකාශ කළ පරිදි දරුණු ලෙස. SETUID බිට් හිමිකරු සමඟ නිවැරදිව ක්‍රියාත්මක කිරීමට ඉඩ දෙයි. Setuid shell (එය setuid සමඟ වැඩ කිරීමට නිර්මාණය කර නොමැති නම්) ඕනෑම පරිශීලකයෙකු සඳහා root ලෙස ක්‍රියාත්මක වේ. ඕනෑම කෙනෙකුට ධාවනය කළ හැකිය rm -rf /(සහ වෙනත් විධානයන් ගෙදරින් කරන්න එපා ).
මැකීජ් පීචොට්කා

9
විසින් @MaciejPiechotka කරන්න එපා එය මුල් පිටුව ඔබ අදහස් වැඩ ඒක කරන්න නිදහස් වන්න? :)
පීටර්ෆ්

2

කිසියම් හේතුවක් sudoනිසා ලබා ගත නොහැකි නම්, ඔබට C හි තුනී එතීමේ පිටපතක් ලිවිය හැකිය:

#include <unistd.h>
int main() {
    setuid(0);
    execle("/bin/bash","bash","/full/path/to/script",(char*) NULL,(char*) NULL);
}

නම් හා ඔබ විසින් එය සම්පාදනය වරක් ලෙස සැකසීමට setuidසමග chmod 4511 wrapper_script.

මෙය තවත් පළ කරන ලද පිළිතුරකට සමානය, නමුත් පිටපත පිරිසිදු පරිසරයකින් ධාවනය කර පැහැදිලිවම භාවිතා කරයි /bin/bash වන අතර එය කැඳවූ කවචය වෙනුවටsystem() , එබැවින් සමහර විභව ආරක්ෂක සිදුරු වසා දමයි.

මෙය පරිසරය මුළුමනින්ම බැහැර කරන බව සලකන්න. අවදානම් විවෘත නොකර සමහර පාරිසරික විචල්‍යයන් භාවිතා කිරීමට ඔබට අවශ්‍ය නම්, ඔබ සැබවින්ම භාවිතා කළ යුතුයsudo යුතුය.

නිසැකවම, ඔබට අවශ්‍ය වන්නේ පිටපත ලිවිය හැක්කේ මූලයෙන් පමණක් බව තහවුරු කර ගැනීමටය.


-3

මම මුලින්ම මෙම ප්‍රශ්නය සොයාගත්තෙමි, සියලු පිළිතුරු වලට එකඟ නොවී, මෙහි වඩා හොඳ ප්‍රශ්නයක් ඇත, එමඟින් ඔබ එතරම් නැඹුරු නම් ඔබේ බෑෂ් පිටපත සම්පූර්ණයෙන්ම අපැහැදිලි කිරීමට ඉඩ සලසයි!

එය ස්වයං පැහැදිලි කිරීමක් විය යුතුය.

#include <string>
#include <unistd.h>

template <typename T, typename U>
T &replace (
          T &str, 
    const U &from, 
    const U &to)
{
    size_t pos;
    size_t offset = 0;
    const size_t increment = to.size();

    while ((pos = str.find(from, offset)) != T::npos)
    {
        str.replace(pos, from.size(), to);
        offset = pos + increment;
    }

    return str;
}

int main(int argc, char* argv[])
{
    // Set UUID to root
    setuid(0);

    std::string script = 
R"(#!/bin/bash
whoami
echo $1
)";

    // Escape single quotes.
    replace(script, std::string("'"), std::string("'\"'\"'"));

    std::string command;
    command = command + "bash -c '" + script + "'"; 

    // Append the command line arguments.
    for (int a = 0; a < argc; ++a)
    {
        command = command + " " + argv[a];
    }

    return system(command.c_str());
}

එහෙනම් ඔයා දුවනවා

g++ embedded.cpp -o embedded
sudo chown root embedded
sudo chmod u+s embedded

පහත වැටීම් ඇයි ???
තියඩෝර් ආර්. ස්මිත්

2
බොහෝ විට එය ඕනෑවට වඩා සංකීර්ණ විසඳුමක් වන අතර එය නූල් හැසිරවීම සහ ෂෙල් කේතය කාවැදී ඇත. එක්කෝ ඔබ සරල දියත් කිරීමක් කරන්න, නැතහොත් ඔබ සුඩෝ භාවිතා කරයි. සියලු විකල්පයන්ගෙන් නරකම දේ මෙයයි.
සර්
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.