在抗量子密碼演算法競賽中獲勝的 Kyber 加密演算法的實作中發現了一個漏洞,該漏洞允許側通道攻擊根據測量攻擊者提供的密文解密過程中的操作時間來重建金鑰。此問題影響 CRYSTALS-Kyber KEM 金鑰封裝機制的參考實作以及許多支援 Kyber 的第三方加密函式庫,包括 Signal 信差中使用的 pqcrypto 函式庫。
此漏洞的代號為 KyberSlash,其本質在於使用除法運算「t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;」。在解密訊息的過程中,其中被除數包含“double”類型的秘密值“t”,除數是眾所周知的公開值KYBER_Q。問題在於除法運算的時間不是恆定的,並且在不同的環境中執行除法的 CPU 週期數取決於輸入資料。因此,根據操作時間的變化,可以了解除法中所使用的資料的性質。
著名密碼學專家 Daniel J. Bernstein 成功地對該攻擊的概念證明進行了實際演示。在進行的三個實驗中的兩個實驗中,當在 Raspberry Pi 2 板上運行程式碼時,可以根據資料解碼時間測量完全重新建立 Kyber-512 私鑰。此方法也可適用於 Kyber-768 和 Kyber-1024 金鑰。為了使攻擊成功,必須使用相同的金鑰對處理攻擊者提供的密文,並且可以準確測量操作的執行時間。
在一些庫中發現了另一個洩漏(KyberSlash2),這也是由於在執行除法時使用秘密值而發生的。與第一個選項的差異在於加密階段的呼叫(在 poly_compress 和 polyvec_compress 函數中),而不是解密期間的呼叫。然而,第二種選擇僅在該過程用於重新加密操作的情況下才可能對攻擊有用,其中加密文字的輸出被視為機密。
該漏洞已在以下庫中修復:
- zig/lib/std/crypto/kyber_d00.zig(22 月 XNUMX 日),
- pq-crystals/kyber/ref(30 月 XNUMX 日),
- symbolicsoft/kyber-k2so(19月XNUMX日)
- cloudflare/circl(8月XNUMX日)
- aws/aws-lc/crypto/kyber(4 月 XNUMX 日)
- liboqs/src/kem/kyber(8 月 XNUMX 日)。
最初不易受攻擊的函式庫:
- boringssl/crypto/kyber,
- filippo.io/mlkem768,
- formosa-crypto/libjade/tree/main/src/crypto_kem,
- Kyber/common/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-水晶/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
以下庫中的漏洞仍未修補:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber*(20 月 1 日僅修復了 XNUMX 個漏洞變體),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan(20 月 1 日僅修復了 XNUMX 個漏洞變體),
- rustpq/pqcrypto/pqcrypto-kyber(5 月 XNUMX 日,修復已新增至 libsignal,但 pqcrypto-kyber 本身的漏洞尚未修復)。
來源: opennet.ru
