ලිනක්ස් හි ගොනු අවසර

ආයුබෝවන් සියල්ලටම. අපි ක්‍රියාශීලීව වැඩට බැස සිටින අතර දැනටමත් ජනවාරි මාසයේදී බොහෝ ප්‍රබල දියත් කිරීම් සූදානම් කරමින් සිටිමු. අනෙක් ඒවා අතර, සියලු දෙනාගේ ප්‍රියතම පාඨමාලාවේ නව ප්‍රවාහයක් සඳහා බඳවා ගැනීම නිවේදනය කර ඇත. "ලිනක්ස් පරිපාලක". දියත් කිරීම අපේක්ෂාවෙන්, අපි සම්ප්‍රදායිකව ප්‍රයෝජනවත් ද්‍රව්‍යවල පරිවර්තන බෙදා ගනිමු.

ලිනක්ස් හි ගොනු අවසර

ගොනු අවසරයන් SUID ක්‍රියාත්මක කිරීමට ආරක්ෂිත විකල්පයක් ඉදිරිපත් කරයි, නමුත් මුලදී ටිකක් ව්‍යාකූල විය හැක.


අපි හැමෝම දන්නවා ද්විමය බව SUID වේ ආරක්ෂක දෘෂ්ටි කෝණයෙන් නරක තීරණයක්. වාසනාවකට මෙන්, ඔබගේ යෙදුමට සීමිත වරප්‍රසාද කිහිපයක් අවශ්‍ය නම්, වඩාත් කාර්යක්ෂම ක්‍රමයක් ලෙස හැඳින්වේ ගොනු අවසර.

ඔබට ඉහත ලිපිය විස්තරාත්මකව කියවීමෙන් වැළකී සිටීමට අවශ්‍ය නම් මම ඔබට යම් කාලයක් ඉතිරි කරමි: අත්‍යවශ්‍යයෙන්ම, ගොනු අවසර මඟින් root ලෙස ක්‍රියාත්මක වන ක්‍රියාවලීන්ට ඉඩ ලබා දෙන අතර එම නිසා යම් යම් හැකියාවන් රඳවා ගැනීමට යමක් කිරීමට අවසර ඇත, සීමිතය මෙම ලැයිස්තුවඔවුන් වරප්‍රසාද අතහැර වරප්‍රසාද ලත් පරිශීලකයෙකු විසින් ක්‍රියාත්මක කරන විට. මෙයින් අදහස් කරන්නේ ප්‍රහාරකයෙකු බෆර පිටාර ගැලීමක් හෝ වෙනත් සූරාකෑමක් භාවිතා කරමින් ක්‍රියාවලියක් සම්මුතියකට පත් කිරීමට සමත් වුවහොත්, ක්‍රියාවලියට සැබවින්ම අවශ්‍ය ඇතැම් අවම වරප්‍රසාද හැර වෙනත් කිසිවක් ප්‍රයෝජනයට ගැනීමට ඔවුන්ට නොහැකි වනු ඇති බවයි.

සාමාන්‍යයෙන් සෑම විටම root ලෙස ක්‍රියාත්මක වන සේවාවන් සඳහා අවසර විශිෂ්ටයි, නමුත් විධාන රේඛා උපයෝගිතා ගැන කුමක් කිව හැකිද? වාසනාවකට මෙන්, ඔබ නිවැරදි උපයෝගිතා ස්ථාපනය කර ඇත්නම් මෙයද සහාය දක්වයි. ඔබ Ubuntu භාවිතා කරන්නේ නම්, උදාහරණයක් ලෙස ඔබට පැකේජය අවශ්‍ය වේ libcap2-bin. ඔබට පෞරාණික නොවන කර්නලයක් ද ධාවනය කිරීමට අවශ්‍ය වනු ඇත (අනුවාදයෙන් 2.6.24).

මෙම කාර්යයන් මඟින් SUID බිට් සැකසීමට සමාන ක්‍රියාත්මක කළ හැකි ගොනු සමඟ අවසර සම්බන්ධ කිරීමට ඉඩ ලබා දේ, නමුත් විශේෂිත අවසර කට්ටලයක් සඳහා පමණි. උපයෝගිතා setcap ගොනුවකට අවසර එකතු කිරීමට සහ ඉවත් කිරීමට භාවිතා කරයි.

පළමු පියවර වන්නේ ඔබට අවශ්ය අවසර තෝරා ගැනීමයි. මෙම ලිපිය සඳහා, මම උපකල්පනය කරන්නේ ජාල රෝග විනිශ්චය මෙවලමක් ඇති බවයි tracewalk, භාවිතා කිරීමට හැකි විය යුතුය අමු සොකට්. මෙය සාමාන්‍යයෙන් යෙදුම root ලෙස ධාවනය කිරීම අවශ්‍ය වේ, නමුත් බැලීමේදී ලැයිස්තුව අවසරය පමණක් අවශ්‍ය බව පෙනී යයි CAP_NET_RAW.

ඔබ ද්විමය පිහිටා ඇති නාමාවලියෙහි යැයි උපකල්පනය කරයි tracewalk, ඔබට මෙම අවසරය මෙලෙස එකතු කළ හැක:

sudo setcap cap_net_raw=eip tracewalk

දැනට උපසර්ගය නොසලකා හරින්න =eip විසඳුම සඳහා, මම තත්පර කිහිපයකින් ඒ ගැන කතා කරන්නම්. අවසර නාමය කුඩා අකුරින් ඇති බව සලකන්න. ඔබ නිවැරදිව අවසර වින්‍යාස කර ඇත්දැයි දැන් ඔබට පරීක්ෂා කළ හැක:

setcap -v cap_new_raw=eip tracewalk

නැතහොත් ඔබට ලබා දී ඇති ක්‍රියාත්මක කළ හැකි සියලුම අවසරයන් ලැයිස්තුගත කළ හැක:

getcap tracewalk

යොමුව සඳහා, ඔබට ක්‍රියාත්මක කළ හැකි සියලු අවසරයන් ඉවත් කළ හැක්කේ:

setcap -r tracewalk

මෙම අවස්ථාවේදී, ඔබට වරප්‍රසාද රහිත පරිශීලකයෙකු ලෙස executable ධාවනය කිරීමට හැකි විය යුතු අතර, එය raw sockets සමඟ වැඩ කිරීමට හැකි විය යුතුය, නමුත් root පරිශීලකයාට ඇති වෙනත් වරප්‍රසාද කිසිවක් නොතිබිය යුතුය.

ඉතින් මේ අමුතු උපසර්ගයේ තේරුම කුමක්ද? =eip? මේ සඳහා අවසරවල ස්වභාවය පිළිබඳව යම් අවබෝධයක් අවශ්‍ය වේ. සෑම ක්‍රියාවලියකටම අවසර කට්ටල තුනක් ඇත - ඵලදායී, උරුම වූ සහ අවසර ලත්:

  • ඵලදායී අවසර යනු ක්‍රියාවලියකට සැබවින්ම කළ හැකි දේ නිර්වචනය කරන ඒවා වේ. උදාහරණයක් ලෙස, එය නම් අමු සොකට් සමඟ කටයුතු කළ නොහැක CAP_NET_RAW ඵලදායී කට්ටලයේ නොවේ.
  • ඇත අවසර යනු ක්‍රියාවලියකට සුදුසු ඇමතුමක් භාවිතා කර ඒවා ඉල්ලා සිටියහොත් ලබා ගැනීමට අවසර ඇති ඒවා වේ. එම අවසරය ඉල්ලා සිටීම සඳහා විශේෂයෙන් ලියා ඇති ක්‍රියාවලියක් මිස ක්‍රියාවලියක් සත්‍ය වශයෙන්ම කිරීමෙන් ඔවුන් වළක්වයි. මෙය සැබවින්ම අවශ්‍ය කාල සීමාව සඳහා පමණක් ඵලදායී කට්ටලයට තීරණාත්මක අවසර එකතු කිරීමට ක්‍රියාවලි ලිවීමට ඉඩ සලසයි.
  • පරම්පරාගත අවසරයන් යනු පැටවූ ළමා ක්‍රියාවලියේ ප්‍රවේශ විය හැකි කට්ටලය තුළ උරුම විය හැකි ඒවා වේ. ශල්යකර්මයේදී fork() හෝ clone() ළමා ක්‍රියාවලියට සෑම විටම මාපිය ක්‍රියාවලියේ අවසරවල පිටපතක් ලබා දෙන්නේ එය එම අවස්ථාවේදීම ක්‍රියාත්මක කළ හැකි ආකාරයටම ක්‍රියාත්මක වන බැවිනි. විට පරම්පරාගත කට්ටලයක් භාවිතා වේ exec() (හෝ ඊට සමාන) ක්‍රියාත්මක කළ හැකි ගොනුව වෙනත් එකක් සමඟ ප්‍රතිස්ථාපනය කිරීමට කැඳවනු ලැබේ. මෙම අවස්ථාවෙහිදී, නව ක්‍රියාවලිය සඳහා භාවිතා කරනු ලබන ප්‍රවේශ විය හැකි කට්ටලය ලබා ගැනීම සඳහා ක්‍රියාවලියේ පවතින කට්ටලය ප්‍රවේණිගත කට්ටලය මගින් වසං කරනු ලැබේ.

එබැවින් උපයෝගීතාව setcap දී ඇති ක්‍රියාත්මක කළ හැකි එකක් සඳහා මෙම කට්ටල තුනේ අවසරයන් ස්වාධීනව එක් කිරීමට අපට ඉඩ සලසයි. ගොනු අවසර සඳහා කණ්ඩායම්වල අර්ථය තරමක් වෙනස් ලෙස අර්ථකථනය කර ඇති බව සලකන්න:

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

හරහා අවසරයන් සඳහන් කරන විට setcap අකුරු තුනක් e, i и p වෙත යොමු වන්න ඵලදායී, උරුම වූ සහ ප්රවේශ විය හැකි පිළිවෙලින් කට්ටල. එබැවින්, පෙර පිරිවිතර:

sudo setcap cap_net_raw=eip tracewalk

... යෝජනාව බව පෙන්නුම් කරයි CAP_NET_RAW පවතින සහ පරම්පරාගත කට්ටලවලට එකතු කළ යුතු අතර ඵලදායී බිටු ද සැකසිය යුතුය. මෙය ගොනුවේ කලින් සකසා ඇති අවසරයන් අභිබවා යයි. එකවර අවසර කිහිපයක් සැකසීමට, කොමාවෙන් වෙන් කළ ලැයිස්තුවක් භාවිතා කරන්න:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

අවසර මාර්ගෝපදේශය මේ සියල්ල වඩාත් සවිස්තරාත්මකව සාකච්ඡා කරයි, නමුත් මෙම පෝස්ට් එකෙන් සිදුවන්නේ කුමක් ද යන්න අවමානයට ලක් කර ඇත. සඳහන් කිරීමට ඉතිරිව ඇත්තේ අනතුරු ඇඟවීම් සහ උපක්‍රම කිහිපයක් පමණි.

පළමුව, ගොනු හැකියාවන් symlinks සමඟ ක්‍රියා නොකරයි - ඔබ ඒවා ද්විමය ගොනුවටම යෙදිය යුතුය (එනම් symlink හි ඉලක්කය).

දෙවනුව, ඒවා අර්ථකථනය කරන ලද ස්ක්‍රිප්ට් සමඟ ක්‍රියා නොකරයි. උදාහරණයක් ලෙස, ඔබට අවසර ලබා දීමට අවශ්‍ය පයිතන් ස්ක්‍රිප්ට් එකක් තිබේ නම්, ඔබ එය පයිතන් පරිවර්තකයටම පැවරිය යුතුය. පැහැදිලිවම මෙය විභව ආරක්ෂක ගැටළුවක් වන්නේ එවිට එම පරිවර්තකය සමඟ ක්‍රියාත්මක කරන ලද සියලුම ස්ක්‍රිප්ට් වලට නිශ්චිත අවසරය හිමි වනු ඇත, නමුත් මෙය තවමත් එය SUID බවට පත් කිරීමට වඩා සැලකිය යුතු තරම් හොඳ ය. වඩාත්ම පොදු විසඳුම වන්නේ අවශ්‍ය මෙහෙයුම් සිදු කළ හැකි සහ ස්ක්‍රිප්ට් එකකින් ඇමතීමට හැකි වෙනම ක්‍රියාත්මක කළ හැකි C හෝ ඊට සමාන ලෙස ලිවීමයි. මෙය බයිනරි භාවිතා කරන Wireshark විසින් භාවිතා කරන ප්‍රවේශයට සමාන වේ /usr/bin/dumpcap වරප්රසාදිත මෙහෙයුම් සිදු කිරීමට:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

තෙවනුව, ඔබ පරිසර විචල්‍යයක් භාවිතා කරන්නේ නම් ගොනු අවසර අක්‍රිය වේ LD_LIBRARY_PATH පැහැදිලි ආරක්ෂක හේතූන් මත(1). සඳහා ද අදාළ වේ LD_PRELOAD, මම දන්නා විදිහට.

1. ප්‍රහාරකයෙකුට පැහැදිලිවම සම්මත පුස්තකාලවලින් එකක් ප්‍රතිස්ථාපනය කර භාවිතා කළ හැකි බැවින් LD_LIBRARY_PATHඑහි පුස්තකාලය පද්ධතියට වඩා ප්‍රමුඛව ඇමතීමට බල කිරීම සහ එම නිසා ඇමතුම් යෙදුමට සමාන වරප්‍රසාද සහිතව ක්‍රියාත්මක කර ඇති තමන්ගේම අත්තනෝමතික කේතයක් ඇත.

එච්චරයි. පාඨමාලා වැඩසටහන පිළිබඳ වැඩි විස්තර මෙතැනින් සොයාගත හැකිය webinar, එය ජනවාරි 24 වන දින පැවැත්වේ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න