pkgsrcでRELROを有効にしてビルドしてみる

この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった18日目の記事です。

はじめに

pkgsrcはmk.confファイルに設定しておくことで、 挙動を変更することができます。 その中に、以前より試してみたかったオプションが3つあります。

  • PKGSRC_USE_RELRO
  • PKGSRC_MKPIE
  • PKGSRC_MKREPRO
の3つです。

その中でも、PKGSRC_MKREPROに一番興味があったのですが、 どうやら今は循環依存になってしまい、リーフパッケージでないと ビルドできない状態のようです。

今回は、PKGSRC_USE_RELROを有効にして、自分のいつも使っている パッケージをビルドして使ってみました。

RELROとは何か

RELROは、RElocation Read-Onlyの略だそうです。 私はセキュリティー機能の専門家ではないので、詳しく説明はできませんが、 メモリーの一部の領域を読み出し専用にして、メモリーの破壊を防止する ことで、安全性を高める手法と理解しています。

設定方法

mk.confに設定できる内容は、pkgsrc/mk/defaults/mk.conf に既定値が設定されており、コメントも付記されています。 RELROについては、以下のように記載されています。


PKGSRC_USE_RELRO?= no
# Link with RELRO by default (on supported platforms). This makes the
# exploitation of some security vulnerabilities more difficult in some cases.
# Possible values:
#       no:      Do not pass any flags for RELRO
#       partial: Pass -Wl,-z,relro
#       full:    Pass -Wl,-z,relro -Wl,-z,now
#
# Keywords: relro

のように記載されています。この内容は、任意のパッケージのディレクトリーで 以下のように実行することで読むこともできます。

$ make help topic=relro
===> mk/defaults/mk.conf (keywords: relro no PKGSRC_USE_RELRO full partial):
PKGSRC_USE_RELRO?= no
# Link with RELRO by default (on supported platforms). This makes the
# exploitation of some security vulnerabilities more difficult in some cases.
# Possible values:
#       no:      Do not pass any flags for RELRO
#       partial: Pass -Wl,-z,relro
#       full:    Pass -Wl,-z,relro -Wl,-z,now
#

これによると、PKGSRC_USE_RELROの既定値はnoで、 有効にするには、partialfullのいずれかを 設定することが必要と分かります。 また、コンパイラーにLDFLAGS経由で渡されるオプションについても記載されています。

今回は、fullを指定したいと思います。Got overwriteが防止 できるようになるようです。

RELROを有効にして

上述したように、コンパイラーにオプションが渡されます。 これによって、RELROが有効になったバイナリーができるはずですが、 pkgsrcでは、RELROが有効になってバイナリーが本当に生成されたかを readelfコマンドで確認するようになっています。 ですので、LDFLAGSを尊重しないようになっているビルドメカニズムである パッケージについて、RELROを有効にしてビルドしたつもりになって しまうのを防止することができます。

私の使っているパッケージのビルドでは、converters/qkc 以外はLDFLAGSを尊重しているようで、RELROを有効にしたバイナリーを 作成することができました。 editors/emacs25www/firefoxも 特に支障なく動いているようです。

まとめ

RELROを有効にして、pkgsrcのパッケージをビルドしてみました。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

NetBSDからCanon LBP3100に印刷する

この記事は、 NetBSD Advent Calendar 2024 の2日目の記事です。 Canon LBP3100というプリンターについて Canon LBP3100 というプリンターは。Canonの安価なwinprinterです。 私は2015年3月に...