SHA-3 ալգորիթմի հիմնական ներդրմամբ գրադարանում խոցելիություն

Խոցելիություն (CVE-3-2022) հայտնաբերվել է XKCP փաթեթում (eXtended Keccak Code Package) առաջարկվող SHA-37454 (Keccak) ծածկագրային հեշ ֆունկցիայի ներդրման ժամանակ, որը կարող է հանգեցնել որոշակի տվյալների մշակման ժամանակ բուֆերի արտահոսքի: Խնդիրն առաջանում է SHA-3-ի կոնկրետ ներդրման կոդի սխալի պատճառով, այլ ոչ թե բուն ալգորիթմի խոցելիության պատճառով: XKCP փաթեթը ներկայացվում է որպես SHA-3-ի պաշտոնական իրականացում, որը մշակվել է Keccak մշակողների թիմի ներդրմամբ և օգտագործվում է որպես SHA-3 ֆունկցիաների հիմք տարբեր ծրագրավորման լեզուներում (օրինակ՝ XKCP կոդը օգտագործվում է Python հեշլիբում։ մոդուլ, Ruby digest փաթեթի sha3 և PHP hash_* գործառույթները):

Խնդիրը բացահայտած հետազոտողի խոսքով, նա կարողացել է օգտագործել խոցելիությունը՝ խախտելու հեշ ֆունկցիայի գաղտնագրային հատկությունները և գտնել առաջին և երկրորդ նախնական պատկերները, ինչպես նաև հայտնաբերել բախումներ: Բացի այդ, հայտարարվեց, որ կստեղծվի նախատիպի էքսփլեյտ, որը թույլ կտա գործարկել կոդը հատուկ մշակված ֆայլի հեշը հաշվարկելիս։ Խոցելիությունը կարող է օգտագործվել նաև թվային ստորագրության ստուգման ալգորիթմների վրա հարձակվելու համար, որոնք օգտագործում են SHA-3 (օրինակ՝ Ed448): Հարձակման մեթոդների մանրամասները նախատեսվում է հրապարակել ավելի ուշ՝ ամենուր խոցելիությունը վերացնելուց հետո։

Դեռ պարզ չէ, թե գործնականում որքանով է խոցելիությունը ազդում առկա հավելվածների վրա, քանի որ որպեսզի խնդիրը դրսևորվի կոդի մեջ, պետք է օգտագործվեն ցիկլային հեշ հաշվարկները բլոկներում, և մշակված բլոկներից մեկը պետք է լինի մոտ 4 ԳԲ չափս (առնվազն 2^32 - 200 բայթ): Մուտքային տվյալները միանգամից մշակելիս (առանց հեշը մաս-մաս հաջորդաբար հաշվարկելու), խնդիրը չի առաջանում։ Որպես պաշտպանության ամենապարզ մեթոդ, առաջարկվում է սահմանափակել տվյալների առավելագույն չափը, որը ներգրավված է հեշի հաշվարկի մեկ կրկնության մեջ:

Խոցելիությունը առաջանում է մուտքային տվյալների բլոկի մշակման սխալի պատճառով: «int» տիպի հետ արժեքների սխալ համեմատության պատճառով որոշվում է սպասող տվյալների սխալ չափը, ինչը հանգեցնում է նրան, որ պոչը գրվում է հատկացված բուֆերից այն կողմ: Մասնավորապես, համեմատության մեջ օգտագործվել է «partialBlock + instance->byteIOIndex» արտահայտությունը, որը հանգեցրել է բաղկացուցիչ մասերի մեծ արժեքների ամբողջ թվերի արտահոսքի: Բացի այդ, կոդի մեջ կար «(unsigned int)(dataByteLen - i)» սխալ տեսակ, որը 64-բիթանոց size_t տիպով համակարգերում առաջացրել է արտահոսք:

Օրինակ կոդ, որն առաջացնում է արտահոսք. ներմուծել hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Source: opennet.ru

Добавить комментарий