この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった18日目の記事です。
はじめに
pkgsrcはmk.confファイルに設定しておくことで、
挙動を変更することができます。
その中に、以前より試してみたかったオプションが3つあります。
PKGSRC_USE_RELROPKGSRC_MKPIEPKGSRC_MKREPRO
その中でも、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で、
有効にするには、partialとfullのいずれかを
設定することが必要と分かります。
また、コンパイラーにLDFLAGS経由で渡されるオプションについても記載されています。
今回は、fullを指定したいと思います。Got overwriteが防止
できるようになるようです。
RELROを有効にして
上述したように、コンパイラーにオプションが渡されます。
これによって、RELROが有効になったバイナリーができるはずですが、
pkgsrcでは、RELROが有効になってバイナリーが本当に生成されたかを
readelfコマンドで確認するようになっています。
ですので、LDFLAGSを尊重しないようになっているビルドメカニズムである
パッケージについて、RELROを有効にしてビルドしたつもりになって
しまうのを防止することができます。
私の使っているパッケージのビルドでは、converters/qkc
以外はLDFLAGSを尊重しているようで、RELROを有効にしたバイナリーを
作成することができました。
editors/emacs25やwww/firefoxも
特に支障なく動いているようです。
まとめ
RELROを有効にして、pkgsrcのパッケージをビルドしてみました。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。