プロセッサ脆弱性SpectreとMeltdownのLinux用チェッカー

Meltdown and Spectre

話題のSpectreとMeltdownというプロセッサの脆弱性。俗に言う「PC」は軒並み脆弱性を抱えてると言って良いので早めの対処が必要だけどなかなか大変そう。
自分の端末でその脆弱性の有無を表示するLinux用のチェッカーがあるので試してみた。

https://github.com/speed47/spectre-meltdown-checker

ファイルはスクリプト1つだけ。インストールなどはなく、テンポラリディレクトリにでも置いて実行するだけ。不要になったら削除すれば良い。

$ cd /tmp
$ wget https://github.com/speed47/spectre-meltdown-checker/archive/master.zip
$ unzip master.zip
$ cd spectre-meltdown-checker-master
$ sudo ./spectre-meltdown-checker.sh
root's password: 管理者パスワード
Spectre and Meltdown mitigation detection tool v0.17

Checking for vulnerabilities against live running kernel Linux 4.4.49-16-default #1 SMP Sun Feb 19 17:40:35 UTC 2017 (70e9954) x86_64
Will use vmlinux image /boot/vmlinuz-4.4.49-16-default
Will use kconfig /tmp/config-0b1
Will use System.map file /boot/System.map-4.4.49-16-default

CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
* Kernel compiled with LFENCE opcode inserted at the proper places:  NO  (only 40 opcodes found, should be >= 70)
> STATUS:  VULNERABLE 

CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
* Mitigation 1
*   Hardware (CPU microcode) support for mitigation:  NO 
*   Kernel support for IBRS:  NO 
*   IBRS enabled for Kernel space:  NO 
*   IBRS enabled for User space:  NO 
* Mitigation 2
*   Kernel compiled with retpoline option:  NO 
*   Kernel compiled with a retpoline-aware compiler:  NO 
> STATUS:  VULNERABLE  (IBRS hardware + kernel support OR kernel with retpoline are needed to mitigate the vulnerability)

CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
* Kernel supports Page Table Isolation (PTI):  NO 
* PTI enabled and active:  NO 
> STATUS:  VULNERABLE  (PTI is needed to mitigate the vulnerability)

$

赤字部分が入力するコマンド等。
Kernel compiled with LFENCE opcode inserted at the proper places: が表示されたところで暫く停まったように見えるのが何かの文字列入力待ちと勘違いしそうになるが入力しないでプロンプトが返るまで待つ。

基本的な調査項目3つ(Spectre Variant 1, Spectre Variant 2, Meltdown)の各項目のSTATUSが赤塗りのVULNERABLEなら脆弱性有り、緑塗りのNOT VULNERABLEなら(一応)対策済みとなる。対策済みといっても根治ではないので、本当の意味で「対応」するなら対策済のプロセッサに物を交換するしかないみたいだけど。 ちなみに、上の実行例は全くパッチを当てていない未対策機なので3項目とも脆弱性有り。
\(^o^)/

FreeBSDでDHCPv6サーバ

IPv6のネットワークはIPv4に比べると難しい。正直いろいろワケワカラン。
DHCPv6によるアドレス固定やセキュリティについて紹介されているページをあまり見かけないのでちょっとだけやってみた。

先ず、IPv6で馴染めないのは1つのホストがIPアドレスを複数持つこと。特に一時用アドレスは匿名性が高くなるという利点はあるものの当然ながら使い捨てで変わりまくるので管理者にとってはまことにウザい。
IPv6的にスマートな解決方法があるのかもしれないのだけれど、そういうのを知らないので泥臭く対応する。
で、そのためにDHCPv6サーバを用意することにした。必須じゃなくて個人的な趣味でそうしたいだけ。

この記事では以前のFreeBSDルーターでIPoEFreeBSDルーターでDS-Liteの記事に倣い、NICはそれぞれWAN側(Flets側)のem0とLAN側のem1とする。

ルーター広告の設定変更

/etc/rtadvd.conf
1
2
3
4
5
6
em1:\     ←RA広告を行う(LAN側)ネットワークのIF名
        :raflags="mo":\
        :addr="fdc1:xxxx:xxxx:xxxx::":prefixlen#64:\
        :pinfoflags="l":\
        :rdnss="fdc1:xxxx:xxxx:xxxx::1":\
        :dnssl="local.net6":

既にRAが動いているとしたらステートレスな自動設定でIPv6アドレスが割り当てられている筈。
DHCPv6サーバを動かすにあたり変更するのはraflags (とpinfoflags)。
DHCPv6などのステートフルなプロトコルでIPv6アドレスを割り当てるのでManagedフラグ "m"を立てる。アドレス以外の情報もステートフルなプロトコルで割り当てるのでOtherフラグ "o"を立てる。2つ並べて"mo"を指定。

pinfoflagsは"l"が on-linkフラグ、"a"が自動アドレス設定フラグ。初期値は両フラグが立った"la"。 上の例のようにaフラグを下げる("l"指定)とアドレス割当てをDHCPv6だけに強制だが、それはそれで弊害あるのでpinfoflagsは指定しない("la"指定と同等)方が良いかも。

DHCPv6サーバのインストール

既にIPv4用にISC DHCPサーバをインストールしているならそれを使う。
無ければ以下。

# cd /usr/ports/net/isc-dhcp43-server
# make install clean
または
# pkg install net/isc-dhcp43-server

portsではビルド時のコンフィグメニューでIPv6を有効にする(無効にしない)こと。

DHCPv6サーバ設定

ネットワーク fdc1:xxxx:xxxx:xxxx::/64
DHCPサーバ兼DNSサーバ兼ルーターとして、IPアドレスはfdc1:xxxx:xxxx:xxxx::1とする。
リースするアドレスの範囲はfdc1:xxxx:xxxx:xxxx::8000:0〜fdc1:xxxx:xxxx:xxxx::ffff:ffffとする。

/usr/local/etc/dhcpd6.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
authoritative;
default-lease-time 86400;  #単位は秒 以下3行 最初は小さめに取る方が良いかも
preferred-lifetime 43200;
max-lease-time     86400;

option dhcp6.name-servers fdc1:xxxx:xxxx:xxxx::1;  #DNSサーバ (同居)
option dhcp6.domain-search "local.net6";
option dhcp6.info-refresh-time 3600;  #DHCPクライアント側の情報更新間隔

dhcpv6-lease-file-name "/var/db/dhcpd6.leases";

subnet6 fdc1:xxxx:xxxx:xxxx::/64 {
    #配るアドレスの範囲 最小と最大 を指定
    range6 fdc1:xxxx:xxxx:xxxx::8000:0 fdc1:xxxx:xxxx:xxxx::ffff:ffff;
}

# DUIDで識別してアドレス付与
host hoge {
    host-identifier option dhcp6.client-id yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy;
    fixed-address6 fdc1:xxxx:xxxx:xxxx::1111;  #与えるIPv6アドレス
}

# MACアドレスで識別してアドレス付与
host hage {
    hardware ethernet zz:zz:zz:zz:zz:zz;
    fixed-address6 fdc1:xxxx:xxxx:xxxx::2222;
}

ホストの識別にはMACアドレスでもDUIDでもどちらでもいけるっぽい。本来はMACアドレスではなくDUIDを使う筈だが、DUIDは正直面倒の元なのでMACアドレスの方が簡単。っていうかDUIDの仕様決めた奴絶対おかしい。使うの困る。
3種(4種)のDUIDの内、一番わかりやすいDUID-LLは 00:03:00:01: ➕ MACアドレス

DHCPv6サーバの起動

/etc/rc.conf (追記)
1
2
dhcpd6_enable="YES"
dhcpd6_ifaces="em1" #←LAN側のIF
# service isc-dhcpd6 start
または
# /usr/local/etc/rc.d/isc-dhcpd6 start

確認

サーバ側の設定を試行錯誤するにあたり、リース期間が残っているとクライアント側でIPアドレス等が反映しないかも。そこで強制的に再取得させる。

Windowsなら (管理者権限のコマンドプロンプトで)
C:\Windows\system32> ipconfig /release     #開放
C:\Windows\system32> ipconfig /renew       #再取得
C:\Windows\system32> ipconfig /all         #情報表示
Linuxなら
# dhclient -6 -r eth0             #開放 (eth0のIPv6だけ)
# dhclient -6 eth0                #再取得 (eth0のIPv6だけ)

Linuxはネットワークの情報確認でよく使うifconfig hogeやip addrではDHCPクライアントとしての情報が判り難いので以下。

# dhclient -6 -cf /etc/dhcp/dhclient.conf eth0 -v
Internet Systems Consortium DHCP Client 4.3.3
Copyright 2004-2015 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on Socket/eth0
Sending on   Socket/eth0
Created duid \xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx.
PRC: Soliciting for leases (INIT).
XMT: Forming Solicit, 0 ms elapsed.
XMT:  X-- IA_NA xx:xx:xx:xx
XMT:  | X-- Request renew in  +3600
XMT:  | X-- Request rebind in +5400
XMT: Solicit on eth0, interval 1090ms.
RCV: Advertise message on eth0 from fe80::xxxx:xxxx:xxxx:xxxx.
RCV:  X-- IA_NA xx:xx:xx:xx
RCV:  | X-- starts 1515042578
RCV:  | X-- t1 - renew  +0
RCV:  | X-- t2 - rebind +0
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
RCV:  Advertisement recorded.
PRC: Selecting best advertised lease.
PRC: Considering best lease.
PRC:  X-- Initial candidate xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx (s: 155, p: 0).
XMT: Forming Request, 0 ms elapsed.
XMT:  X-- IA_NA xx:xx:xx:xx
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
XMT:  | | | X-- Preferred lifetime +7200
XMT:  | | | X-- Max lifetime +7500
XMT:  V IA_NA appended.
XMT: Request on eth0, interval 1070ms.
RCV: Reply message on eth0 from fe80::xxxx:xxxx:xxxx:xxxx.
RCV:  X-- IA_NA xx:xx:xx:xx
RCV:  | X-- starts 1515042579
RCV:  | X-- t1 - renew  +0
RCV:  | X-- t2 - rebind +0
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
PRC: Bound to lease xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Checking DAD results for fdc1:xxxx:xxxx::1111

表示される情報量は多かったり少なかったり。

次はフィルタリングをやる予定。

関連記事:
Up