உறுதிமொழியை தனிமைப்படுத்தும் பொறிமுறையை லினக்ஸுக்கு போர்ட் செய்வதற்கான திட்டம்

Cosmopolitan Standard C நூலகம் மற்றும் Redbean இயங்குதளத்தின் ஆசிரியர் லினக்ஸிற்கான உறுதிமொழி() தனிமைப்படுத்தும் பொறிமுறையை செயல்படுத்துவதாக அறிவித்துள்ளார். உறுதிமொழி முதலில் OpenBSD திட்டத்தால் உருவாக்கப்பட்டது மற்றும் பயன்படுத்தப்படாத கணினி அழைப்புகளை அணுகுவதிலிருந்து பயன்பாடுகளைத் தேர்ந்தெடுத்துத் தடைசெய்ய உங்களை அனுமதிக்கிறது (பயன்பாட்டிற்காக ஒரு வகையான கணினி அழைப்புகளின் வெள்ளை பட்டியல் உருவாக்கப்படுகிறது, மேலும் பிற அழைப்புகள் தடைசெய்யப்பட்டுள்ளன). லினக்ஸில் இருக்கும் seccomp போன்ற கணினி அழைப்பு அணுகல் கட்டுப்பாடு வழிமுறைகளைப் போலன்றி, உறுதிமொழி பொறிமுறையானது முதலில் முடிந்தவரை பயன்படுத்த எளிதானதாக வடிவமைக்கப்பட்டது.

சிஸ்ட்ரேஸ் பொறிமுறையைப் பயன்படுத்தி OpenBSD அடிப்படை சூழலில் பயன்பாடுகளைத் தனிமைப்படுத்துவதற்கான தோல்வியுற்ற முயற்சியானது, தனிப்பட்ட கணினி அழைப்புகளின் மட்டத்தில் தனிமைப்படுத்தப்படுவது மிகவும் சிக்கலானது மற்றும் நேரத்தை எடுத்துக்கொள்ளும் என்பதைக் காட்டுகிறது. மாற்றாக, ஒரு உறுதிமொழி முன்மொழியப்பட்டது, இது விவரங்களுக்குச் செல்லாமலும் ஆயத்த அணுகல் வகுப்புகளைக் கையாளாமலும் தனிமைப்படுத்தும் விதிகளை உருவாக்குவதை சாத்தியமாக்கியது. எடுத்துக்காட்டாக, வழங்கப்படும் வகுப்புகள் stdio (உள்ளீடு/வெளியீடு), rpath (படிக்க மட்டும் கோப்புகள்), wpath (கோப்புகளை எழுத), cpath (கோப்புகளை உருவாக்க), tmppath (தற்காலிக கோப்புகளுடன் பணிபுரிதல்), inet (நெட்வொர்க் சாக்கெட்டுகள்), unix ( unix சாக்கெட்டுகள்), dns (DNS ரெசல்யூஷன்), getpw (பயனர் தரவுத்தளத்திற்கான அணுகலைப் படிக்கவும்), ioctl (ioctl அழைப்பு), proc (செயல்முறை மேலாண்மை), exec (செயல்முறை வெளியீடு) மற்றும் ஐடி (அணுகல் உரிமை மேலாண்மை).

கணினி அழைப்புகளுடன் பணிபுரிவதற்கான விதிகள் சிறுகுறிப்புகளின் வடிவத்தில் குறிப்பிடப்படுகின்றன, இதில் அனுமதிக்கப்பட்ட அமைப்பு அழைப்புகளின் பட்டியல் மற்றும் அணுகல் அனுமதிக்கப்படும் கோப்பு பாதைகளின் வரிசை ஆகியவை அடங்கும். மாற்றியமைக்கப்பட்ட பயன்பாட்டை உருவாக்கி துவக்கிய பிறகு, குறிப்பிட்ட விதிகளுக்கு இணங்குவதைக் கண்காணிக்கும் பணியை கர்னல் எடுத்துக்கொள்கிறது.

FreeBSD க்காக உறுதிமொழியின் ஒரு தனி செயலாக்கம் உருவாக்கப்படுகிறது, இது பயன்பாடுகளை அவற்றின் குறியீட்டில் மாற்றங்களைச் செய்யாமல் தனிமைப்படுத்தும் திறனால் வேறுபடுகிறது, அதே நேரத்தில் OpenBSD இல் உறுதிமொழி அழைப்பு அடிப்படை சூழலுடன் இறுக்கமான ஒருங்கிணைப்பை நோக்கமாகக் கொண்டுள்ளது மற்றும் ஒவ்வொன்றின் குறியீட்டிலும் சிறுகுறிப்புகளைச் சேர்க்கிறது. விண்ணப்பம்.

Linux க்கான உறுதிமொழி போர்ட்டின் டெவலப்பர்கள் FreeBSD இன் உதாரணத்தை எடுத்துக் கொண்டனர், மேலும் குறியீட்டில் மாற்றங்களைச் செய்வதற்குப் பதிலாக, பயன்பாட்டுக் குறியீட்டை மாற்றாமல் கட்டுப்பாடுகளைப் பயன்படுத்த உங்களை அனுமதிக்கும் ஒரு add-on utility pledge.com ஐத் தயாரித்தனர். எடுத்துக்காட்டாக, stdio, rpath, inet மற்றும் threadstdio அமைப்பு அழைப்பு வகுப்புகளுக்கான அணுகலுடன் கர்ல் பயன்பாட்டை இயக்க, “./pledge.com -p 'stdio rpath inet thread' curl http://example.com” ஐ இயக்கவும்.

உறுதிமொழி பயன்பாடு RHEL6 இல் தொடங்கி அனைத்து லினக்ஸ் விநியோகங்களிலும் வேலை செய்கிறது மற்றும் ரூட் அணுகல் தேவையில்லை. கூடுதலாக, காஸ்மோபாலிட்டன் நூலகத்தை அடிப்படையாகக் கொண்டு, சி மொழியில் நிரல் குறியீட்டில் கட்டுப்பாடுகளை நிர்வகிப்பதற்கு ஒரு API வழங்கப்படுகிறது, இது மற்றவற்றுடன், சில பயன்பாட்டு செயல்பாடுகள் தொடர்பாக அணுகலைத் தேர்ந்தெடுத்து கட்டுப்படுத்துவதற்கான என்கிளேவ்களை உருவாக்க அனுமதிக்கிறது.

செயலாக்கத்திற்கு கர்னலில் மாற்றங்கள் தேவையில்லை - உறுதிமொழி கட்டுப்பாடுகள் SECCOMP BPF விதிகளாக மொழிபெயர்க்கப்பட்டு, நேட்டிவ் லினக்ஸ் சிஸ்டம் கால் ஐசோலேஷன் பொறிமுறையைப் பயன்படுத்தி செயலாக்கப்படும். எடுத்துக்காட்டாக, அழைப்பு உறுதிமொழி ("stdio rpath", 0) BPF வடிகட்டி நிலையான கான்ஸ்ட் sock_filter kFilter ஆக மாற்றப்படும்[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0 ), / * L14*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L1*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 2 - 2, 4), /* L3*0), / / BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 3, 10, 0 - 13), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[4])), /* L1*/ BPB_/BPF_ST | BPF_K, ~5x0), /* L80800*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 1 - 8, 7), /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEK, | BPF_JEK, | 7, BPF_JEQ, , /* L2*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L13*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 8, 8 */*2, 9), /*L0, Bpf_jump (bpf_jmp | SECCOMP_RET_ALLOW), /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L10*/* அடுத்த வடிகட்டி */ };

ஆதாரம்: opennet.ru

கருத்தைச் சேர்