⚠この記事はブログ移転前のアーカイブです

最近見つけたけど僅差で先を越されて報奨金取りそこねた脆弱性の解説をします.既に直ってます.

大手のアンチウイルスソフトには「WEBセーフスキャン」だとか「HTTPSスキャン」とかいう「暗号化されたHTTP通信のスキャン」機能を持つ事が多いです.Avast!無料版にもこの機能が含まれています.

このHTTPSスキャン機能に「Avastインストール後,再起動が行われるまで,どのような証明書でも妥当と判断されるバグ」が存在しました.

HTTPSスキャンとは

HTTPS通信はそれまで平文通信だったHTTP通信を暗号化する技術です.つまりは盗聴などがしにくくなるということです.

しかしアンチウイルスソフトがWEBサイトを検査する際に,プロキシを立ててパケットを覗いても暗号化されているので検査ができません.それでは困るので暗号化された通信でもスキャン可能なHTTPSスキャン機能が登場しました.(ブラウザ拡張機能を用いた手法もあります)

一度復号→再暗号化

では暗号化されたHTTPS通信をどうやって覗き見るのでしょうか.多くのアンチウイルスソフトがとっている手法は復号からの再暗号化です.

SSLの仕組みはここで理解していただくとして,Avastがやっていることは,本来クライアント↔サーバー間でやり取りされる通信の間にプロキシ(のようなもの)を立てて,プロキシ↔サーバー間で証明書の妥当性や暗号通信を行うのです.

プロキシ↔サーバー間で暗号化された通信は一度プロキシ内で復号され,スキャンされます.

そして”Avastが署名した証明書で再暗号化してブラウザに渡す”のです.なのでAvastが入ったPCで(かつHTTPSスキャンを有効にして)ブラウザでhttpsサイトにアクセスすると,本来そのサイトで使われている証明書ではなくAvast発行の証明書にすり替わっているのが分かります.

「Avastの自己署名ならオレオレ証明書として扱われてエラーが出ないか?」となるかもしれませんが,AvastのSSL証明書に対応するルート証明書はAvastをPCにインストールするタイミングでルート証明書もインストールが行われるのでエラーは出ません.

エラーの出る証明書にはどう振る舞う?

上記のAvastの動作は「サーバーで用意してあるSSL証明書がクライアントで妥当と判断されている前提」でのお話です.クライアントで用意されている証明書がそもそも「期限切れ」だったり「オレオレ証明書」だったり,所謂**「妥当と判断されない証明書」**が使われた通信であった場合はAvastはどう振る舞うのでしょうか.

もちろん,Avastで用意した証明書でもエラーを出すように工夫されています.そうでなければいけません.

バグ概要

では発生していたバグの概要です.

「Avastインストール後,再起動が行われるまで,どのような証明書でも妥当と判断されるバグ」

です.どういうことかというと,「期限切れ」・「オレオレ証明書」のような**「妥当と判断されない証明書」**であっても,妥当な証明書として扱ってしまうバグです.

このバグ,一度再起動すると発現しなくなります.なので影響は少ないと見られがちなんですが,最近のAvastはインストール後の再起動は不要というなんともむず痒い仕様になったのです.(100年後リブート機能があるくらいだし不思議じゃない)

影響

じゃあこのバグによってどんな影響が出るのか?色いろあると思うんですが代表的なのは

ブラウザのパスワード自動入力機能が誤作動を起こしてパスワードが盗まれる

といったところでしょう.本来ブラウザのパスワード自動入力機能は最初にログインに成功したサイトしか機能しません.(login.twitter.comならlogin.twitter.comでみたいな)

しかし,ChromeなどのメジャーなブラウザはHTTPSエラーが発生すると自動入力は行われません.見た目 login.twitter.comであっても証明書のエラーがでると正規のサイトだと判断されないからです.

HTTPSパスワードの窃取テクニックはXSSを使ったりルート証明書を仕込んだししなければならずハードルが高い傾向にあります.

しかしAvastのバグによって,適当にオレオレ証明書作ってドメイン偽装してしまえば簡単にブラウザを騙しパスワードを盗み出すことが可能になります.

先程も書きましたが,バグ自体が存在したままでも再起動さえしてしまえば発生しないです.むしろ長くPCに触っていた方なら条件反射で再起動していたかもしれませんね.Windows10のコンシューマー版は強制アップデートと名高いOSですから気付かれにくかったのでしょう.