Concrete CMS 脆弱性対策 (head のバージョン番号を非表示にする方法等)


ソフトウエアを使う上でバグ修正やセキュリティ対策は永遠の課題です。

Concrete CMS に限らず CMS では、バージョン番号を表示している箇所がいくつかあります。特に使用中のバージョンが古くて脆弱性が含まれている場合、「このサイトは脆弱性があります。攻撃して下さい」と言っているようなものです。

一番の解決策は、Concrete CMS を最新に保っていること。

ただ、どうしても古いバージョンを使い続けないといけない場合もあります。そんな時は、修正パッチを当て使用中のバージョンを隠すことをお勧めします。

# concrete5 を最新版にアップデートする

concrete5 を常に最新版にバージョンアップするように心がけましょう。

## アップグレード方法

concrete5.6.x 以前
https://concrete5-japan.org/help/5-6/install/how_to_upgrade/

concrete5.7.0 以降
https://concrete5-japan.org/help/5-7/developer/installation/upgrading-concrete5/


アップデートを行った後は「update」からファイルを移動させます。


## 「update」フォルダに Concrete CMS 最新版がある場合

Concrete CMS のアップデート方法は複数用意されています。その中で一番簡単なのが、管理画面から行う方法。大元の `concrete` フォルダを全く書き換えず、`updates`フォルダ内に concrete5 の最新版をダウンロードする方法です。

ただし、その「update」フォルダの中には concrete5 各バージョンの番号がフォルダ名として記載されてしまい、ソースコードを見ると、バージョン番号が分かってしまいます。

バージョンアップが成功して落ち着いた時ぐらいに `update` から引っ越ししましょう。

`update` フォルダ内の最新版の `concrete` フォルダをルートの `concrete` と入れ替え、config/update.php ファイルを無効化します。


1. `/update/concrete5-8.x.x-update/concrete` の「concrete」フォルダを探す
2. その `concrete` フォルダを `concrete_new` というフォルダ名などで、ルートにコピー
3. 元の `concrete` フォルダを `concrete_old` という名前などに変更
4. `concrete_new` フォルダを `concrete` に変更
5. config ファイルの update.php を update.php.bak などに変更
    - concrete5.6.x 以前は `/config/update.php`
    - concrete5.7.x 以降は `/application/config/update.php`

です。


# Concrete CMS を最新版にアップデートできない場合

Concrete CMS を最新版にアップデートできない場合、脆弱性部分のパッチを当て、バージョン番号を公開しないようにしましょう。



## STEP1: 脆弱性のパッチを当てる

Concrete CMS の Git には、いままでの変更履歴が記載されています。

Concrete CMS は、脆弱性報告サービスである [HackerOne](https://hackerone.com/concrete5/hacktivity?sort_type=latest_disclosable_activity_at&filter=type%3Apublic&page=1&range=forever) を利用しています。

世界中の前にあるハッカーから脆弱性の報告を受付ています。

報告を受けると修正パッチが作成されます。修正パッチが次期リリースに取り込まれます。そのバージョンがリリースされた際に脆弱性情報が公開されます。

[HackerOneのこちらのページ](https://hackerone.com/concrete5/hacktivity?sort_type=latest_disclosable_activity_at&filter=type%3Apublic&page=1&range=forever) で [どの concrete5 の Git レポジトリ](https://github.com/concrete5/concrete5) が修正パッチとしてリリースされているかのコメントが会ったりします。

[concrete5 のリリースノート](https://concrete5-japan.org/help/5-7/developer/background/version-history/)でも掲載されています。

使用中の concrete5 バージョンから順番にリリースノートを読んでいき、脆弱性の更新があったようなコミットを見つけていきます。

- [concrete5.7.x 以前のレポジトリはこちら](https://github.com/concrete5/concrete5-legacy)
- [concrete5.6.x 以前のレポジトリはこちら](https://github.com/concrete5/concrete5-legacy)

各コミットの DIFF (差分) を取得し、concrete5 のコアファイルに適用します。
からなず事前テストとしてテストサイトを作ってそちらでテストを行ってから本番適用して下さい。



## STEP2: バージョン番号を隠す

concrete5 では、普段

```
<meta name="generator" content="concrete5 - 8.3.2" />
```

といったバージョン番号をソースコードに表示しています。

設定ファイルを変えることで、

```
<meta name="generator" content="concrete5" />
```

にすることができます。

### concrete5.6.x の方法

/config/site.php を開きます。

下記の1文をファイルの一番最後に追加して下さい。

```
define('APP_VERSION_DISPLAY_IN_HEADER', false);
```

### concrete5.7.x 以降の方法

/application/config/concrete.php

を作成 or 開き、下記の表記を加えます。


```
return array(
    'misc' => array(
        'app_version_display_in_header' => false,
    ),
);
```

もし、既に何か加えられている場合は、適度にそれらを消さないように調整し下さい。


### concrete5 8 以降の方法

Version 8 以降は、PHP のバージョンアップで `array()` という記述を `[]` で記入できるようになったため、記述方法が少し違いますが、基本的に 5.7 と同じ場所の設定ファイルを使います。

/application/config/concrete.php


また 5.7 時代の表記も引き続き使用できます。

```
return [
    'misc'              => [
        'app_version_display_in_header' => false,
    ],
];

```

5.7 のときと同じく、既に何か加えられている場合は、適度にそれらを消さないように調整し下さい。