この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった18日目の記事です。
はじめに
pkgsrcはmk.conf
ファイルに設定しておくことで、
挙動を変更することができます。
その中に、以前より試してみたかったオプションが3つあります。
PKGSRC_USE_RELRO
PKGSRC_MKPIE
PKGSRC_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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。