LibreSSL
読み:リブレ-エスエスエル
外語:LibreSSL
SSL/TLS
のオープンソースによる実装の一つ。
OpenSSL
の派生改良版で、今後の主流になると見込まれている。
目次
概要
特徴
ライセンス
対応プラットフォーム
標榜
由来
改善の傾向
安全の考え方
状況
変更点
コードの削除
ヴァルハラ送り
メモリー
疑似乱数生成アルゴリズム
履歴
概要
LibreSSLは、OpenSSLの全面的な
リファクタリング
を実施し、コードベースのモダン化とクリーンナップを通じセキュリティの改善を図ることを目的として、The OpenBSD Projectによりフォークされたコードベースである。
LibreSSLはOpenSSLからの置き換えが想定され、次の4つから構成されている。
openssl ‐ 鍵や証明書管理のためのツール
libcrypto ‐ 暗号化のためのライブラリー
libssl ‐ OpenSSLと後方互換性のあるTLSライブラリー
libtls ‐ LibreSSLの新しいTLSライブラリー
当時最新だったOpenSSL 1.0.1ブランチがベースで、以降、OpenBSDプロジェクトではLibreSSLが標準のTLSライブラリとなった。
特徴
ライセンス
OpenSSLと同様に、Apache License 1.0と
4条項BSDライセンス
という、宣伝条項を含むライセンスと、ISCライセンス、パブリックドメインが混在する。
OpenSSLからライセンスは変更できないので
GPL
非互換なのは従来同様であるが、Linuxはじめ様々なOSが対応している。
対応プラットフォーム
Linux
(カーネル3.17以降推奨)
FreeBSD
(9.2以降でテスト済み)
NetBSD
(7.0以降推奨)
HP-UX
(11i)
Solaris
(11以降推奨)
Mac OS X
(10.8以降でテスト済み)
AIX
(5.3以降)
Windows環境
Microsoft Windows
(XP以降、x86およびx64)
Wine
(32ビットおよび64ビット)
Microsoft Visual Studio
2013以降のビルド、Mingw-w64と
Cygwin
標榜
LibreSSLの最初のゴールは、次としている。
OpenSSLとのAPI/ABI互換性を維持する ‐ 我々は第一として代替品になるつもりである
より多くの人々をコードベースで作業させる ‐ ※それは怖いことじゃないよ※
バグの修正 ‐ モダンなコーディングの実戦
移植性の確保
簡単には、OpenSSLプロジェクトが怠慢で今までしてこなかった必要なことを、代わりにする、という宣言である。
「怖いことじゃない」というのは、後に詳細するスライドで書かれているように、OpenSSLのコードが怖すぎる(≒ヤバい)ので、そうではない方向を目指すという意味である。
由来
2014(平成26)年4月、世界はOpenSSLの「Heartbeat拡張」がもたらした
セキュリティホール
、
CVE-2014-0160
(心臓出血)で震撼した。
OpenBSDプロジェクトでもOpenSSLを用いていたため、OpenSSLのソースを調査、結果として(バグだらけであまりにも酷いので)OpenBSDプロジェクト指揮下での全面的な刷新が必要と判断、OpenSSL本流よりフォークされLibreSSLと命名され、改善が開始された。
OpenBSDプロジェクトによる調査で、フォークまでする決断にいたった理由として、
Bob Beck氏によるスライドが公開されている
。
ここに「The code was too horrible. Nobody wanted to work with it.」「(意訳: このコードはヤベェ、誰もこんなのに関わりたくねェ)、「RUN AWAY!!!」(意訳: 逃げろ!!!)などとあるようにコードが汚すぎて外部の参加者がみな逃げ出すような代物だったこと、およびバグ管理システムに記録されたバグを修正することなく放置していることを理由としている。
スライドではHeartbeat拡張のバグの件にも振れ、最後に「eek!」(意訳: キャーッ!)とあるような悪手の結論であることを述べているが、いずれにせよHeartbeat拡張のバグは、LibreSSLフォークの理由ではなく、単なる切っ掛けの一つでしかない。
改善の傾向
OpenSSLは歴史あるソフトウェアなので、既に不要なコードが大量に存在する。
LibreSSLでは、古くて既に使われていない処理や、古くてもうあまり使われない処理などを一気に削除した。
ちなみに、LibreSSL開発開始のきっかけとなったCVE-2014-0160(心臓出血)への抜本的な対応としてOpenBSDプロジェクトの取った選択は、「Heartbeat拡張の削除」だった。
加えて、OpenSSLには報告されていながら長年放置されたままのバグも多くあるが、これらはLibreSSLにて積極的に修正されている。
また、以前よりNSAによる
バックドア
として知られていた疑似乱数生成アルゴリズム「
Dual_EC_DRBG
」も、LibreSSLで除去された。再びNSAからの横槍が入らない限りは、LibreSSLはOpenSSLとは比較にならない安全性を持つと言える。
安全の考え方
OpenSSLからLibreSSLに変更したからといって、必ずしも絶対安全とは限らない。世の中に絶対はない。
OpenSSLにあるセキュリティホールが未修正のまま残っていることもあり、また修正の手違い等で、OpenSSLにはないセキュリティホールを新たに埋め込んでしまう可能性もある。
OpenBSDプロジェクトでは、バグも脆弱性もないコードを作ることなどできない、という前提で開発が進められており、しかし何よりもセキュリティを重視している。この折り合いを付けるため、セキュリティホールになりにくいCの関数を作ったりして、少しでもセキュリティが向上するようにするという開発方針を取っている。
その上で、「脆弱性のあるコードをリリースしてしまった(失敗)」→「指摘する人がいる」→「それをすぐ修正する人がいる」→「すぐに修正されたコードがリリースされる」という動きがオープンソースの良さであり、OpenBSDプロジェクトではこれが達成されている。上にも書かれたように、OpenSSLではこれがなく、脆弱性が長く放置されていたのが欠点だったのである。
状況
LibreSSLの開発第一段階はまずOpenBSDでの動作が優先されていた。これは、元々は「OpenBSD用のまともなOpenSSL」として開発に着手されたためであるが、後に様々なプラットフォームに対応するようになった。
LibreSSLの開発第二段階となると、他のプラットフォームへの移植性なども考慮し始め、「LibreSSL Portable」としてリリースされた。元々OpenBSDの主張では、LinuxではセキュアなRNG(乱数生成器)は無理だ、との主張であったので、これは大きな譲歩であるとも言える。これは2.0.0が初版である。Linux、Solaris、Mac OS X、FreeBSDでテスト済みとされた。また2.1.4以降はWindowsにも対応した。
変更点
コードの削除
古いコードを中心に、躊躇なく削除されている。
フォークの切っ掛けとなったバグ「Heartbeat拡張」という、そもそも要らない機能の丸ごと削除をはじめとして、古い環境に対応させるために追加されたコード、古い暗号やハッシュアルゴリズム(MD2、SSL 2.0、ケルベロス認証など)の削除、そして、
バックドア
であり
セキュリティホール
そのものである「
Dual_EC_DRBG
」も無事に削除された。
また、SSL 3.0も遂に陥落したことから、いずれSSL 3.0も削除されるものと思われる。
ヴァルハラ送り
具体的には、次のようなレガシー環境の処理が削除されている
。
EBCDIC
対応
MS-DOS
対応
古い
Mac OS
対応 (
OS X
より前のもの)
Win16
など
あなたが聞いたことがないようなもの
VMS
対応
などなどなどなどなど
北欧神話やクトゥルー神話などを持ち出して、EBCDICやVMSは神話の時代の代物であることを強調している。
メモリー
OpenSSLではメモリー制御に独自処理が目立つが、LibreSSLでは
標準Cライブラリ
にある関数のうちセキュアなもの(OpenBSDが提唱した
strlcpy
など)に置き換えが進められている。
標準関数で一元化することで、
ASLR
、
NXビット
、カナリアといった手法で、バッファーオーバーフローの検出が容易に可能になる。
疑似乱数生成アルゴリズム
疑似乱数生成アルゴリズムも、「
Dual_EC_DRBG
」の削除をはじめとして改良されている。
乱数のシード生成処理の改良の他、新しい暗号アルゴリズムも追加された。
履歴
各バージョンごとに分離し、かつ新しいものを上として記述する。
LibreSSL 2.6
LibreSSL 2.6.0 (2017(平成29)年7月12日)
LibreSSL 2.5
LibreSSL 2.5.5 (2017(平成29)年7月12日)
LibreSSL 2.5.4 (2017(平成29)年5月1日)
LibreSSL 2.5.3 (2017(平成29)年4月11日)
LibreSSL 2.5.2 (2017(平成29)年3月26日)
LibreSSL 2.5.1 (2017(平成29)年2月1日)
LibreSSL 2.5.0 (2016(平成28)年9月27日)
LibreSSL 2.4
LibreSSL 2.4.5 (2017(平成29)年2月1日)
LibreSSL 2.4.4 (2016(平成28)年11月6日)
LibreSSL 2.4.3 (2016(平成28)年9月27日)
LibreSSL 2.4.2 (2016(平成28)年8月1日)
LibreSSL 2.4.1 (2016(平成28)年6月9日)
LibreSSL 2.4.0 (2016(平成28)年5月31日)
LibreSSL 2.3
LibreSSL 2.3.10 (2017(平成29)年2月1日)
LibreSSL 2.3.9 (2016(平成28)年11月6日)
LibreSSL 2.3.8 (2016(平成28)年9月27日)
LibreSSL 2.3.7 (2016(平成28)年8月1日)
LibreSSL 2.3.6 (2016(平成28)年6月9日)
LibreSSL 2.3.5 (2016(平成28)年5月31日)
LibreSSL 2.3.4 (2016(平成28)年5月3日)
LibreSSL 2.3.3 (2016(平成28)年3月22日) ‐ OpenBSD 5.9-release
LibreSSL 2.3.2 (2016(平成28)年1月28日)
LibreSSL 2.3.1 (2015(平成27)年11月2日)
LibreSSL 2.3.0 (2015(平成27)年9月23日)
LibreSSL 2.2
LibreSSL 2.2.9 (2016(平成28)年6月9日)
LibreSSL 2.2.8 (2016(平成28)年5月31日)
LibreSSL 2.2.7 (2016(平成28)年5月3日)
LibreSSL 2.2.6 (2016(平成28)年1月28日)
LibreSSL 2.2.5 (2015(平成27)年12月7日)
LibreSSL 2.2.4 (2015(平成27)年10月15日)
LibreSSL 2.2.3 (2015(平成27)年8月29日)
LibreSSL 2.2.2 (2015(平成27)年8月5日) ‐ OpenBSD 5.8-release
LibreSSL 2.2.1 (2015(平成27)年7月8日)
LibreSSL 2.2.0 (2015(平成27)年6月11日)
LibreSSL 2.1
LibreSSL 2.1.10 (2016(平成28)年1月28日)
LibreSSL 2.1.9 (2015(平成27)年12月7日)
LibreSSL 2.1.8 (2015(平成27)年10月15日)
LibreSSL 2.1.7 (2015(平成27)年6月11日)
LibreSSL 2.1.6 (2015(平成27)年3月19日)
LibreSSL 2.1.5 (2015(平成27)年3月16日) ‐ OpenBSD 5.7-release
LibreSSL 2.1.4 (2015(平成27)年3月3日)
LibreSSL 2.1.3 (2015(平成27)年1月21日)
LibreSSL 2.1.2 (2014(平成26)年12月8日)
LibreSSL 2.1.1 (2014(平成26)年10月16日)
LibreSSL 2.1.0 (2014(平成26)年10月12日)
LibreSSL 2.0
LibreSSL 2.0.6 (2015(平成27)年10月15日)
LibreSSL 2.0.5 (2014(平成26)年8月8日) ‐ OpenBSD 5.6-release
LibreSSL 2.0.4 (2014(平成26)年8月3日)
LibreSSL 2.0.3 (2014(平成26)年7月21日)
LibreSSL 2.0.2 (2014(平成26)年7月15日)
LibreSSL 2.0.1 (2014(平成26)年7月13日)
LibreSSL 2.0.0 (2014(平成26)年7月11日) ‐ 初版
再検索