Kerentanan dalam perpustakaan dengan pelaksanaan utama algoritma SHA-3

Kerentanan (CVE-3-2022) telah dikenal pasti dalam pelaksanaan fungsi cincang kriptografi SHA-37454 (Keccak) yang ditawarkan dalam pakej XKCP (Pakej Kod Keccak eXtended), yang boleh menyebabkan limpahan penimbal semasa memproses data tertentu. Masalahnya disebabkan oleh pepijat dalam kod pelaksanaan khusus SHA-3, dan bukan oleh kelemahan dalam algoritma itu sendiri. Pakej XKCP disebut-sebut sebagai pelaksanaan rasmi SHA-3, dibangunkan dengan input daripada pasukan pembangunan Keccak, dan digunakan sebagai asas untuk fungsi SHA-3 dalam pelbagai bahasa pengaturcaraan (cth., kod XKCP digunakan dalam hashlib Python modul, pakej Ruby digest sha3 dan PHP hash_* fungsi).

Menurut penyelidik yang mengenal pasti masalah itu, dia dapat menggunakan kelemahan untuk melanggar sifat kriptografi fungsi hash dan mencari praimej pertama dan kedua, serta mengesan perlanggaran. Di samping itu, telah diumumkan bahawa eksploitasi prototaip akan dibuat yang akan membolehkan kod dilaksanakan semasa mengira cincang fail yang direka khas. Kerentanan juga berpotensi digunakan untuk menyerang algoritma pengesahan tandatangan digital yang menggunakan SHA-3 (contohnya, Ed448). Butiran kaedah serangan dirancang untuk diterbitkan kemudian, selepas kelemahan telah dihapuskan di mana-mana.

Masih belum jelas sejauh mana kelemahan mempengaruhi aplikasi sedia ada dalam amalan, kerana untuk masalah itu nyata dalam kod, pengiraan cincang kitaran dalam blok mesti digunakan dan salah satu blok yang diproses mestilah berukuran kira-kira 4 GB (sekurang-kurangnya 2^32 - 200 bait). Apabila memproses data input sekaligus (tanpa mengira cincang secara berurutan dalam bahagian), masalah tidak muncul. Sebagai kaedah perlindungan yang paling mudah, adalah dicadangkan untuk mengehadkan saiz maksimum data yang terlibat dalam satu lelaran pengiraan cincang.

Kerentanan ini disebabkan oleh ralat dalam pemprosesan blok data input. Disebabkan perbandingan nilai yang salah dengan jenis "int", saiz data yang belum selesai yang salah ditentukan, yang menyebabkan ekor ditulis di luar penimbal yang diperuntukkan. Khususnya, perbandingan menggunakan ungkapan "partialBlock + instance->byteIOIndex", yang membawa kepada limpahan integer untuk nilai besar bahagian konstituen. Selain itu, terdapat jenis hantaran yang salah "(unsigned int)(dataByteLen - i)" dalam kod, yang menyebabkan limpahan pada sistem dengan jenis size_t 64-bit.

Contoh kod yang menyebabkan limpahan: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00β€³ * 4294967295; h.kemas kini(m1) h.kemas kini(m2) cetakan(h.hexdigest())

Sumber: opennet.ru

Tambah komen