የቃል ኪዳኑን ማግለል ዘዴን ወደ ሊኑክስ የማድረስ ፕሮጀክት

የኮስሞፖሊታን ሲ መደበኛ ቤተ-መጽሐፍት ደራሲ እና የሬድበን መድረክ ለሊኑክስ የቃል ኪዳን () ማግለል ዘዴ መተግበሩን አስታውቀዋል። ቃል ኪዳኑ በመጀመሪያ የተዘጋጀው በOpenBSD ፕሮጀክት ነው እና ትግበራዎች ጥቅም ላይ ያልዋሉ የስርዓት ጥሪዎችን እንዳይደርሱ መርጠው እንዲከለከሉ ያስችልዎታል (ለመተግበሪያው ነጭ የስርዓት ጥሪዎች ዝርዝር ተዘጋጅቷል እና ሌሎች ጥሪዎች የተከለከሉ ናቸው)። በሊኑክስ ውስጥ ከሚገኙት የሳይሲካል መዳረሻ መቆጣጠሪያ ስልቶች እንደ ሴክኮምፕ ሳይሆን የቃል ኪዳኑ ዘዴ በተቻለ መጠን ለመጠቀም ቀላል እንዲሆን ከመሬት ተነስቶ ተዘጋጅቷል።

በOpenBSD ቤዝ አካባቢ ውስጥ ያሉ መተግበሪያዎችን የስርዓተ-ፆታ ዘዴን በመጠቀም የማግለል ያልተሳካ ተነሳሽነት እንደሚያሳየው በግለሰብ የስርዓት ጥሪዎች ደረጃ ማግለል በጣም የተወሳሰበ እና ጊዜ የሚወስድ ነው። እንደ አማራጭ፣ ቃል መግባት ቀርቦ ነበር፣ ይህም ወደ ዝርዝር ጉዳዮች ሳይገባ እና ዝግጁ የሆኑ የመዳረሻ ክፍሎችን ሳይጠቀም የመነጠል ህጎችን መፍጠር ያስችላል። ለምሳሌ ፣ የሚቀርቡት ክፍሎች stdio (ግቤት / ውፅዓት) ፣ rpath (ፋይሎችን ማንበብ ብቻ) ፣ wpath (ፋይሎችን መፃፍ) ፣ cpath (ፋይሎችን መፍጠር) ፣ tmppath (ከጊዜያዊ ፋይሎች ጋር መሥራት) ፣ inet (የአውታረ መረብ ሶኬቶች) ፣ ዩኒክስ (ዩኒክስ) ናቸው። ሶኬቶች) ፣ ዲ ኤን ኤስ (ዲ ኤን ኤስ ጥራት) ፣ getpw (የተጠቃሚ ዳታቤዝ መዳረሻን ያንብቡ) ፣ ioctl (የጥሪ ioctl) ፣ ፕሮሲ (የሂደት ቁጥጥር) ፣ ኤክሰ (ሂደቶችን ጅምር) እና መታወቂያ (የፍቃድ ቁጥጥር)።

ከስርዓት ጥሪዎች ጋር አብሮ የመስራት ህጎች የተፈቀዱ የስርዓት የጥሪ ክፍሎች ዝርዝር እና የተፈቀደላቸው የፋይል መንገዶችን በሚያካትቱ ማብራሪያዎች መልክ ተገልጸዋል። የተሻሻለውን መተግበሪያ ከገነባ እና ካስኬደ በኋላ፣ ከርነሉ ከተጠቀሱት ህጎች ጋር መጣጣምን የመቆጣጠር ስራውን ይረከባል።

በተናጥል ፣ ለFreeBSD የቃል ኪዳኑ ትግበራ እየተዘጋጀ ነው ፣ ይህም በኮዳቸው ላይ ለውጦችን ሳያደርጉ መተግበሪያዎችን የማግለል ችሎታ የሚለየው ፣ በ OpenBSD ውስጥ የቃል ኪዳን ጥሪው ከመሠረታዊ አከባቢ ጋር ጥብቅ ውህደት እና በእያንዳንዱ ኮድ ላይ ማብራሪያዎችን ለመጨመር ነው ። ማመልከቻ.

የሊኑክስ ወደብ ቃል ኪዳን ገንቢዎች የ FreeBSD ምሳሌን ወስደዋል እና በኮዱ ላይ ለውጦችን ከማድረግ ይልቅ የማመልከቻውን ኮድ ሳይቀይሩ ገደቦችን ተግባራዊ ለማድረግ የሚያስችል የ pledge.com add-on utility አዘጋጁ። ለምሳሌ፣ የ curl utilityን ወደ ስቴዲዮ፣ rpath፣ inet እና threadstdio ስርዓት የጥሪ ክፍሎች መዳረሻ ብቻ ለማሄድ "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" ብቻ ያሂዱ። .

የቃል ኪዳኑ መገልገያ ከRHEL6 ጀምሮ በሁሉም የሊኑክስ ስርጭቶች ላይ ይሰራል እና ስርወ መዳረሻን አያስፈልገውም። በተጨማሪም፣ በኮስሞፖሊታን ቤተ መፃህፍት ላይ በመመስረት፣ በC ቋንቋ ውስጥ ባሉ የፕሮግራሞች ኮድ ውስጥ ገደቦችን ለመቆጣጠር ኤፒአይ ተዘጋጅቷል፣ ይህም ከሌሎች ነገሮች በተጨማሪ ከተወሰኑ የመተግበሪያ ተግባራት ጋር በተገናኘ መዳረሻን የሚገድብ ማቀፊያዎችን ለመፍጠር ያስችላል።

አተገባበሩ በከርነል ላይ ለውጦችን አይፈልግም - የቃል ኪዳን ገደቦች ወደ SECCOMP BPF ህጎች ተተርጉመዋል እና የሊኑክስን ስርዓት ማግለል ዘዴን በመጠቀም ይካሄዳሉ። ለምሳሌ፣ የቃል ኪዳን ጥሪ("stdio rpath"፣ 0) ወደ BPF ማጣሪያ የማይንቀሳቀስ ኮንስት struct sock_filter kFilter[] = {/* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 -) ይቀየራል። 1))/* L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS፣ OFF(args[0]))፣ /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K፣ 2፣ 4 - 3፣ 0)፣ /* L3 */ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K፣ 10፣ 0፣ 13 - 4)፣ /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS፣ OFF(args [1])))/* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K፣ ~0x80800)፣ /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K፣ 1፣ 8 - 7፣ 0)፣ /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K፣ 2፣ -0፣ 13 ), /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS፣ OFF(args[8]))፣/* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K፣ 9፣ 0 - 12፣ 10)፣ /*L0* / BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 6 - 12, 11), /*L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 11, 17, 0 - 13), /*L11*/ BPF_STMT(BPF_STMT) , SECCOMP_RET_ALLOW)፣ /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS፣ OFF(nr))፣ /*L13*/ /* ቀጣይ ማጣሪያ */};

ምንጭ: opennet.ru

አስተያየት ያክሉ