初めに #
AlmaLinuxのようなRHELベースのLinuxディストリビューションでは、セキュリティ機能の一つであるASLRが標準で有効化されています。
難しそうに聞こえるかもしれませんが、ASLR の有効化状況を確認する作業はそれほど複雑ではありません。
基本的なコマンドを実行するだけで、システム全体やアプリケーションごとの対応状況を把握する事ができます。
そこで本記事では、AlmaLinux システム全体での ASLR の有効化状況を確認する方法と、個々のプログラムが ASLR に対応しているかを調べる方法について、初心者の方にも理解しやすい形で解説していきます。
ASLRとは #
ASLRは、アドレス空間配置をランダム化することでセキュリティを強化する仕組みです。
通常、プログラムを実行すると、コード(実行ファイル本体)やデータ領域、スタック、ヒープ、共有ライブラリ といった「プログラムを構成する部品」がメモリ上の決まった場所に配置されます。
この配置が毎回同じであれば、攻撃者は特定のアドレスを狙ってバッファオーバーフローやリターンアドレスの書き換え攻撃を仕掛けることができます。
ASLRを有効化すると、これらのメモリ配置が実行ごとにランダム化されるため、攻撃者は「どのアドレスにコードが存在するか」を予測しにくくなります。
その結果、攻撃の成功率を大幅に下げ、システム全体の安全性を高めることができます。
カーネルで設定可能なレベル #
Linuxカーネルでは、ASLRのランダム化の強度を以下の3つのレベルで設定する事が可能です。
値 | 設定内容 | 説明 | セキュリティ強度 |
---|---|---|---|
0 | 無効 | アドレス空間のランダム化を行わない | 低 |
1 | 部分的に有効 | 共有ライブラリやスタック、mmap領域のみランダム化を行う | 中 |
2 | 完全 | 1に加え、ヒープや実行ファイル本体もランダム化 | 高 |
AlmaLinux等の多くのRHEL系ディストリビューションでは、デフォルトで 最も強度の高い「2レベル」が有効となっており、インストール直後からセキュリティが確保されています。
設定レベルの確認方法 #
現在のシステムでASLRがどのレベルに設定されているかは、カーネルパラメータ kernel.randomize_va_space
にて確認が可能です。
カーネルパラメータを確認する方法は以下の2点となります。
設定ファイルを参照する #
Linuxでは多くのカーネル設定が /proc/sys/
以下の仮想ファイルに保存されています。
ASLRの設定も同様に、次のコマンドにて数値を直接確認する事ができます。
cat /proc/sys/kernel/randomize_va_space
以下は、AlmaLinux(デフォルト設定) にて確認した例となります。
$ cat /proc/sys/kernel/randomize_va_space
2
この結果から、デフォルト設定では、最も強度の高い「2レベル」が有効となっている事が分かります。
sysctlコマンドで確認する #
もう一つの方法は sysctl
コマンド を使うやり方となります。
sysctl
はカーネルパラメータを簡単に表示・変更できるコマンドとなっております。
ASLRの設定を確認するには以下を実行してください。
sysctl kernel.randomize_va_space
以下は、AlmaLinux(デフォルト設定) にて確認した例となります。
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2
先ほどの仮想ファイルでの確認と同様に「2レベル」が有効となっている事が分かります。
設定レベルの変更方法 #
ASLRの設定レベルを変更するには システム管理者権限(root 権限) が必要となります。
そのため、共用レンタルサーバーや、root権限が付与されていないVPSサービス等では設定は不可となります。
設定方法は以下の2通りとなっております。
一時的な変更 #
1つめは、先ほどの確認方法でも紹介した sysctl
コマンドを利用する方法となります。
こちらの設定はサーバーが再起動するまで有効な、一時的な設定変更となります。
以下、設定コマンドとなります。
sysctl -w kernel.randomize_va_space=レベル番号
例えば検証等を目的に意図的に無効化を行う場合は以下となります。
sysctl -w kernel.randomize_va_space=0
恒久的な変更 #
再起動後も設定を保持したい場合は、 /etc/sysctl.conf
ファイルに設定を追記する必要があります。
以下は、目的に意図的に無効化を行う例となります。
nano /etc/sysctl.conf
ファイルの末尾に以下を追加します。
kernel.randomize_va_space = 0
バイナリのPIE対応を確認する方法 #
ASLR機能はカーネルパラメータにて有効化されていても、すべてのバイナリに自動で適用されるわけではありません。
バイナリ自体が PIE形式 でビルドされていない場合、実行ファイル本体のコード領域は固定アドレスに配置されるため、ASLRの効果が限定的になってしまいます。
したがって、ASLRを最大限に活かすには、以下の2点を満たす必要があります。
- カーネル側のASLR設定を有効化する
- PIE対応バイナリを利用する
AlmaLinux をはじめとする RHEL 系ディストリビューションや Ubuntu など主要な Linux では、パッケージリポジトリから提供される公式バイナリの多くがすでにPIE対応しています。
つまり、通常の運用で dnf
や yum
からインストールしたパッケージであれば、特に意識せずともASLRの恩恵を受けられるケースがほとんどです。
ただし、ソースコードから自分でビルドしたアプリケーション や、古いパッケージを利用している場合は非PIEバイナリのまま残っている可能性があります。
PIE対応かどうかは、readelf
コマンドで簡単に確認する事ができます。
以下はlsコマンドに対して確認を行う例となります。
$ readelf -h /bin/ls | grep Type
Type: DYN (Shared object file)
このように DYNと表示されれば、そのバイナリは PIE に対応しており、ASLR の効果を最大限に活用できます。
一方で CentOS7 等の古いOS では、非PIE形式 となっている場合がございます。
以下、CentOS7での確認例となります。
$ readelf -h /bin/ls | grep Type
Type: EXEC (Executable file)
この場合、ASLRの効果は共有ライブラリなどの一部となっており、実行ファイル本体のコード領域は固定アドレスで配置されます。
そのため、攻撃者にとってアドレス予測が容易になる可能性がございます。
より安全に利用された場合は、PIE形式 でビルドされたソフトウェアやアプリケーションを利用される事を推奨いたします。