2013年2月にリリースしました「アップデートモジュール 20130215」を適用している AddPoint/MailWallServer V7.2、V7.2 for VMware、V7.3 にて、
メールのフィルタリング処理時にメール配送が停止してしまう場合があるという不具合につきまして、
詳細が確認できましたのでご案内いたします。
ご迷惑をお掛けしまして誠に申し訳ございませんが、ご査収のほどよろしくお願いいたします。
1 対象製品とバージョン
本件は、以下の製品・バージョンを対象としています。
製品名 |
バージョン |
AddPoint/MailWallServer |
V7.2 |
V7.2 for VMware |
V7.3 |
2 問題の概要
特定の文字列を含むメールを AddPoint/MailWallServer でキーワード検査したとき、
AddPoint/MailWallServer のメール送受信プロセスが異常終了します。
※上記に該当しない他のメールについては、正常に処理されます。
前段の MTA としては AddPoint/MailWallServer へのメール送信途中にネットワークが強制切断された形となり、
前段 MTA の再送キューに当該メールが滞留します。
滞留したメールは前段 MTA の再送設定に従って AddPoint/MailWallServer へ再送されますが、再送のたびに送信失敗するため、
最終的に前段 MTA が送信者にエラーとして返送します。
キーワード検査を行っている場合は、内部からの送信メール、外部からの受信メールいずれの場合も問題が発生する可能性がございます。
キーワード検査を行わずにアーカイブのみを行っている場合には問題が発生しません。
なお、Gmail で送信されたメールのヘッダーには特定の文字列が含まれていることが多く、発生確率が高いと考えられます。
3 問題が発生する流れ
AddPoint/MailWallServer に搭載されている GUARDIANWALL 内部で実施しているキーワード検査の正常な動作では、以下の流れになっています。
- 検査対象メールの、メールヘッダー、メール本文、添付ファイルからテキストデータを抽出する。
- 抽出されたテキストデータを 32KB ずつバッファに取り込み、ルールで設定されたキーワードが含まれているかの処理を行う。
- 全てのテキストデータを処理するまでこれを繰り返す。
上記 2. の処理内部では、あるプログラムループの中でテンポラリメモリを確保して処理を行い、
メモリを解放してからループを抜けて次の処理に進むようになっています。(正常時のメール処理フローです)
本件では、特定の文字列を処理することにより、メモリを解放した後、正常にループを抜けずに意図しない次の処理へ進んでしまい、
その結果、解放したはずのテンポラリメモリにアクセスしてしまうという現象が起こります。その結果プロセスが異常終了します。
(不具合発生時のメール処理フローです)
なお、メールのセッションごとに子プロセスを生成して処理を実行しているため、
該当のメールのみが受信できない状態になりますが、他のメールについては正常に処理されます。
4 不具合の詳細
本事象の原因は、キーワード検査ライブラリにおける以下の 2 つの不具合によるものです。
-
不具合(1):
解放済みメモリへのアクセスによるメール送受信プロセスが異常終了する。
これにより、メールが送信できない問題が発生します。
「アップデートモジュール 20130212」内のバグのため、それ以前のパッチではこの問題は発生しません。
-
不具合(2):
UTF-7→UCS 変換処理でバッファ末尾が無視されることがある。
以前から内在していたバグですが、この不具合のみではメール送信や検査動作に問題は発生しません。
これは、UCS 変換を試みた結果データが削られるような場合は、変換前のデータで検査処理を行うためです。
しかしながらこの不具合(2)によってヘッダーの末尾の改行が消えてしまうことで、
不具合(1) のケースA(後述)が発生しやすくなります。
不具合(1)、(2) の発生条件は以下の通りです。
ここで、検査対象文字列とは、メールヘッダー、メール本文、および添付ファイルから抽出されたテキストデータを指します。
- 不具合(1)の発生条件
以下のような文字列のいずれかが検査対象文字列に含まれるとき、プロセスが異常終了する。
A) 半角 + の後に BASE64 許可文字が 2 文字以上連続し、その直後に検査対象文字列の末尾に到達するケース。
(例) +0123/abc[文字列末尾]
B) 半角 + の後に BASE64 許可文字が 2 文字以上連続し、その直後に内部バッファ末尾に到達するケース。
(例) +0123/abc[内部バッファ末尾]
C) 半角 + の後に BASE64 許可文字が 2 文字以上連続し、その直後に 0x80 以上のバイトを含む文字が続くケース。
(例) +0123/abcあいう (‘あ’はシフト JIS で 0x82A0)
- 不具合(2)の発生条件
以下のような文字列が検査対象文字列に含まれるとき、末尾の 1 バイトが検査対象から除外される。
・半角の + の後に BASE64 許可文字が 1 文字だけ続き、その直後に BASE64 許可文字以外の文字が続く。
(例) +A=
(例) +0[改行文字]
※BASE64 許可文字とは、A~Z、a~z、0~9、+、/ のいずれかの文字です。
※文字列末尾とは、ヘッダーや本文の末尾、添付ファイルの抽出テキストの末尾です(行末ではありません)。
※内部バッファとは、内部処理で使用している 32KB のメモリ領域です。検査対象文字列のサイズが 32KB を超えるときは 32KB ごとに区切って検査します。
なお、Google Apps for Business アカウントから AddPoint/MailWallServer へ直接メールを送信するような場合に、
該当メールに付与されるメールヘッダーで上記不具合(1)(2)の発生条件に該当する可能性が高いことを確認しております。
5 今後の対応について
本事象は「アップデートモジュール 20130215」の適用により発生します。
大変恐れ入りますが、本パッチを適用しているお客様につきましては、
パッチの切り戻し方法をご案内いたしますので、
誠にお手数ではございますが、
「技術的なお問い合わせ(調査依頼)」
またはお客様ご契約のサポート窓口よりご連絡いただきますようお願いいたします。
[2013年5月31日 追記]
恒久対策として、本不具合の修正版を含むパッチをリリースいたしました。
下記コンテンツよりパッチをダウンロードしていただくことが可能です。