【要約】HPACKの可変長整数デコードのDoS脆弱性(GHSA-8v8h-hg4w-mvq2) 解説 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
PythonのHTTP/2実装で、攻撃者が細工したヘッダーを送り、CPUを占有する問題が発生した。
- ・
python-hyper/hpackのデコード処理に、値とバイト数の上限チェックが欠如していた。 - ・Pythonの
intは任意精度整数であるため、オーバーフローせず巨大な数へと膨張する。 - ・巨大な整数に対する演算コストが $O(n^2)$ となり、計算量が爆発する。
- ・1リクエストで約1.5分のCPU時間を消費させることが可能であった。
// Approach
開発者は、デコード処理において読み取りバイト数に物理的な上限を設けることで、計算量の爆発を防止した。
- ・
hpackv4.2.0にて、VARINT_MAX_LENGTH = 5を導入した。 - ・デコード中のインデックスが5バイトを超えた時点で
HPACKDecodingErrorを送出する。 - ・HPACKの用途に対し、5バイト(約$2^{28}$)あれば十分な範囲をカバーできる。
// Result
hpack v4.2.0のリリースにより、計算量攻撃によるDoS脆弱性が解消された。- ・攻撃者が1MBの入力を用いてCPUを約1.5分間占有させる攻撃を無効化した。
- ・
h2に依存するASGI/WSGIサーバーや、httpxを利用するクライアント環境の安全性が向上した。 - ・ユーザーは
uv pip install --upgrade hpackにより迅速な対応が可能である。
Senior Engineer Insight
> 本件は「言語の特性」への理解不足が招いた典型的な脆弱性だ。CやGoのような固定幅整数を前提とした仕様を、Pythonのような任意精度整数の環境へ移植する際、型による暗黙の制約が消失する。設計者は、自言語の型が「どこまで膨張しうるか」を常に疑うべきだ。高トラフィック環境では、こうした計算量の微増が致命的なサービス停止に直結する。