Android 6.0以降にはIPsecにおけるSHA-256の取り扱いに不備があり、標準に準拠したVPNサーバーとIPsecで接続できないケースがあるという問題の存在が知られている。同問題は1年半近く放置されてきたが、ようやく解決への道筋が見えてきた。同問題の詳細と、その解決方法などについて紹介する。

 研究の進展や計算機の能力向上によって、改ざん検知などに使われる暗号学的ハッシュアルゴリズム「SHA-1」の安全性が揺らいでおり、様々な分野で、より安全な「SHA-2」などへの置き換えが進んでいる。2017年2月にグーグルが、SHA-1によるハッシュ値が同じになる2つの異なるPDFファイルを実際に作成して見せたことで、この流れは一層加速するとみられている。

 暗号学的ハッシュアルゴリズムは、VPN接続などで使われるIPsecでもデータの改ざん検知に使用されているが、ここでもSHA-1やMD5の代わりにSHA-2の一種である「SHA-256」や「SHA-512」を使用する動きが積極化している。Androidは2015年10月にリリースされたバージョン6.0以降で、IPsecによるVPN接続の改ざん検知にSHA-256を使用でき、さらにそれを最優先で使うようになっている。

Android 6.0の実装で痛恨のミス

 このAndroid 6.0でのIPsecのSHA-256対応に際して、グーグルは痛恨のミスを犯した。

 IPsecでは、各パケットの改ざん検知用に生成したハッシュ値をそのまま使うのではなく、特定幅の先頭ビットを切り取った値を使うことで通信帯域を節約できるようにしている。そしてSHA-256の切り取り幅は、2007年に策定された標準「RFC4868」で128ビットと規定されている。

 しかしグーグルは、SHA-256の切り取り幅を標準の128ビットではなく96ビットとしてしまった。そのため、切り取り幅が128ビットのIPsecを使用するVPNサーバーとは、SHA-256で接続できない状況になったのである。さらに前述の通り、AndroidがSHA-256を最優先で使用するようサーバーに提案するため、問題が顕在化しやすくもなった(図1)。実際、AOSP(Android Open Source Project)のバグ報告サイトには、2015年末頃からVPNサーバーに接続できないという報告と苦情が多数寄せられている。

図1●Android 6.0以降でIPsecを使ったVPN接続に問題が生じる理由
図1●Android 6.0以降でIPsecを使ったVPN接続に問題が生じる理由
Androidでは、IPsecの改ざんチェックにSHA-256を使用する際、標準で規定される128ビットの切り取り幅ではなく、96ビットを切り取る。そのため標準に沿った動作をするVPNサーバーとは、SHA-256では接続できない。しかも、SHA-256を最優先アルゴリズムとして提案するため問題が顕在化しやすい。
[画像のクリックで拡大表示]