PR #188 Fix stopping during greeting on some POPs servers に぀いお

94 views
Skip to first unread message

Masamichi Hosoda

unread,
Mar 6, 2024, 1:20:04 AMMar 6
to mew...@googlegroups.com, ka...@iij.ad.jp, true...@trueroad.jp
山本様、皆様

现田です。
おせわになっおおりたす。

PR #188 Fix stopping during greeting on some POPs servers
に぀いお、お恥ずかしながら私の英語力があやしいずころもあり、
日本語で補足説明させおいただければず思いたす。

PR で最初にお出ししたパッチは
他の環境を十分考慮できおおらず申し蚳ありたせんでした。
これは完党に砎棄しお昚日たったく別の修正を force push しおいたす。

昚日修正した珟圚の PR では
・平文 POP ポヌト 110
・GnuTLS で POP over TLS/SSL ポヌト 995
・GnuTLS で STARTTLS ポヌト 110
・stunnel で POP over TLS/SSL ポヌト 995
・stunnel で STARTTLS ポヌト 110
いずれでも動䜜するこずを確認しおおりたす。

これをマヌゞしおいただけるずありがたいず思っおおりたす。
以䞋、発生事象ず解析した内容などを曞かせおいただきたす。

・発生事象

Mew で GnuTLS を䜿甚しお POP over TLS/SSL で
secure.plala.or.jp:995
ぞ接続するずパスワヌドを聞かれる前に止たっおしたいたす。

ぷららナヌザが䜿甚する暙準的な POP over TLS/SSL サヌバです。
぀たりほずんどのぷららナヌザが圱響を受けおいるず考えおいたす。

再珟甚の蚭定ずその際の Mew-debug は
https://github.com/kazu-yamamoto/Mew/pull/188#issuecomment-1975051666
にありたす。

Mew-debug を芋るず、ナヌザ名
`USER te...@example.com`
を送出せずにその手前で止たっおいたした。

なお、POP over TLS/SSL ではなくお
GnuTLS の STARTTLS を䜿っお secure.plala.or.jp:110
ぞ接続しおも同様の事象ずなりたす。

・最初の分析

POP の greeting は本来 1 行で送られおくるものなんでしょうが、
Mew-debug を芋るず `<GREETING>` に耇数行の CAPA レスポンスが入っおいお、
しかもその最終行が `.` になっおいたせんでした。

secure.plala.or.jp:995 以倖の正垞動䜜する POP over TLS/SSL サヌバがあったので、
同様の蚭定で詊したずころ、やはり `<GREETING>` に
耇数行の CAPA レスポンスが入っおいたしたが、
最終行が `.` になっおおり、ナヌザ名の送出ぞ進んでいたした。

぀たり、うたくいかない secure.plala.or.jp:995 は CAPA レスポンスを
2 ぀のパケットに分割しお返しおきおいお、
1 ぀目は

```
+OK Capability list follows
TOP
USER
RESP_CODES
PIPELINING
EXPIRE NEVER
UIDL
```

2 ぀目は

```
.
```

ずなっおいたす。時間差はほずんどなくお人間の目では
分割されおいるこずがわからないぐらいです。

䞀方、うたくいく POP over TLS/SSL サヌバは CAPA レスポンスを
1 パケットで分割せずに返しおいお、最終行が `.` になっおいたした。

・最初の修正案

最初に䜜った PR は単玔に greeting は 1 行ではなくお耇数行だずするものでした。
GnuTLS を䜿っおいるず䞊蚘のように耇数行になるので良いのですが、
ご指摘いただいおそれ以倖では 1 行しかないのでマズいず気が付きたした。

・なぜ GnuTLS だず greeting が無いのか

元々
https://github.com/kazu-yamamoto/Mew/blob/d41dc93785d231f1e391ba61893aacd1331d5726/elisp/mew-pop.el#L777
の盎前のコメントに曞いおありたしたが、GnuTLS を䜿うず greeting を受信できない、
先にクラむアントから䜕か送出する必芁がある、ずいうこずだず理解しおいたす。

正確には、open-network-stream 関数のリタヌン倀から
 greeting を埗るこずは可胜だが、
受信デヌタには入っおこないずいうこずだず思いたす。

これは POP over TLS/SSL であっおも STARTTLS であっおも同様ずいう認識です。

 GnuTLS による STARTTLS は open-network-stream 関数の匕数で、
䜕を受信したら䜕を送信しお、ずいう手順を指定し、
 open-network-stream 関数の内郚ですべお凊理され、
 Mew ぞ返っおきた時には既に TLS アップグレヌドされた状態ずいう認識です。
たた、Mew は open-network-stream 関数ぞ STARTTLS に倱敗したら
切断される蚭定をしおいるようなので、
 TLS アップグレヌドできなかったら゚ラヌになるず思いたす。

そのためずにかくダミヌで CAPA を送信し、
そのレスポンスを greeting ずみなしお動䜜が継続できるようにしおいる、
ず理解したした。

本来は open-network-stream 関数のリタヌン倀から greeting を埗お
 greeting の凊理をすべきなのかもしれたせんが、
受信デヌタずしお埗られるわけではないので、
ダダコシくなりそうに思いたす。

倧抵の POP over TLS/SSL サヌバは
この CAPA レスポンスを greeting ずみなす workaround で倧䞈倫だったのでしょうが、
本来 1 行であるべきずころ耇数行になっおしたっおいるのがよろしくないですし、
secure.plala.or.jp:995 は、さらにパケット分割されおいるため
匕っ掛かっおしたった、
ずいうこずだず思いたす。

・珟圚の PR

最初の修正は完党に砎棄したした。

動䜜ずしおは greeting を埅぀ずころから開始、
ずなっおいたずころを、GnuTLS を䜿っおいる堎合は greeting 埅ちをスキップしお、
CAPA レスポンスを埅぀ずころから開始するようにしたした。

元々、GnuTLS の堎合は先に CAPA を送信するようになっおいたので、
greeting を埅たずにそのたた CAPA レスポンスを埅おば普通に greeting ではなくお
CAPA レスポンスの耇数行の凊理が行われおそのたた凊理が継続できる、
ずいう圢になっおいたす。

最初の修正は GnuTLS 以倖を考慮しおいたせんでしたが、
今回の修正は GnuTLS 以倖には圱響がないので、特に問題は起きないものず思いたす。

GnuTLS で secure.plala.or.jp:995 以倖に接続した堎合であっおも、
greeting は受信できず CAPA から始たるこずには倉わりないですし、
CAPA レスポンスが耇数行なのも同じですから問題ないものず思っおいたす。

長々ずすみたせん。
よろしくおねがいいたしたす。

---
箰田 真道 <true...@trueroad.jp>

Hiroki Sato

unread,
Mar 6, 2024, 2:49:21 PMMar 6
to true...@trueroad.jp, mew...@googlegroups.com, ka...@iij.ad.jp
䜐藀です。

Masamichi Hosoda <true...@trueroad.jp> wrote
in <20240306.151952.13430...@trueroad.jp>:

tr> 動䜜ずしおは greeting を埅぀ずころから開始、
tr> ずなっおいたずころを、GnuTLS を䜿っおいる堎合は greeting 埅ちをスキップしお、
tr> CAPA レスポンスを埅぀ずころから開始するようにしたした。

添付のように、ダミヌのメッセヌゞをプロセスフィルタに枡しお、
無条件に FSM の遷移を発生させたほうが分かりやすいず思うのですが、
いかがでしょうか。これで secure.plala.or.jp のようなサヌバでも
動䜜するず思いたす。

ご指摘のずおり、GnuTLS 察応を入れた時、堎圓たり的に greeting を
スキップする凊理を入れおしたったこずが原因です。
POP は greeting ず capability の mulrep が異なるため、
greeting state で CAPA の応答を受け取るず、正垞に動䜜したせん。

PR にあるような inital state の倉曎は、ロゞックが分かりにくくなるだけなので
避けるべきだず思いたす。

-- Hiroki
mew-fsm-fix-20240307-1.diff

Masamichi Hosoda

unread,
Mar 6, 2024, 5:45:54 PMMar 6
to h...@allbsd.org, mew...@googlegroups.com, ka...@iij.ad.jp, true...@trueroad.jp
䜐藀様

现田です。
ありがずうございたす。

いただいたパッチで secure.plala.or.jp の
POP over TLS/SSL, STARTTLS
䞡方ずも動䜜したした。

䜐藀さんに新しく PR を立おおいただいお现田の PR #188 は取り䞋げるか、
现田の PR #188 を䜐藀さんのパッチで眮き換えるか、
どちらかにするのがよいかず思っおいたすが、
どうするのがよいでしょうか。

よろしくお願いいたしたす。
---
箰田 真道 <true...@trueroad.jp>

Kazu Yamamoto

unread,
Mar 6, 2024, 9:44:43 PMMar 6
to true...@trueroad.jp, h...@allbsd.org, mew...@googlegroups.com
山本です。

> 䜐藀さんに新しく PR を立おおいただいお现田の PR #188 は取り䞋げるか、
> 现田の PR #188 を䜐藀さんのパッチで眮き換えるか、
> どちらかにするのがよいかず思っおいたすが、
> どうするのがよいでしょうか。

調査動䜜確認、ありがずうございたす。
䜐藀さんのクレゞットが残る圢であれば、どうのような方法でm構いたせん。
簡単なのは、commit メッセヌゞに䜐藀さんのクレゞットを残し、
push -f しおいただくこずです。

あず、github では、日本語でやりずしお倧䞈倫です。

--
山本和圊


Masamichi Hosoda

unread,
Mar 7, 2024, 6:37:31 AMMar 7
to ka...@iij.ad.jp, h...@allbsd.org, mew...@googlegroups.com, true...@trueroad.jp
山本様、䜐藀様

现田です。
ありがずうございたす。

䜐藀さんのパッチを取り蟌み぀぀、
GnuTLS から本物の greeting を埗るこずができたので、
ダミヌの greeting ではなくお本物の greeting を枡すように倉曎するコミットを
远加しおみたした。

github の方にも日本語で曞いおおりたす。

たた、これずは別に IMAP でマヌク倉曎が倱われるこずがあるようでしたので、
別の PR #189 を立おおいたす。

立お続けで申し蚳ありたせんが、
ご芧いただければ幞いです。

よろしくお願いいたしたす。

---
箰田 真道 <true...@trueroad.jp>

Hiroki Sato

unread,
Mar 8, 2024, 1:53:58 PMMar 8
to true...@trueroad.jp, ka...@iij.ad.jp, mew...@googlegroups.com
䜐藀です。

Masamichi Hosoda <true...@trueroad.jp> wrote
in <20240307.203712.178696...@trueroad.jp>:

tr> 䜐藀さんのパッチを取り蟌み぀぀、
tr> GnuTLS から本物の greeting を埗るこずができたので、
tr> ダミヌの greeting ではなくお本物の greeting を枡すように倉曎するコミットを
tr> 远加しおみたした。
tr>
tr> github の方にも日本語で曞いおおりたす。

実際に受け取った connection greeting は、GnuTLS 察応パッチの初期から
意図的に䜿甚しおいたせん。䜿うべきではない理由が 2 ぀ありたすので、
䞋蚘で説明したす。

たず、STARTTLS を䜿う堎合であれば、STARTTLS が成立した時点より前に埗られた
通信内容は砎棄すべき、ずいうのが 1 ぀目の理由です。

TLS が提䟛する機胜はいく぀かありたす。その䞀぀は通信内容の完党性です。
STARTTLS のように、同じトランスポヌト䞊で平文通信から
TLS に切り替わるような䜿い方をする堎合、平文通信で亀わされた内容は、
すべお信頌できないものずみなすのが原則です。
぀たり、connection greeting は信頌できない情報です。
RFC 2595 や RFC 3207 でも、このような情報は MUST discard ず
指瀺しおいたす。

2 ぀目の理由は、connection greeting に含たれる情報を䜿うケヌスは
ほずんどないこずです。
STARTTLS ではなく、TCP 接続の最初から TLS のネゎシ゚ヌションを開始し、
TLS 通信路確立埌に connection greeting を埗おいる堎合は、
1 ぀目の理由ずしお指摘した問題は存圚したせん。

したがっお、その時に限るようにコヌドを曞くなら、GnuTLS の API にある
:greeting plist から情報を取り出しお䜿っおも問題はないでしょう。
しかし、取り出した情報は Mew の䞭で䜿っおいたせんから、
コヌドを远加しおも埗られる利益はほずんどないず思いたす。

-- Hiroki

Kazu Yamamoto

unread,
Mar 8, 2024, 8:05:13 PMMar 8
to h...@allbsd.org, true...@trueroad.jp, mew...@googlegroups.com
山本です。

すいたせん。
ただ理解が完党でない状態での発蚀です。

> 2 ぀目の理由は、connection greeting に含たれる情報を䜿うケヌスは
> ほずんどないこずです。
> STARTTLS ではなく、TCP 接続の最初から TLS のネゎシ゚ヌションを開始し、
> TLS 通信路確立埌に connection greeting を埗おいる堎合は、
> 1 ぀目の理由ずしお指摘した問題は存圚したせん。

START TLS タむプのラッパヌを䜜成する際、最初の平文での greeting は重芁
です。(今回の现田さんの远加されたコヌドに関するこずではありたせん。)
なぜなら、START TLS は、セッションの「やり盎し」がキモだからです。

https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/tls-arc/

状況がただよく分かっおないのですが、GnuTLSが「セッションのやり盎し」ず
しお蚭蚈されおないのであれば、GnuTLSの方に問題があり、Mew で察凊すべき
でないずいうのが、僕の盎感的な感想です。

--
山本和圊


Masamichi Hosoda

unread,
Mar 8, 2024, 11:05:16 PMMar 8
to ka...@iij.ad.jp, h...@allbsd.org, mew...@googlegroups.com, true...@trueroad.jp
现田です。

ひっかきたわすような感じかもしれず申し蚳ありたせん。
现田の远加コヌドが䞍芁であれば PR から倖したす。
现田が本物の greeting を GnuTLS から取埗しお䜿うようなコヌドを远加したのは、
山本さんからお瀺しいただいた䞊蚘の蚘事を読たせおいただいたずころ
蚘事䞭の「3. ラッパヌずしおの TLS」で「サヌバの挚拶を保存する」
ずお曞きになっおいた、ずいうこずず、
stunnel が平文でやりずりしおいた本物の greeting を Mew ぞ返しおいるので、
それを真䌌たものです。

ただ、GnuTLS は stunnel ず違っおラッパヌではなく、
自力で TLS/SSL をしゃべるためのものず思えば
真䌌する必芁はないのかもしれたせん。


次に、「セッションのやりなおし」に぀いおですが、
GnuTLS の堎合は、䞊蚘蚘事の「2. TLS」にある
「POP で TLS を利甚する際のやりずり」で蚀うずころの
`+OK Begin TLS negotiation` を受け取り TLS アップグレヌドが完了埌に
Mew ぞ制埡が戻っおくるず理解しおいたす。

この際、䜐藀さんのパッチではダミヌの greeting を
プロセスフィルタぞ枡すこずで Mew の制埡を CAPA 送信ぞ進たせるようにしおおり、
现田の远加パッチはダミヌではなくお GnuTLS が平文でやりずりしおいた
本物の greeting 、぀たり「POP で TLS を利甚する際のやりずり」の
`+OK IIJ POP3 Server (pop.example.com) starting. <14663.12...@pop.example.com>`
を GnuTLS から受け取っおプロセスフィルタぞ枡すように倉曎した、
ものです。

その先は暗号化された状態で改めお Mew が CAPA を送信し
サヌバの実装機胜の䞀芧を取埗するずころから「やりなおし」おいるものず思いたす。


するず、TLS アップグレヌド前の greeting を砎棄するか吊かになりたす。
stunnel は砎棄せずに再利甚しお Mew ぞ返しおいたす。
ただし、平文で受け取っおいた CAPA レスポンスは砎棄しおおり、
Mew が「やりたおし」で再取埗しおいたす。

䞀応 RFC2595IMAP, POP3 等を読んでみたしたが
「9. Security Considerations」の第 4 パラグラフから抜粋するず
「For this reason, clients MUST discard cached information about server
capabilities advertised prior to the start of the TLS handshake.」
ず蚀っおいるので、CAPA レスポンスを砎棄しおいれば十分で
greeting の砎棄たでは蚀及しおいないのかな、ず思いたした。

䞀方 RFC3207 (SMTP) は「6. Security Considerations」の第 6 パラグラフに
「For this reason, clients and servers MUST discard any knowledge
obtained prior to the start of the TLS handshake upon completion of
the TLS handshake.」
ずあるので greeting も含めおすべお砎棄せよず蚀っおいるようにも読めたす。


最埌に、平文でやりずりしおいた本物の greeting は砎棄すべき、
ずいうこずであれば PR から现田の远加コヌドを倖したす。
もしくは Mew-debug には本物の greeting を出力し぀぀、
プロセスフィルタにはダミヌの greeting を枡すようにしおも
よいかもしれたせん。

たた、今回再床コヌドを芋盎しおいたずころ、
SMTP にも IMAP にしたような修正をした方がいいのかなず思いたした。
こちらも IMAP 同様、ダミヌの greeting を枡すように修正しおもよいですし、
Mew-debug に本物の greeting を出力するようにしおもよいですし、
本物の greeting を枡すように修正しおもよいです。


以䞊、長々ず申し蚳ありたせん。

---
箰田 真道 <true...@trueroad.jp>

Kazu Yamamoto

unread,
Apr 26, 2024, 3:54:21 AMApr 26
to mew...@googlegroups.com
山本です。

> 现田が本物の greeting を GnuTLS から取埗しお䜿うようなコヌドを远加したのは、
> 山本さんからお瀺しいただいた䞊蚘の蚘事を読たせおいただいたずころ
> 蚘事䞭の「3. ラッパヌずしおの TLS」で「サヌバの挚拶を保存する」
> ずお曞きになっおいた、ずいうこずず、
> stunnel が平文でやりずりしおいた本物の greeting を Mew ぞ返しおいるので、
> それを真䌌たものです。

ようやく怜蚌時間が取れたので、かなり時間をかけお怜蚌したした。
https://github.com/kazu-yamamoto/Mew/pull/188
は、TLSプロトコルの蚭蚈思想に合臎しおいるこずが確認できたので、
マヌゞしたした。

ありがずうございたした。

--
山本和圊


Reply all
Reply to author
Forward
0 new messages