Կոդի նորից օգտագործումը ընդդեմ պատահական ընդհանրության

Վերջերս Bitcoin Core ծրագրակազմում վերջերս հայտնաբերվեց ամենաանհեթեթ, կոնսենսուսային քննադատական ​​սխալներից մեկը (CVE-2018–17144), որը մինչ այդ կային գրեթե անմաքուր պատմություն: Myիմի Սոնգը գրել է այս սխալի հիանալի խափանում:

Սխալների կարճ հակիրճն այն է, որ կա 4 դեպք, երբ Bitcoin Core ծրագրակազմը պետք է ստուգի կրկնակի ծախսերը: Բոլոր 4 դեպքերը սկզբում համօգտագործվել էին նույն կոդերի կատարման հոսքով: Մի քանի տարիների ընթացքում կոդի որոշ նուրբ կրկնումներից հետո, 4 դեպքերից մեկը («մեկ տեքս-կրկնակի ծախս-անցում-բլոկ») բաց թողեց, ինչը հնարավորություն կտա հանքափորին հավանական խաբել որոշ հանգույցների ՝ բլոկ ընդունելու համար: դա փչացնում է Bitcoin- ի մատակարարումը:

Այս սխալի բնույթը ինձ հիշեցնում է անընդհատ բախման միջև.

ա) ծածկագրերի վերաօգտագործման և օպտիմիզացման անհրաժեշտություն

(բ) պատահական ընդհանրության համար ընկնելու վտանգը. բաներ, որոնք նման են ոչ թե ձևավորմանը, այլ պատահականորեն

Դեպքի պատահականությունը բերրի հիմք է ստեղծում գիշերային մղձավանջները և հնարավոր սխալները վերականգնելու համար, ինչպիսին է CVE-2018–17144:

Պատահական ընդհանրություն

Ինչ-որ ֆոն, եթե դուք ծանոթ չեք ծրագրային ապահովման ինժեներիային.
 
Ծրագրակազմում կա ծրագրային ապահովման բաղադրիչների այս հիանալի տեսլականը, որը կատարյալ մոդուլային է, նման է իրենց ֆիզիկական ինժեներական գործընկերների: Կա մի լավ պատճառ, որ դուք ստիպված չեք լինում տարբեր տեսակի լիցքավորիչ կամ USB մետաղալարեր տեղափոխել ամենուրեք:

Այսպիսով, միշտ էլ ուժեղ ճնշում է գործադրվել կոդերի վերաօգտագործման համար: Ավելորդ կոդ գրելը հաճախ զայրացնում է: Ինչու՞ նույն գործը երկու անգամ, երբ մեկ անգամ էլ կարող ես դա անել:

Նաև կա ծրագրակազմում նորից ներդնելու երկար պատմություն, որը կոդերի օգտագործման հնարավորությունը նույնիսկ ավելի բարձր է տալիս առաջնահերթությունների ցանկում: Կոդի օգտագործումը հաճախ համարվում է արդյունաբերության «Լավագույն պրակտիկա» մեկը: Կրտսեր ծրագրավորող ցանկացող ծրագրավորողը կարող է հակված լինել մտածել, որ կոդի վերաօգտագործման համար զրոյական տեղաշարժ կա:

Բայց կա թաքնված վտանգ, և ես չեմ հավատում, որ այս նյութերը դպրոցներում երբևէ պատշաճ կերպով ուսուցանվում են `ծայրահեղ կոդերի նորից օգտագործման համար:

Ծայրահեղ ծածկագրերի նորից օգտագործումը նշանակում է ծածկագրի ցանկացած նմանատիպ երկու կտոր մեկի մեջ մեկ ՝ անկախ դրանց օգտագործման դեպքերից և բնօրինակ մտադրությունից:

Որը բազմիցս ավարտվում է պատահական ընդհանրություն ունեցող կոդով:

Կարող է ակնհայտ լինել, թե ինչու է պատահական ընդհանրությունը վատը, բայց միայն պետք է երկար ժամանակով պահպանել բավականաչափ մեծ ծրագրային նախագիծ ՝ հասկանալու համար, թե ինչու:

Դա վատ է, քանի որ արտադրանքի պահանջները փոխվում են, և ծրագրաշարը անընդհատ զարգացող, երբևէ պատրաստված արտադրանք չէ:

Այս անընդհատ շարժվող նպատակային խնդիրը ծրագրային ապահովման համար բավականին եզակի բան է: Եթե ​​դուք կառուցվածքային ինժեներ եք, ձեզանից չի սպասվում, որ տունը վերածեք 20 հարկանի բարձրահարկ, կամ մեքենան թռչող լվացքի: Այնուամենայնիվ, ծրագրային ապահովման մեջ մենք անընդհատ դա անում ենք:

Երբ արտադրանքի պահանջները և օգտագործման դեպքերը փոխվում են, հիմք այն ենթադրությունները, թե ծրագրային ապահովմանն ի սկզբանե գրվել են, այլևս չեն կարող կիրառվել:

Այսպիսով, այդ հպարտ ընդհանուր կտորը, որը դուք վերազինել եք (բայց այժմ ամբողջովին մոռացել եք), այլևս չի աշխատում այնպես, ինչպես կարծում եք:

Ես կորցրել եմ հաշիվը այն մասին, թե որքան շատ ցավոտ վերականգնող նախագծեր կամ տհաճ վրիպակներ եմ տեսել, որոնք վաղաժամ օպտիմիզացիայի կամ պատահական ընդհանրության ուղղակի արդյունք են, մինչև այն կետը, երբ այժմ ժանտախտի պես ժառանգում եմ ժառանգականության նման բաներից:

Պատահական ընդհանրություններ ունեցող բաները արագորեն կբացահայտեն իրենց տարբերությունները, երբ դրանք զարգանան իրենց սկզբնական վիճակից դուրս: Այդ դեպքում կոդերի ընդհանրության ցանկացած կոշտություն կլիներ ազատվելուց զանգվածային գոտի:

Որքան ավելի շատ պատահական ընդհանրության շերտեր կան կոդում, այնքան ավելի ականազերծող տարածք է նավարկումը: CVE-2018–17144- ը դրա կատարյալ օրինակն է: