திறன் ஒப்பந்தப் பாதுகாப்பு கருவிகளுக்கான வழிகாட்டி
நாம் மூன்று தனித்துவமான சோதனை மற்றும் நிரல் பகுப்பாய்வு நுட்பங்களைப் பயன்படுத்தப் போகிறோம்:
- ஸ்லித்தர் மூலம் நிலையான பகுப்பாய்வு (Static analysis). நிரலின் அனைத்துப் பாதைகளும் தோராயமாக்கப்பட்டு, வெவ்வேறு நிரல் விளக்கங்கள் (எ.கா., கட்டுப்பாட்டு-ஓட்ட-வரைபடம்) மூலம் ஒரே நேரத்தில் பகுப்பாய்வு செய்யப்படுகின்றன.
- எக்கிட்னா மூலம் ஃபஸ்ஸிங் (Fuzzing). பரிவர்த்தனைகளின் போலி-சீரற்ற (pseudo-random) உருவாக்கத்துடன் குறியீடு செயல்படுத்தப்படுகிறது. கொடுக்கப்பட்ட பண்பை மீறுவதற்கான பரிவர்த்தனைகளின் வரிசையைக் கண்டறிய ஃபஸ்ஸர் (fuzzer) முயற்சிக்கும்.
- மேண்டிகோர் மூலம் குறியீட்டுச் செயலாக்கம் (Symbolic execution). இது ஒரு முறைசார் சரிபார்ப்பு நுட்பமாகும், இது ஒவ்வொரு செயலாக்கப் பாதையையும் ஒரு கணித சூத்திரமாக மொழிபெயர்க்கிறது, இதன் அடிப்படையில் கட்டுப்பாடுகளைச் சரிபார்க்கலாம்.
ஒவ்வொரு நுட்பத்திற்கும் நன்மைகள் மற்றும் குறைபாடுகள் உள்ளன, மேலும் அவை குறிப்பிட்ட நிகழ்வுகளில் பயனுள்ளதாக இருக்கும்:
| நுட்பம் | கருவி | பயன்பாடு | வேகம் | தவறவிடப்பட்ட பிழைகள் | தவறான எச்சரிக்கைகள் |
|---|---|---|---|---|---|
| நிலையான பகுப்பாய்வு | ஸ்லித்தர் | CLI மற்றும் ஸ்கிரிப்டுகள் | வினாடிகள் | மிதமானது | குறைவு |
| ஃபஸ்ஸிங் | எக்கிட்னா | Solidity பண்புகள் | நிமிடங்கள் | குறைவு | இல்லை |
| குறியீட்டுச் செயலாக்கம் | மேண்டிகோர் | Solidity பண்புகள் மற்றும் ஸ்கிரிப்டுகள் | மணிநேரங்கள் | இல்லை* | இல்லை |
* காலாவதியாகாமல் (timeout) அனைத்துப் பாதைகளும் ஆராயப்பட்டால்
ஸ்லித்தர் ஒப்பந்தங்களைச் சில வினாடிகளுக்குள் பகுப்பாய்வு செய்கிறது, இருப்பினும், நிலையான பகுப்பாய்வு தவறான எச்சரிக்கைகளுக்கு வழிவகுக்கும் மற்றும் சிக்கலான சரிபார்ப்புகளுக்கு (எ.கா., எண்கணிதச் சரிபார்ப்புகள்) குறைவான பொருத்தமாக இருக்கும். உள்ளமைக்கப்பட்ட கண்டறிதல் கருவிகளை (built-in detectors) எளிதாக அணுக API மூலம் ஸ்லித்தரை இயக்கவும் அல்லது பயனர் வரையறுத்த சரிபார்ப்புகளுக்கு API மூலம் இயக்கவும்.
எக்கிட்னா பல நிமிடங்கள் இயங்க வேண்டும் மற்றும் உண்மையான நேர்மறைகளை (true positives) மட்டுமே உருவாக்கும். Solidity-யில் எழுதப்பட்ட, பயனர் வழங்கிய பாதுகாப்புப் பண்புகளை எக்கிட்னா சரிபார்க்கிறது. இது சீரற்ற ஆய்வை அடிப்படையாகக் கொண்டிருப்பதால் பிழைகளைத் தவறவிடக்கூடும்.
மேண்டிகோர் "மிகவும் ஆழமான" பகுப்பாய்வைச் செய்கிறது. எக்கிட்னாவைப் போலவே, மேண்டிகோரும் பயனர் வழங்கிய பண்புகளைச் சரிபார்க்கிறது. இது இயங்குவதற்கு அதிக நேரம் தேவைப்படும், ஆனால் இது ஒரு பண்பின் செல்லுபடியை நிரூபிக்க முடியும் மற்றும் தவறான எச்சரிக்கைகளைப் புகாரளிக்காது.
பரிந்துரைக்கப்பட்ட பணிப்பாய்வு
இப்போது எந்த எளிய பிழைகளும் இல்லை அல்லது பின்னர் அறிமுகப்படுத்தப்படாது என்பதை உறுதிப்படுத்த, ஸ்லித்தரின் உள்ளமைக்கப்பட்ட கண்டறிதல் கருவிகளுடன் தொடங்கவும். மரபுரிமை (inheritance), மாறி சார்புகள் (variable dependencies) மற்றும் கட்டமைப்புச் சிக்கல்கள் தொடர்பான பண்புகளைச் சரிபார்க்க ஸ்லித்தரைப் பயன்படுத்தவும். குறியீட்டுத் தளம் வளரும்போது, நிலை இயந்திரத்தின் (state machine) சிக்கலான பண்புகளைச் சோதிக்க எக்கிட்னாவைப் பயன்படுத்தவும். ஒரு சார்பு (function) மேலெழுதப்படுவதிலிருந்து (overridden) பாதுகாப்பது போன்ற Solidity-யில் கிடைக்காத பாதுகாப்புகளுக்கான தனிப்பயன் சரிபார்ப்புகளை உருவாக்க ஸ்லித்தரை மீண்டும் பயன்படுத்தவும். இறுதியாக, முக்கியமான பாதுகாப்புப் பண்புகளின் (எ.கா., எண்கணித செயல்பாடுகள்) இலக்கு வைக்கப்பட்ட சரிபார்ப்பைச் செய்ய மேண்டிகோரைப் பயன்படுத்தவும்.
- பொதுவான சிக்கல்களைக் கண்டறிய ஸ்லித்தரின் CLI-ஐப் பயன்படுத்தவும்
- உங்கள் ஒப்பந்தத்தின் உயர்மட்டப் பாதுகாப்புப் பண்புகளைச் சோதிக்க எக்கிட்னாவைப் பயன்படுத்தவும்
- தனிப்பயன் நிலையான சரிபார்ப்புகளை எழுத ஸ்லித்தரைப் பயன்படுத்தவும்
- முக்கியமான பாதுகாப்புப் பண்புகளின் ஆழமான உறுதிப்பாடு உங்களுக்குத் தேவைப்படும்போது மேண்டிகோரைப் பயன்படுத்தவும்
அலகுச் சோதனைகள் (Unit tests) பற்றிய ஒரு குறிப்பு. உயர்தர மென்பொருளை உருவாக்க அலகுச் சோதனைகள் அவசியம். இருப்பினும், பாதுகாப்புப் பிழைகளைக் கண்டறிய இந்த நுட்பங்கள் மிகவும் பொருத்தமானவை அல்ல. அவை பொதுவாகக் குறியீட்டின் நேர்மறையான நடத்தைகளைச் சோதிக்கப் பயன்படுத்தப்படுகின்றன (அதாவது, குறியீடு சாதாரண சூழலில் எதிர்பார்த்தபடி செயல்படுகிறது), அதேசமயம் பாதுகாப்புப் பிழைகள் டெவலப்பர்கள் கருத்தில் கொள்ளாத விளிம்பு நிலைகளில் (edge cases) இருக்க முனைகின்றன. டஜன் கணக்கான திறன் ஒப்பந்தப் பாதுகாப்பு மதிப்பாய்வுகள் குறித்த எங்கள் ஆய்வில், எங்கள் வாடிக்கையாளரின் குறியீட்டில் நாங்கள் கண்டறிந்த பாதுகாப்புப் பிழைகளின் எண்ணிக்கை அல்லது தீவிரத்தில் அலகுச் சோதனை கவரேஜ் எந்த விளைவையும் ஏற்படுத்தவில்லை (புதிய தாவலில் திறக்கப்படும்).
பாதுகாப்புப் பண்புகளைத் தீர்மானித்தல்
உங்கள் குறியீட்டைத் திறம்படச் சோதித்துச் சரிபார்க்க, கவனம் தேவைப்படும் பகுதிகளை நீங்கள் அடையாளம் காண வேண்டும். பாதுகாப்பிற்காகச் செலவிடப்படும் உங்கள் வளங்கள் குறைவாக இருப்பதால், உங்கள் முயற்சியை மேம்படுத்த உங்கள் குறியீட்டுத் தளத்தின் பலவீனமான அல்லது அதிக மதிப்புள்ள பகுதிகளை வரையறுப்பது முக்கியம். அச்சுறுத்தல் மாதிரியாக்கம் (Threat modeling) இதற்கு உதவலாம். பின்வருவனவற்றை மதிப்பாய்வு செய்வதைக் கருத்தில் கொள்ளவும்:
- விரைவான இடர் மதிப்பீடுகள் (Rapid Risk Assessments) (புதிய தாவலில் திறக்கப்படும்) (நேரம் குறைவாக இருக்கும்போது நாங்கள் விரும்பும் அணுகுமுறை)
- தரவு மைய அமைப்பு அச்சுறுத்தல் மாதிரியாக்கத்திற்கான வழிகாட்டி (புதிய தாவலில் திறக்கப்படும்) (NIST 800-154 எனவும் அழைக்கப்படுகிறது)
- ஷோஸ்டாக் அச்சுறுத்தல் மாதிரியாக்கம் (Shostack threat modeling) (புதிய தாவலில் திறக்கப்படும்)
- STRIDE (புதிய தாவலில் திறக்கப்படும்) / DREAD (புதிய தாவலில் திறக்கப்படும்)
- PASTA (புதிய தாவலில் திறக்கப்படும்)
- உறுதிமொழிகளின் பயன்பாடு (Use of Assertions) (புதிய தாவலில் திறக்கப்படும்)
கூறுகள்
நீங்கள் எதைச் சரிபார்க்க விரும்புகிறீர்கள் என்பதை அறிந்துகொள்வது சரியான கருவியைத் தேர்ந்தெடுக்கவும் உதவும்.
திறன் ஒப்பந்தங்களுக்கு அடிக்கடி தொடர்புடைய பரந்த பகுதிகள் பின்வருமாறு:
-
நிலை இயந்திரம் (State machine). பெரும்பாலான ஒப்பந்தங்களை ஒரு நிலை இயந்திரமாகக் குறிப்பிடலாம். (1) எந்தவொரு தவறான நிலையையும் அடைய முடியாது, (2) ஒரு நிலை செல்லுபடியாகும் என்றால் அதை அடைய முடியும், மற்றும் (3) எந்த நிலையும் ஒப்பந்தத்தைப் பொறிக்குள் சிக்கவைக்காது என்பதைச் சரிபார்க்கவும்.
- நிலை-இயந்திர விவரக்குறிப்புகளைச் சோதிக்க எக்கிட்னா மற்றும் மேண்டிகோர் ஆகியவை விரும்பத்தக்க கருவிகளாகும்.
-
அணுகல் கட்டுப்பாடுகள் (Access controls). உங்கள் கணினியில் சலுகை பெற்ற பயனர்கள் (எ.கா., உரிமையாளர், கட்டுப்பாட்டாளர்கள், ...) இருந்தால், (1) ஒவ்வொரு பயனரும் அங்கீகரிக்கப்பட்ட செயல்களை மட்டுமே செய்ய முடியும் மற்றும் (2) எந்தவொரு பயனரும் அதிகச் சலுகை பெற்ற பயனரின் செயல்களைத் தடுக்க முடியாது என்பதை நீங்கள் உறுதிப்படுத்த வேண்டும்.
- சரியான அணுகல் கட்டுப்பாடுகளை ஸ்லித்தர், எக்கிட்னா மற்றும் மேண்டிகோர் சரிபார்க்க முடியும். எடுத்துக்காட்டாக, அனுமதிக்கப்பட்ட (whitelisted) சார்புகளில் மட்டுமே onlyOwner மாற்றியமைப்பான் (modifier) இல்லை என்பதை ஸ்லித்தர் சரிபார்க்க முடியும். ஒப்பந்தம் ஒரு குறிப்பிட்ட நிலையை அடைந்தால் மட்டுமே வழங்கப்படும் அனுமதி போன்ற சிக்கலான அணுகல் கட்டுப்பாட்டிற்கு எக்கிட்னா மற்றும் மேண்டிகோர் பயனுள்ளதாக இருக்கும்.
-
எண்கணித செயல்பாடுகள். எண்கணித செயல்பாடுகளின் நம்பகத்தன்மையைச் சரிபார்ப்பது மிகவும் முக்கியமானது. அளவுமீறல்/குறைவு (overflow/underflow) ஏற்படுவதைத் தடுக்க எல்லா இடங்களிலும்
SafeMathஐப் பயன்படுத்துவது ஒரு நல்ல படியாகும், இருப்பினும், ரவுண்டிங் சிக்கல்கள் மற்றும் ஒப்பந்தத்தைப் பொறிக்குள் சிக்கவைக்கும் பிழைகள் உள்ளிட்ட பிற எண்கணிதப் பிழைகளையும் நீங்கள் கருத்தில் கொள்ள வேண்டும்.- இங்கு மேண்டிகோர் சிறந்த தேர்வாகும். எண்கணிதம் SMT தீர்ப்பானின் (solver) வரம்பிற்கு வெளியே இருந்தால் எக்கிட்னாவைப் பயன்படுத்தலாம்.
-
மரபுரிமைச் சரிபார்ப்பு (Inheritance correctness). Solidity ஒப்பந்தங்கள் பல மரபுரிமைகளை (multiple inheritance) பெரிதும் நம்பியுள்ளன.
superஅழைப்பு இல்லாத ஷேடோவிங் சார்பு (shadowing function) மற்றும் தவறாகப் புரிந்துகொள்ளப்பட்ட c3 லீனியரைசேஷன் வரிசை போன்ற தவறுகள் எளிதில் அறிமுகப்படுத்தப்படலாம்.- இந்தச் சிக்கல்களைக் கண்டறிவதை உறுதி செய்வதற்கான கருவி ஸ்லித்தர் ஆகும்.
-
வெளிப்புறத் தொடர்புகள். ஒப்பந்தங்கள் ஒன்றுக்கொன்று தொடர்பு கொள்கின்றன, மேலும் சில வெளிப்புற ஒப்பந்தங்களை நம்பக்கூடாது. எடுத்துக்காட்டாக, உங்கள் ஒப்பந்தம் வெளிப்புற ஆரக்கிள்களை (oracles) நம்பியிருந்தால், கிடைக்கக்கூடிய ஆரக்கிள்களில் பாதி சமரசம் செய்யப்பட்டால் அது பாதுகாப்பாக இருக்குமா?
- உங்கள் ஒப்பந்தங்களுடனான வெளிப்புறத் தொடர்புகளைச் சோதிக்க மேண்டிகோர் மற்றும் எக்கிட்னா சிறந்த தேர்வாகும். வெளிப்புற ஒப்பந்தங்களை ஸ்டப் (stub) செய்வதற்கான உள்ளமைக்கப்பட்ட பொறிமுறையை மேண்டிகோர் கொண்டுள்ளது.
-
தரநிலை இணக்கம் (Standard conformance). எத்திரியம் தரநிலைகள் (எ.கா., ERC-20) அவற்றின் வடிவமைப்பில் பிழைகளின் வரலாற்றைக் கொண்டுள்ளன. நீங்கள் உருவாக்கும் தரநிலையின் வரம்புகளைப் பற்றி அறிந்திருங்கள்.
- கொடுக்கப்பட்ட தரநிலையிலிருந்து விலகல்களைக் கண்டறிய ஸ்லித்தர், எக்கிட்னா மற்றும் மேண்டிகோர் உங்களுக்கு உதவும்.
கருவித் தேர்வுக்கான வழிகாட்டி (cheatsheet)
| கூறு | கருவிகள் | எடுத்துக்காட்டுகள் |
|---|---|---|
| நிலை இயந்திரம் | எக்கிட்னா, மேண்டிகோர் | |
| அணுகல் கட்டுப்பாடு | ஸ்லித்தர், எக்கிட்னா, மேண்டிகோர் | ஸ்லித்தர் பயிற்சி 2 (புதிய தாவலில் திறக்கப்படும்), எக்கிட்னா பயிற்சி 2 (புதிய தாவலில் திறக்கப்படும்) |
| எண்கணித செயல்பாடுகள் | மேண்டிகோர், எக்கிட்னா | எக்கிட்னா பயிற்சி 1 (புதிய தாவலில் திறக்கப்படும்), மேண்டிகோர் பயிற்சிகள் 1 - 3 (புதிய தாவலில் திறக்கப்படும்) |
| மரபுரிமைச் சரிபார்ப்பு | ஸ்லித்தர் | ஸ்லித்தர் பயிற்சி 1 (புதிய தாவலில் திறக்கப்படும்) |
| வெளிப்புறத் தொடர்புகள் | மேண்டிகோர், எக்கிட்னா | |
| தரநிலை இணக்கம் | ஸ்லித்தர், எக்கிட்னா, மேண்டிகோர் | slither-erc (புதிய தாவலில் திறக்கப்படும்) |
உங்கள் இலக்குகளைப் பொறுத்து மற்ற பகுதிகளையும் சரிபார்க்க வேண்டியிருக்கும், ஆனால் இந்தப் பரந்த அளவிலான கவனப் பகுதிகள் எந்தவொரு திறன் ஒப்பந்த அமைப்பிற்கும் ஒரு நல்ல தொடக்கமாகும்.
எங்களின் பொதுத் தணிக்கைகளில் சரிபார்க்கப்பட்ட அல்லது சோதிக்கப்பட்ட பண்புகளின் எடுத்துக்காட்டுகள் உள்ளன. நிஜ உலகப் பாதுகாப்புப் பண்புகளை மதிப்பாய்வு செய்ய, பின்வரும் அறிக்கைகளின் Automated Testing and Verification பிரிவுகளைப் படிப்பதைக் கருத்தில் கொள்ளவும்: