ctypes で未検証の小数を処理する場合の Python の脆弱性

Python プログラミング言語 3.7.10 および 3.6.13 の修正リリースが利用可能になり、ctypes メカニズムを使用して C 関数を呼び出すハンドラーで未検証の浮動小数点数を処理するときにコードの実行につながる可能性がある脆弱性 (CVE-2021-3177) が修正されています。 。 この問題は Python 3.8 および 3.9 ブランチにも影響しますが、それらの更新はまだリリース候補ステータスです (リリースは 1 月 XNUMX 日に予定されています)。

この問題は、sprintf の安全でない使用によって発生する ctypes 関数 PyCArg_repr() のバッファ オーバーフローによって発生します。 特に、変換の結果を処理するための 'sprintf(buffer, " ", self->tag, self->value.b)' は 256 バイトの静的バッファ ("charbuffer[256]") を割り当てましたが、結果はこの値を超える可能性がありました。 脆弱性に対するアプリケーションの脆弱性を確認するには、値「1e300」を渡してみます。これは、c_double.from_param メソッドによって処理されると、クラッシュにつながります。これは、結果として得られる数値には 308 文字が含まれており、テキストに収まらないためです。 256バイトのバッファ。 問題のあるコードの例: import ctypes; x = ctypes.c_double.from_param(1e300); 再現性(x)

この問題は Debian、Ubuntu、FreeBSD では未修正のままですが、Arch Linux、Fedora、SUSE ではすでに修正されています。 RHEL では、文字列関数でのバッファ オーバーフローをブロックする FORTIFY_SOURCE モードでのパッケージ アセンブリによってこの脆弱性は発生しません。

出所: オープンネット.ru

コメントを追加します