CPUの脆弱性におけるEC2(Amazon Linux、Windows)とECSの対応

# CPUの脆弱性
年明け早々に問題になっている「CPUの脆弱性」について、AWSでの保守についてのメモです。

今回騒ぎになっているのは1月3日に[Project Zero](https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html)の記事で紹介されたCPU脆弱性。

CPUの脆弱性の影響や対応方法などは、以下の記事がとてもわかりやすかったです。

- [Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ](http://www.4gamer.net/games/999/G999902/20180105085/)

- [LinuxコアメンバーによるMeltdownとSpectre 対応状況の説明](https://qiita.com/hogemax/items/008f19fd14eebca474d7)

上記の記事で、問題点や影響について大変わかりやすく解説されているので、この記事で脆弱性の問題は省いて、AWSのEC2、ECSの対応を書いて行きたいと思います。

# EC2(Amazon Linux、Windows)の対応
[Processor Speculative Execution Research Disclosure](https://aws.amazon.com/jp/security/security-bulletins/AWS-2018-013/)を簡単に要約すると、

KPTIのバグに対処と、`CVE-2017-5754`(不正なデータキャッシュ読み込み)の軽減策を改善するカーネルをリリースしました。最新のAmazon LinuxカーネルかAMIにアップデートすることによって対応されたカーネルが使えるようになります。

アップデートを推奨されているサービスは、
`EC2`、`EC2 Windows`、`ECS Optimized AM`、`Elastic Beanstalk`

また、`RDS`は現段階でユーザーが対応することは無いようです。

今回`EC2`について対応の流れを紹介していきます。

## Amazon Linux
OSが`Amazon Linux`の場合、最新のAMI、又はカーネルをアップデートして再起動。
現在(2018年1月11日)アップデートされるカーネルは以下になります。
`Linux version 4.9.75-25.55.amzn1.x86_64`
https://alas.aws.amazon.com/ALAS-2018-939.html

```shell

#対象のインスタンスにログインする
$ ssh hoge-instance

$ sudo su -

# カーネルを確認
# uname -srv
Linux 4.4.5-15.26.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016
# 末尾のタイムスタンプはビルドされた日時を指している。

# カーネルをアップデートする
# yum update kernel -y
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                                                                                               | 2.1 kB     00:00
amzn-updates/latest                                                                                                                                                            | 2.5 kB     00:00
mackerel/latest/x86_64                                                                                                                                                         | 2.5 kB     00:00
mysql-connectors-community/x86_64                                                                                                                                              | 2.5 kB     00:00
mysql-tools-community/x86_64                                                                                                                                                   | 2.5 kB     00:00
mysql56-community/x86_64                                                                                                                                                       | 2.5 kB     00:00
8 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:4.9.75-25.55.amzn1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
======================================================================================================================================================================================================
 Package                                    Arch                                       Version                                                 Repository                                        Size
======================================================================================================================================================================================================
Installing:
 kernel                                     x86_64                                     4.9.75-25.55.amzn1                                      amzn-updates                                      18 M
 
Transaction Summary
======================================================================================================================================================================================================
Install  1 Package
 
Total download size: 18 M
Installed size: 72 M
Downloading packages:
kernel-4.9.75-25.55.amzn1.x86_64.rpm                                                                                                                                           |  18 MB     00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kernel-4.9.75-25.55.amzn1.x86_64                                                                                                                                                   1/1
 
  Verifying  : kernel-4.9.75-25.55.amzn1.x86_64                                                                                                                                                   1/1
 
Installed:
  kernel.x86_64 0:4.9.75-25.55.amzn1
 
Complete!
```
カーネルをアップデート後、awsのコンソール画面より再起動。
(再起動しないとカーネルが更新されない)

```
# 再起動後
# uname -srv
Linux 4.9.75-25.55.amzn1.x86_64 #1 SMP Fri Jan 5 23:50:27 UTC 2018
```
脆弱性対応されたカーネル(`Linux version 4.9.75-25.55.amzn1.x86_64`)になっていることを確認。
このバージョンがビルドされた日も1月5日と最新ですね。

### 上記のアップデート方法でカーネルのバージョンが上がらない場合
使用しているAMIのバージョンが古いためパッケージ指定のアップデートでは最新のカーネルにならない場合があります。
その場合は最新のAMIを使ってインスタンスを作り直すか、または`yum update`で全てのパッケージをアップデートすることで最新のカーネルにすることができます。

```
# 2014年に最終コミットされたAMI
$ cat /proc/version 
Linux version 3.14.20-20.44.amzn1.x86_64 (mockbuild@gobi-build-60001) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Mon Oct 6 22:52:46 UTC 2014

$ sudo su -
# 全てのパッケージをアップデート
# yum update

・・・
(再起動後)

# 最新のカーネルにアップデートされる
$ cat /proc/version 
Linux version 4.9.76-3.78.amzn1.x86_64 (mockbuild@gobi-build-60009) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Fri Jan 12 19:51:35 UTC 2018
```
全てのパッケージをアップデートすると現在動作中のプログラムに影響を与え、予期しないエラーが発生することがあります。
そのため、必ずアップデート前にマシーンイメージのバックアップを取ってから、検証しましょう。

そしてアップデートしたくないパッケージがある場合は、以下のように除外してからアップデートしましょう。

```
# yum update --exclude=php*
```

上記の方法でも最新のカーネルにアップデートされない場合は、以下の記事をお読みください。
[【CPUの脆弱性対応】古いAmazon Linuxのkernelを最新版にアップデートする](https://qiita.com/taketora/items/07b0a99d29c255a7ccf1)

### 問題の脆弱性に対応できているか確認する 
[Linuxが脆弱性「Spectre」「Meltdown」に対応済みか調べる方法](https://newsstand.google.com/articles/CAIiEP6lEr238oeYjKOHwQSG7PYqGQgEKhAIACoHCAow8cDwCjC_77oCMLqZpAM)の記事を参考に、アップデートされたカーネル(`Linux version 4.9.75-25.55.amzn1.x86_64`)で検査しまします。

```shell
Spectre and Meltdown mitigation detection tool v0.24

Checking for vulnerabilities against live running kernel Linux 4.9.75-25.55.amzn1.x86_64 #1 SMP Fri Jan 5 23:50:27 UTC 2018 x86_64

CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
* Checking count of LFENCE opcodes in kernel:  NO  (only 35 opcodes found, should be >= 70)
> STATUS:  VULNERABLE  (heuristic to be improved when official patches become available)

CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
* Mitigation 1
*   Hardware (CPU microcode) support for mitigation:  YES 
*   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):  YES 
* PTI enabled and active:  YES 
> STATUS:  NOT VULNERABLE  (PTI mitigates the vulnerability)

A false sense of security is worse than no security at all, see --disclaimer
```

AWSの[Processor Speculative Execution Research Disclosure](https://aws.amazon.com/jp/security/security-bulletins/AWS-2018-013/)に書いてあるように
確かにKPTIのバグ(Variant 3)は対処されていますが、CVE-2017-5754(不正なデータキャッシュ読み込み)の軽減策を改善するだけで、根本的に解決はできていないようです。

## Windows 8.1 又は Windows Server 2012 R2

OSが`Windows 8.1` 又は `Windows Server 2012 R2`の場合
[KB4056898](https://support.microsoft.com/en-us/help/4056898/windows-81-update-kb4056898)のセキュリティプログラムをインストールします。

手順は対象のwindowsインスタンスから[Microsoft®Update カタログ](http://www.catalog.update.microsoft.com/Search.aspx?q=KB4056898
)にアクセスし、対象のセキュリティプルグラムをインストール、再起動すれば完了です。

確認は、`「コントロールパネル」` > `「システムとセキュリティ」`　> `「Windows Update」` >`「更新の履歴」`
のタブを開き

```text
Windows 用セキュリティ更新プログラム (KB4056898)　インストール状態: 成功しました
```
となっていれば、対応完了です。

補足：更新プログラムしばらく更新していないマシンは、インストールに失敗する場合があるので、`「コントロールパネル」` > `「システムとセキュリティ」`　> `「Windows Update」` > `「更新プログラムを確認」` を開いて、プログラムを最新のものに更新して再起動してから、上記のセキュリティプログラムをインストールしましょう。

# ECSの対応
ECS(Amazon Elastic Container Service)では、`Amazon Linux`と同様に、ECS用の最新のAMI、又はカーネルをアップデートして、再起動を行えばOKです。(サービスで`Auto Scaling`の設定をしている場合は、対象のマシンを停止すれば勝手に新しいAMIで立ち上がります。)

https://aws.amazon.com/jp/security/security-bulletins/AWS-2018-013/
>ECS Optimized AMI
We have released Amazon ECS Optimized AMI version 2017.09.f which incorporates all Amazon Linux protections for this issue

`Amazon ECS`に最適化された最新の`AMI`は[こちらのページ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-optimized_AMI_launch_latest.html)に記載されおりに、
リージョンに沿ったAMIを使いましょう。

また、カーネルのアップデートは`docker`の`HOST`であるEC２のみでOKです。
`docker`でもイメージを使っているかと思いますが、dockerで使うカーネルは`HOST`のカーネルを使うようなので、`HOST`のカーネルだけアップデートすればOKです。

参考：[How to mitigate Meltdown in Docker images?](https://security.stackexchange.com/questions/176657/how-to-mitigate-meltdown-in-docker-images/176658#176658)

# 終わりに
今回の対応をとして完全に脆弱性が解決しているわけではないので、継続的に[Amazon Linux AMI Security Center](https://alas.aws.amazon.com/index.html)をチェックして、(RSS feed有り)最新のカーネルにアップデートし続けた方が良さそうです。

今回のCPUの脆弱性で多くのマシンを保守していると脆弱性の対応がとても大変だなと痛感しました。エンジニアとして、できるだけ自分達で保守するものが少なくなるように努めて行きたいなと思います。