GnuPGのバグっぽいの、意外と致命傷だった

GnuPG でユーザーIDを入力する際に日本語を使うと動作がおかしくなる件、調査してみると、意外と傷が深いことが分かった。

GnuPG の util/ttyio.c において、ReadConsoleA という Win32 の API を使用しているところがある。
ここで、オリジナルの GnuPG では、ReadConsleA ではコンソール入力は1バイトずつしかありえないという前提でプログラミングされている。具体的には
ReadConsoleA (con.in, cbuf, 1, &nread, NULL)
という呼び出しがされているのだが、この cbuf の宣言が byte cbuf[1]; となっているのだ。

ここで注意すべきは、ReadConsoleA の第3引数は、バイト数の意味ではなくて、文字数の意味だということだ。ここでは、第3引数に1がセットされているので、コンソールから1バイトが読み込まれるのではなくて、あくまで1文字が読み込まれる。コンソールから日本語、いわゆるマルチバイト文字が入力されると、一度に2バイトが読み込まれるのだ。

このままでは cbuf はあふれてしまう。これで簡単にバッファオーバーフローが引き起こせるとは思えないが、現行のWindows がANSI文字で、最大2バイト文字(厳密にはANSI文字とはいえないが)を扱える設計になっている以上、cbuf の宣言は byte cbuf[2]; となっていなければならない。

とりいそぎパッチを作り、さらにパッチ適用済みの gpg.exe も作ってみた。おまけで、ユーザーID に日本語を使った場合でも正常に動作するようにしてある。

パッチはこちら
http://www7a.biglobe.ne.jp/~kzworks/attach/gnupg-1.4.9.patch

パッチ適用済みの gpg.exe(および iconv.dll)はこちら
http://www7a.biglobe.ne.jp/~kzworks/attach/gpg-1.4.9a.zip

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック