まずはスクリーンショットから
気づいた経緯
SSL関連での設定を行ったこともあって、ほかのサイトでも「SSL設定はどうなっているかな」と調べていたところ、証明書がこんなのになっていることに気づいてしまいました。
技術的な詳細
ブラウザで「安全」だとされる証明書は、証明書の署名をたどっていって、ブラウザあるいはOSに入っている「ルート証明書」に行き着くもの、ということになります。そして、このルート証明書の正しさを担保するものは、じつは何もありません。
ということで、誰かがルート証明書に不用意なものを追加してしまえば、SSLの安全性全体が崩壊しかねない、ということになります(少し前に、Superfishなんていうものが話題となりました)。
このケースでも、avast!が追加した「avast! Web/Mail Shield Root」がルート証明書として組み込まれて、そしてavast!が生成したgithub.comの証明書が「正当なもの」として通用してしまっています。
セキュリティのためなら仕方ないんじゃ?
たしかに、このような手を使わなければHTTPSの通信内容を取得することはできません。実験用などで、意図的にMITMProxyを自分で仕掛けることもあるかもしれません。
ただ、今回気づいてびっくりしたように、avast!のこの仕掛けは、少なくとも意識的に設定したものではありません。コンピューターの管理者が事前に設定しておく、という場合はともかく、自分自身のパソコンにこのような設定を組む以上は、ユーザー側の明確な同意が必要なものだと考えます。「許諾契約に書いておいた」レベルではまずいでしょう。
公開鍵ピンニングは?
Githubでは公開鍵ピンニングを導入しているので、こんなMITM攻撃は成立しないと思っていました。ところが、今回の場合は通ってしまっていました。で、確認してみると、もともとブラウザについていた以外のルート証明書については、ピンニングチェックの対象外とのことでした。このように、PC側に何か入れられた場合には手のうちようがありません。