2017-07-01 (Sat) [長年日記]

_ [obsd][sec]みんな違って、みんないい - カーネルのランダム化

OpenBSD は kernel relinking により、(ほぼ) すべてのカーネルが別個のアドレス構成を持つようになりました。

この変更の理由は以前 KARL という題で投稿されました。 メモリ割り当てをランダムにしたほうが良いということは既に常識です。 OpenBSD は ASLR に取り組んできました。 しかしカーネルは常に同じです。 OpenBSD は 6か月ごとのリリースなので、stable リリースをインストールする人は基本的に 6か月間、全員が同じカーネルを使い、同じアドレス空間を持っています (カーネルに関しては)。これはイヤですね。*1

その解決策として、毎回インストール or アップグレード or 起動 or 'make install' するたび、世界にひとつだけのカーネルを作ることにしたわけです。

起動に必要な部分は固定ですが、それ以外はランダムなギャップとランダムな順番でリンクし直されます。固定部分も、いったん起動してしまえば不要なので unmap あるいは trash されます。こうして、ひとつリークがあっても他の情報には結びつかないようになりました。

これは重要なセキュリティ機能とはいえ、これだけのために base セットへ cc を入れるのもイヤなので、リンクのためには ld の linkscript 機能を使ったそうです。ここらへん、私は実装を見ていないので何ともわかりません。

デバッグなどのために、この機能を無効にしたい場合は、カーネルを make install ではなく cp で持ってくることで、勝手に再リンクされなくなるそうです。

いやぁ、Theo が 5年近くも (誰かに押しつけようとして) 着手できなかったというだけあって、なんとも危険な香りのする仕組みですが、どうなんでしょうか。スクリプトと ld を使っているということから、今後のリグレッションも心配です。これだけ苦労しても、普通のユーザには一切、目に見える違いがないというのもすごいです。 でも、本当に OpenBSD のカーネルを攻撃しようとする人にとって面倒なことになりそうだというのもわかります。

7/7 追記: Slashdot に記事が来てた。 https://tech.slashdot.org/story/17/07/05/2327234/openbsd-will-get-unique-kernels-on-each-reboot

*1 ちなみに KASLR については grsecurity による批判 (日本語訳?) がありますが、そこで提示されている問題点も今回の relinking によってかなり対処されるように見えますね


«前の日記(2017-05-16 (Tue)) 最新