細工されたJPEG画像がPHPのメモリ欠陥の悪用を可能にする可能性

PHPの画像処理機能に潜むメモリ安全性バグのペアであるCVE-2025-14177と、iptcembedの未パッチ型ヒープオーバーフローは、攻撃者が細工されたJPEGファイルだけを使用してサーバメモリの機密情報を漏洩させたり、PHPアプリケーションをクラッシュさせたりすることを可能にします。

PHPはインターネットの膨大な部分を支えています。しかし、そのコアC拡張機能であるext/standardは、フレームワークのようにはめったに精査されていません。このブラインドスポットが危険であることが判明しました:Positive Technologiesの研究者であるNikita Sveshnikovは、拡張機能のCコードを監査中に、標準的なJPEG画像処理機能を通じてトリガーされる2つのメモリ管理バグを発見しました。

これらは、画像の寸法を読むこともメタデータを埋め込むこともといった最も日常的なタスクでさえ、攻撃ベクトルになり得ることを示しています。

最初の欠陥はCVSS スコア6.3(中程度)でCVE-2025-14177が割り当てられており、getimagesize()関数に存在します。PHPがEXIFまたはXMPデータを保存するAPP1などの大きなAPPセグメントを含むJPEGファイルを読むとき、内部ヘルパーであるphp_read_stream_all_chunks()はデータをチャンク単位で読みますが、重大なポインタエラーを含んでいます。

各読み取り後、バッファポインタは進められません。つまり、2番目のチャンクがバッファの開始を上書きし、末尾のバイトは書き込まれず、初期化されていないヒープメモリが残されます。

アプリケーションが$info[‘APP1’]を呼び出し元に返すとき、これらのガベージヒープバイトが一緒に付属してきます。デフォルトのチャンクサイズ(8,192バイト)を知っている攻撃者は、マルチチャンク読み取りを意図的にトリガーするようにJPEGを細工して、プロセスメモリのフラグメントを収集し、ヒープの他の場所に保存されているトークン、認証情報、またはその他の機密データを公開する可能性があります。

この脆弱性はPHP 8.1.x(8.1.34未満)、8.2.x(8.2.30未満)、8.3.x(8.3.29未満)、8.4.x(8.4.16未満)、8.5.x(8.5.1未満)に影響します。

2番目のバグはiptcembed()関数に影響を与えます。この関数はIPTCメタデータをJPEGファイルに埋め込みます。関数はfstat()が報告したファイルサイズ(st_size)に基づいて出力バッファを事前割り当てしてから、バッファが満杯かどうかを確認することなくEOFまでストリームから読み取ります。

FIFOまたは名前付きパイプなどの特殊ファイルの場合、st_sizeは0を返し、バッファがほぼゼロのサイズで割り当てられていることを示します。同時に、データストリームは任意に大きくすることができます。

これはTOCTOU(Time-of-Check to Time-of-Use)欠陥の典型的な例です。通常のファイルでも、fstat()呼び出しと実際の読み取りの間にレース窓が存在します。その窓内でファイルが大きくなると、オーバーフローはまだトリガーされます。

脆弱な書き込みはphp_iptc_get1()でバイト単位で発生します。各文字がバウンド検証なしでバッファポインタに追加されます。AddressSanitizerスタックトレースが確認した1,087バイト割り当て領域を超える書き込みです。

両方のバグは2025年11月にPHPチームに責任を持って開示され、研究が公開される前に修正されました。getimagesizeの修正は簡単です:バッファポインタは各チャンク読み取り後にread_nowで進むようになり、順序正しい書き込みを保証します。

iptcembedの場合、spoolbuf_endバウンドパラメータがphp_iptc_get1()とそのコールチェーンに追加されました。バッファが満杯の場合、関数は範囲外書き込みの代わりにEOFを返します。

特にgetimagesize()を$image_infoパラメータで呼び出すか、信頼できないファイルでiptcembed()を使用する、ユーザー提供の画像を処理するPHPアプリケーションを実行しているユーザーは、上記のリストされたパッチされたバージョンにすぐにアップグレードすべきです。

一時的な対策として、パッチが完了するまで信頼できないJPEGファイルをphp://filterストリームまたはFIFOバックアップパス経由で渡すことを避けてください。

翻訳元: https://cyberpress.org/weaponized-jpeg-images-exploitation-of-php-memory-flaws/

ソース: cyberpress.org