KASLR(Kernel Address Space Location Randomization)は、Linuxカーネルの実行時の仮想アドレス空間を起動のたびにランダム化するセキュリティ機能です。
KASLRを有効化すると、攻撃者がLinuxカーネル内の特定の機能やデータのアドレスを予測することが困難になります。それによって、アドレスが判明している場合に可能な攻撃に対する保護レベルを向上させることができます。
工場出荷状態のArmadillo-IoT ゲートウェイ G4では、KASLRは無効化されています。
| |
---|
ユーザランドでも同様の仕組みとしてASLRという機能があります。工場出荷状態のArmadillo-IoT ゲートウェイ G4では、ASLRは有効化されています。 ASLRが有効化されていることを確認するには、randomize_va_spaceの値が0以外になっていることを確認してください。 [armadillo ~]# cat /proc/sys/kernel/randomize_va_space
2 |
ここからはKASLRを有効化し、有効化されていることを確認する方法を説明します。
電源を投入するとすぐに以下のように uboot からデバッグ出力されます。
その間にシリアル通信ソフトウェア上で何らかのキーを押して、
uboot の プロンプトに入ってください。
Hit any key to stop autoboot: 2
u-boot=>
環境変数optargsの値を確認します。nokaslrが指定されている場合は、KASLRは無効化されています。
u-boot=> env print optargs
optargs=quiet nokaslr
環境変数optargsからnokaslrを削除します。上記で、quietとnokaslrが指定されていることを確認したので、quietのみを指定します。
u-boot=> env set optargs quiet
設定が反映されていることを確認します。optargsにquietのみが指定されていることが確認できます。
u-boot=> env print optargs
optargs=quiet
設定を保存します。
u-boot=> env save
Saving Environment to MMC... Writing to MMC(2)... OK
以上でKASLRの有効化を終わります。
Linuxを起動して、シンボルのアドレスを確認します。ここでは例としてvprintk_deferredのアドレスを確認します。
[armadillo ~]# cat /proc/kallsyms | grep vprintk_deferred
ffffdaffcac98530 T vprintk_deferred
ffffdaffcac98530であることが確認できます。再起動後、再度vprintk_deferredのアドレスを確認します。
[armadillo ~]# reboot
: (省略)
[armadillo ~]# cat /proc/kallsyms | grep vprintk_deferred
ffffa5c2de898530 T vprintk_deferred
ffffa5c2de898530であることが確認でき、アドレスが変化していることが確認できました。
| |
---|
上位16bitと下位20bitはランダム化されません。 |