いろいろ
Seize the day.
2005-11-27 [長年日記]
■ [comp] OE の MIME メールデコードの謎
前回のエントリ [2005-11-26] の続きです.今日も忙しいので現実逃避モード(激ぉ.えー,大変申し訳ありません.前回のエントリは完全にピント外れでした.失礼しました _| ̄|○
今回調べているうちに,まったく別のある仮説に行き当たりました.時間のない方は下のほうの「仮説」だけお読み下さい.
要は「OE が悪いんじゃね?」という仮説です(ぉ
追記 (2005-11-28): 大変申し訳ありません.OE は悪くありませんでした orz.偏見に基づいた結論を出してしまいすみませんでした(激ぉ.詳しくは [2005-11-28] を.
実験環境
Windows XP に Excel 2000,あるいは Excel 2003 です.Outlook Express は 6.0.出て来るエラーは
'hoge.xls' にアクセスできません.ファイルは読み取り専用であるか,または読み取り専用の場所にアクセスしようとしています.または,サーバー上に保存されているドキュメントから応答がありません.で,キャンセルを押すと Excel 2000 は何も出ない.Excel 2003 は
'hoge.xls' にエラーが検出されましたが,Microsoft Excel は次の修復を行うことによってファイルを開くことができました.修復を保持するにはこのファイルを保存してください.となって,書式情報等の一切失われたデータが表示されます (それでも書いてあることの大半は理解できるもんです).
ファイルへのダメージが深刻であり修復は不可能です.Microsoft Excel は数式と値の修復を試みましたが,消失または破損したデータが含まれる可能性があります.
boundary の文字列とは関係ない
確かに boundary を書き換えると Excel で開けるようになって,これは複数のメールで確認してたんですが,実はうっかりファイル末尾の boundary を書き換えるのを忘れていたんですね (疲れていたということにさせて下さい…).ファイル末尾の boundary は行末に余計に "--" がつくので,マッチさせ忘れてたのでした.というわけで,
Header (modified boundary is defined here) --modified boundary Body Text --modified boundary base64-encoded Excel File (readable from OE) --original boundary (not regarded as a valid boundary)みたいな状態になってたわけです.ここで末尾の boundary まで書き換えてしまうと Excel ファイルが開かなくなるので,boundary の文字列云々の影響ではないことがわかります.
Excel ファイル末尾の boundary「付近」があやしい
調べているうちに,複数の添付ファイルがある場合,Excel ファイルの終端にある boundary を直さずにおくとやはり開けるようになることが判明.ただしこの場合は,その次に添付されているファイルは見えなくなります.Header (modified boundary is defined here) --modified boundary Body Text --modified boundary .. --modified boundary base64-encoded Excel File (readable from OE) --original boundary (not regarded as a valid boundary) Another Attachment (invisible from OE) --modified boundary .. --modified boundaryうーむ.boundary があるべき部分に関係ない余計な文字列が来ちゃってることになるのに,なんで Excel は添付ファイルを開けるんだ??
余計な文字列を加えてみると
余計な文字列が必要なんだろうか? と思って,boundary には手を加えず,boundary とデータの間に文字列を加えてみたら…HwAAAAAQAAAAAAAA hoge --------------080406090906080908050602開きました.な,なんだってー ΩΩ Ω
改行だけでも OK.
HwAAAAAQAAAAAAAA --------------080406090906080908050602あるいはもう base64 コードの末尾に何か足しただけでも,開くことができてしまった.なんかこう節操がないというか…
HwAAAAAQAAAAAAAA* --------------080406090906080908050602
空行が必要なのか?
ここでふと,他の MUA (例えば Mew) が送った MIME メールをみてみると,base64 データ末尾と boundary の間に空行がある.試しにこの空行を削除してみると…Excel ファイル,開けなくなりました.
ちなみに Mozilla/5.0 以外の MUA はたいてい空行を入れるようです.さらに mewdecode や uudeviwe を使って調べているうちに…うーむ,なんとなくわかってきたかもしれない.つまり,えーと,こんな感じです.
いろんな boundary (正規表現) に対して正しく base64 デコードできるかを調べたもの.OK は Excel ファイルが開けたこと,NG は開けなかったことを表す.また \n は CRLF を表す.
| (A) \n\n-- (普通の MUA) | (B) \n-- (Mozilla/5.0) | (C) .*\n-- (invalid) | (D) \n.?\n-- (invalid) | |
| OE | OK | NG | OK | OK |
| mewdecode | OK | OK | OK /w warning | OK /w warning |
| uudeview | OK | OK | NG | OK |
空行がないとダメなのは OE だけですね.
空行がないのは間違ってない
さらに RFC 2046 にこんな文面がありました.- http://www.ietf.org/rfc/rfc2046.txt
- http://www.y-adagio.com/public/standards/tr_mime-p2_2046/mime2046anxa.htm
The boundary delimiter MUST occur at the beginning of a line, i.e., following a CRLF, and the initial CRLF is considered to be attached to the boundary delimiter line rather than part of the preceding part.
NOTE: The CRLF preceding the boundary delimiter line is conceptually attached to the boundary so that it is possible to have a part that does not end with a CRLF (line break). Body parts that must be considered to end with line breaks, therefore, must have two CRLFs preceding the boundary delimiter line, the first of which is part of the preceding body part, and the second of which is part of the encapsulation boundary.つまり,boundary delimiter は "\n--" であって,添付データ末尾に CRLF がなければ当然空行はつかない.その意味では Mozilla/5.0 は RFC 2046 には違反していない.ということになります.
ということは…もしかして OE は「改行がある」と思い込んで処理してしまってる?? 例えば,そうだな,boundary の前の文字を改行と思って取り除いちゃってるとか??
もしかして chop されてますか?
1 文字取り除くと何が起こるか? base64 デコーダは 4 文字を 1 セットとして 3 バイトのデータに直すから,エンコードデータの末尾が 1 文字欠けるだけで,元データの 3 バイトに影響が出る.OE はこれをどう処理してるのか?というわけで確かめてみます.Mew から保存した Excel 添付ファイルと OE から保存したものとを hexdump にかけて,末尾をみてみよう.
% hexdump -C frommew.XLS | tail -2 000053f0 00 00 00 00 1f 00 00 00 00 10 00 00 00 00 00 00 |................| 00005400 % hexdump -C fromoe.XLS | tail -2 000053f0 00 00 00 00 1f 00 00 00 00 10 00 00 00 |.............| 000053fdはい,3 バイト消えてますね.
ちなみに uudeview や mewdecode で取り出したファイルの場合,3 バイトは消えてません (0 詰めされてます).えらいえらい.Perl の MIME:Base64 なんかもデコード時にちゃんと "=" をパディングしてくれるので,データが増えることはあっても消えることはない.OE もこの方式を取ればいいんじゃないかなあ.と思うのだけど.
The decoded result will anyway be as if the padding was there.
というわけでそろそろあたりがついてきたぞ.
chop されてもファイルは開けるのか?
じゃあ Word はどうして大丈夫なんでしょうか.末尾が chop されても生きてるんでしょうかね?そこで,base64-encode されたファイルから無理矢理 1 文字切り取ってみる実験.
- Excel ファイル末尾を切り取ると開けなくなる (メール添付の時と同じ症状が出る).
- Word,PDF,BMP,その他多くのファイルフォーマットは,末尾を切り取っても開ける.
- Mozilla/5.0 で Excel 添付でも開けるという例外的な事例が 2 件ほどあったんだけど,これらの Excel ファイルに関しては,末尾を切り取っても開くことができた.
仮説
というわけで仮説です.あくまで仮説です.検証はしてません.- Mozilla/5.0 は添付データと boundary の間に空行を入れない.これは RFC 的には間違ってない.
- 仮説: OE の MIME 解析ルーチンは boundary の直前の文字を chop してしまうのではないか??
- 普通の MUA が送って来たメールなら,CRLF が chop されるだけなので影響はない.
- Mozilla/5.0 が送ったメールの場合,OE で読むとデータ末尾が chop されて消える.
- OE の base64 デコーダは "=" をパディングしたりせずにデータを切り上げるので,デコードされたデータは末尾 3 バイトが消えたことになる.
- Excel 以外の多くのフォーマットでは,末尾 3 バイトが置き換わったところで開けなくなることはめったにない.
- Excel の場合,末尾 3 バイトが消えると開けなくなることが多い.そういうファイルが添付されていた場合,OE が chop してしまって開けなくなる.
- 余計な文字列を加えたら開けるようになる.これは加わった文字列が chop されただけでデータが無事だったから.
補足事項
ひとつ残ったのが,試しに,同じメールを Outlook Express で直接 pop で受信してみると,何の問題もなく開ける.という問題.この検証のためだけに OE をセットアップする気はしなかったので,真相は不明.POP の時点で 0 がパディングされたりするんだろーか.
ちなみに「F-Secure アンチウィルス Linux ゲートウェイ」の ChangeLog に
- SMTP/POPサービスで、base64エンコードの1行が4の倍数でない場合や行中に スペースを含む場合に、Outlook等と同じ方法で展開できるように変更。 これにより、一部のMydoomを検出できない問題に対応。とありました.これが具体的に何を指していて,Outlook にどう実装されてるのか,OE にもあるのかは不明ですが,もし POP 部分に組み込まれたものなら,上の問題の説明がつくのかも知れない. 追記 (2005-11-28): 上にも書きましたが,POP で正常に受信できる問題は説明つきました.詳しくは [2005-11-28] を.
■ [space][comp] つながったはやぶさミッションと The Yakumo Project
以前のエントリで紹介した [2005-11-20] The Yakumo Project とはやぶさミッションだけど,なんと既にこの二つのプロジェクトはリンクしていたのだ.松浦さんの blog をすごいスピードで逐一翻訳されていた Rogue Engineer 氏,実は The Yakumo Project を提唱した福盛さんその人だったのだ.気づかなかったよ〜.気づいたのは 26 日.前回の記事を書いた時は,二つの動きのその同時発生性が印象深かったのだけど,まさかつながっていたとは….最良の形で両者を結びつけ,The Yakumo Project の feasibility と usefulness を確実に実証した福盛さんの先見の明と行動力には,心から敬意を表したい.そういえば tDiary まわりでよくみかける zunda さんもおられた.びっくり.
私も触発されてごにょごにょと何かやってみたりしましたが,恥ずかしい結果に終わってしまったのでとりあえず内緒(ぉ.この問題については書きたいこともたくさんあるけど,取り急ぎエントリー.ともかくはやぶさ成功おめ.
[ ツッコミ | permalink | trackback ]
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20051127]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
本日のリンク元
その他のリンク元
検索
- ファイルへのダメージが深刻であり修復は不可能です ×18 / ファイルへのダメージが深刻であり修復は不可能です。 ×8 / MIME .xls ×7 / perl エンコード 末尾 ×5 / base64 デコーダ ×4 / ファイルへのダメージが深刻であり ×4 / EXCEL修復不可能 ×4 / excel ファイルへのダメージが深刻であり修復は不可能です ×4 / メール添付 にアクセスできません。ファイルは読み取り専用であるか、 ×4 / mewdecode ×4 / ファイルは読み取り専用であるか、または ×3 / キーワード不明 ×2 / OutlookExpress 添付ファイル 末尾 改行 消える ×2 / PDFファイル 破損 メール添付 ×2 / base64 decode excel ×2 / .doc 添付ファイル base64 デコード ×2 / RFC boundary ×2 / pdf 添付 デコード ファイル 破損 ×2 / OE デコード ×2 / エクセル デコーダ ×2 / ファイルへのダメージが深刻であり 修復は不可能です ×2 / MIME デコーダ メール ×2 / メール 添付 base64 デコード ×2 / MIME デコーダ ×2 / 添付ファイル base64 デコード perl ×2 / base64 消える ×2 / mew 添付 outlook ×1 / outlook 11 添付 エンコード ×1 / excel メール添付 サーバー上に保存されているドキュメントから応答がありません ×1 / MIME base64 RFC boundary ×1 / outlook express 添付データ破損 ×1 / boundary Base64 ×1 / MIME base64 改行 メール ×1 / boundary RFC ×1 / mime boundary 値 ×1 / BASE64 デコード PDF ×1 / BASE64 スペース パディング ×1 / エクセル2002 ファイルへのダメージが深刻であり修復は不可能です ×1 / outlookexpress base64 デコード ×1 / perl mime base64 添付ファイル 保存 ×1 / OE6 エンコード ×1 / samba アクセスできません 読み取り専用 場所にアクセス ×1 / perl MIME メール添付 ×1 / base64 ファイル デコード boundary ×1 / perl ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。サーバー上に保存されているドキュメントから応答がありません。 ×1 / outlook crlf ×1 / Outlook boundary 解析 ×1 / boundary MIME RFC ×1 / ruby メール base64 ×1 / メール PDF デコード ×1 / アクセスできません。 ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。 または、サーバー上に保存されているドキュメントから応答がありません。 ×1 / ecxel サーバー ドキュメントから応答がありません ×1 / RFC2046 正規表現 ×1 / base64 = 消える ×1 / hexdump C フォーマット ×1 / base64 エクセル 添付 ×1 / outlook デコード base64 ×1 / OE 添付 エンコード ×1 / outlookexpress 添付 エンコード ×1 / outlook web access excelファイルを開く ×1 / base64 デコード doc ×1 / outlook 2002 添付 デコード ×1 / メール MIME デコード ×1 / MIMEデコーダ ×1 / POP3 MIMEデコード ×1 / excel 修復 ダメージ ×1 / サーバー上に保存されているドキュメントから応答がありません ×1 / SMTP base64 デコード ×1 / 添付ファイル Word デコード ×1 / base64 修復 ×1 / outlookexpress mime ×1 / Perl Email Project デコード ×1 / Excel2003 MIME ×1 / Boundary mimeデコード ×1 / エンコード Excel ×1 / base 64 添付ファイル perl 受信 ×1 / outlook 11 エンコード ×1 / outlook express ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。 ×1 / mime boundary 文字列 "<>" ×1 / Excel エラーが検出されましたが ×1 / OUtLookEXpress エンコード 消える ×1 / ファイルは読み取り専用であるか、または読み取り専用の ×1 / base64 添付ファイル デコード ×1 / 添付ファイル PDF デコード ×1 / mew 添付ファイル spam扱い outlook ×1 / OE base64 ×1 / MIME デコーダー ×1 / PDF メール添付 余計 ×1 / Base64 ! OE ×1 / boundary文字列 ×1 / outlookexpress 添付ファイル 消失 ×1 / base64 エンコード "/" 改行 excel ×1 / OutlookExpress デコード ×1 / outlook 余計 文字 挿入 ×1 / outlook 同じメール アンチウィルス 受信 ×1 / outlookexpress 複数の添付ファイル ×1 / メール 改行が 消 OE ×1 / OutlookExpress 添付ファイル 改行 ×1 / excel デコード base64 ×1 / デコード 添付ファイル エラー ×1
以下の広告はサーバによって自動的に挿入されています.
Copyright © 2004-2006, nao. All rights reserved.





