:::danger

**v6.1.0～v7.0.15**に情報漏洩に繋がる重大なセキュリティ脆弱性が存在していた。これらのバージョンを使用している、または使用していたシステムは、直ちにv7.4.0以降へのアップグレードを実施すること。

**重要:** v6.1.0～v7.0.15を経由した(一度でもアップグレードしたことのある)システムは、v6.1.0～v7.0.15へのアップグレード時点以前に作成された履歴データが破損してしまう
:::

# 概要

GROWI v5.0.0からv7.0.20の間に、Revisionデータのマイグレーション処理に関する深刻なバグが存在していた。特にv6.1.0～v7.0.15では、**システム内の全Revisionが単一のページドキュメントに誤って紐付けられる**という致命的な問題が発生し、本来アクセス権限のないページの履歴データが閲覧可能になるという重大なセキュリティインシデントが発生する可能性があった。

v7.0.16 で、このバグを引き起こす根本原因が取り除かれた。

v7.0.21 で、このバグに対する安全対策が施された。

v7.4.0 で、このバグに対する追加の安全対策と改善が実施された。

# バージョン別影響サマリ

| バージョン       | セキュリティリスク | 症状                                          | データ状態           |
| ---------------- | ------------------ | --------------------------------------------- | -------------------- |
| v5.0.0～v6.0.15  | なし               | 最新リビジョンのみ表示                        | 安全                 |
| v6.1.0～v7.0.15  | **Critical**       | 全Revisionが単一ページに紐付け                | **破損（救済不可）** |
| v7.0.16～v7.0.20 | 経由歴による※      | スクリプトは修正済み                          | **経由歴による**     |
| v7.0.21～v7.3.x  | なし               | API側安全弁で保護                             | 安全                 |
| v7.4.0～         | なし               | 自動判定により、API側安全弁の過剰な作用を抑制 | 安全                 |

**注意:** **v6.1.0～v7.0.15は絶対に経由しないこと**。


# 対処方法

## アップグレードパスと対応

| アップグレードパス                           | 履歴データ                                                  | データ救済可否 |
| -------------------------------------------- | ----------------------------------------------------------- | -------------- |
| v7.0.16以降を新規インストール                | 全履歴表示                                                  | -              |
| v6.0.15以前 → v7.4以降                       | 全履歴表示                                                  | -              |
| **v6.1.0～v7.0.15経由 → v7.0.16以降**        | v6.1.0～v7.0.15アップグレード時点以前の履歴データが非表示に | **救済不可**   |
| v6.0.15以前 → v7.0.16～v7.3系経由 → v7.4以降 | v7.0.16～v7.3系アップグレード時点以前の履歴データが非表示に | **手動救済可** |

## v6.1.0～v7.0.15経由システムのリスク

**漏洩リスクのあった情報**

- privateページの機密情報
- 削除済みページの内容
- ページの作成者・更新者・更新内容

## 経由歴の確認方法

以下のMongoDBコマンドで`fixed-7549`の存在を確認：

```javascript
db.migrations.findOne({
  fileName: "20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js",
  appliedAt: {
    $date: "2025-09-09T14:14:37.381Z"
  }
})
```

**判定:**
- レコードが存在しない → v7.0.16～v7.3.xを経由していない（手動救済不要）
- レコードが存在する → 下記の注意を参照

:::warning
**`appliedAt`の日時だけでは、v6.1.0～v7.0.15を経由したかどうかを判定できない。**

`appliedAt`は「マイグレーションが実行された日時」であり、「どのバージョンのGROWIで実行されたか」は記録されていない。

例：
- 2024年10月にv6.3.0をインストール → `appliedAt`は2024年10月だが、**バグあり版**で適用（救済不可）
- 2024年10月にv7.1.0をインストール → `appliedAt`は2024年10月で、**修正済み版**で適用（手動救済可）

**確実な判定には、自分のGROWIのアップグレード履歴を確認すること。**
:::

## 過去履歴の手動救済方法

以下の条件を**すべて満たす**場合のみ、手動救済が可能：

1. v6.1.0～v7.0.15を**一度も経由していない**こと（自分のアップグレード履歴を確認）
2. v7.0.16～v7.3.xを経由しており、`fixed-7549`が存在すること

**手順:**

MongoDBで`appliedAt`を過去の日時に変更することで、フィルタを実質無効化できる：

```javascript
db.migrations.updateOne(
  { fileName: "20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js" },
  { $set: { appliedAt: new Date("1970-01-01T00:00:00Z") } }
)
```

**警告:** v6.1.0～v7.0.15を経由したシステムで実施するとセキュリティリスクが再発する。必ず経由歴を確認してから実施すること。

# 技術的詳細

## バグの原因

### v5.0.0～v6.0.15（履歴表示不具合）

マイグレーションスクリプトが`filter: { _id: page.revision }`により最新リビジョンのみを対象としていた。

### v6.1.0～v7.0.15（セキュリティ脆弱性）

bulkWriteに`strictQuery: false`を指定していなかったため、filterが機能せず全Revisionが単一ページに紐付けられた。

> Mongoose supports a separate `strictQuery` option to avoid strict mode for query filters. This is because empty query filters cause Mongoose to return all documents in the model, which can cause issues.
> — [Mongoose Documentation](https://mongoosejs.com/docs/6.x/docs/guide.html#strictQuery)

**脆弱性の存在期間:** 2023年4月（v6.1.0）～ 2024年7月31日（v7.0.16）、約1年4ヶ月

## マイグレーションスクリプトの変遷

migrate-mongoの仕様上、同名スクリプトは再適用されない。

| バージョン | スクリプト名 | 状態 |
|-----------|------------|------|
| v5.0～v6.0.15 | `20211227060705-revision-path-to-page-id-schema-migration.js` | 不完全 |
| v6.1.0～v7.0.15 | `...--fixed-7549.js` | **バグあり** |
| v7.0.16～v7.3.x | `...--fixed-7549.js`（同名） | 修正済み |
| v7.4.0～ | `...--fixed-8998.js`（リネーム） | 修正済み |

v7.4.0でスクリプト名が変更されたことにより：
- 新規インストールでは`--fixed-8998.js`のみが適用される
- 過去に`--fixed-7549.js`が適用されたシステムでは、そのレコードが残る
- この差異により、`appliedAt`フィルタの適用有無を自動判定できる

## v7.0.21の安全弁

API側で`appliedAt`（マイグレーション実行日時）より新しいRevisionのみを返すことで、破損データを非表示にした。

**トレードオフ:**
- セキュリティ問題を完全解決
- 正常なシステムでも`appliedAt`以前の過去履歴が非表示（手動救済可能）

## v7.4.0の改善

`fixed-7549`の存在有無で自動判定し、適切に処理を分岐。

**改善点:**
- セキュリティ問題を完全解決
- `fixed-7549`が存在しないシステムでは過去履歴が全表示
- 正規化処理のスキップによるパフォーマンス向上

**制限:**
- `fixed-7549`が存在するシステムでは、v6.1.0～v7.0.15を経由していなくても`appliedAt`フィルタが適用される
- この場合、`appliedAt`以前のRevisionを表示するには手動救済が必要

# 関連リンク

- [Issue #7549](https://github.com/weseek/growi/issues/7549): 履歴が見れなくなる問題の報告
- [Issue #8998](https://github.com/weseek/growi/issues/8998): 正規化処理の導入
- [PR #10620](https://github.com/growilabs/growi/pull/10620): v7.4.0での追加対策
- [v5.0.0のスクリプト](https://github.com/growilabs/growi/blob/v5.0.0/packages/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration.js)
- [v6.1.0のスクリプト](https://github.com/growilabs/growi/blob/v6.1.0/apps/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js)
- [v7.0.16のスクリプト](https://github.com/growilabs/growi/blob/v7.0.16/apps/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js)
- [v7.0.21のAPIコード](https://github.com/growilabs/growi/blob/v7.0.21/apps/app/src/server/routes/apiv3/revisions.js#L155-L172)
- [技術詳細ドキュメント](https://dev.growi.org/69301054963f68dfcf2b7111)


---

## Page Navigation

- Canonical URL: https://dev.growi.org/資料/内部仕様/v5.0.0～v7.0.15%20でのRevisionデータマイグレーションバグ
- Permalink: https://dev.growi.org/69301054963f68dfcf2b7111
- Parent: [内部仕様](/5cc1c93a973c65003eeca8c9.md)
- Children: 0 total
- Total descendants: 0
- Siblings: 48 total
  - [AWS・メーラー周りの改善](/5d02003202145d003e1babf6.md)
  - [Audit Log Bulk Export](/68b96f7fcde220ddd8dad822.md)
  - [ConfigManager](/5cc9975f30890b003fe90935.md)
  - [ElasticSearchのインデックスリビルド](/5e3ff13564387500480619a1.md)
  - [Elasticsearchから取得できるPagesに関するデータ](/614aad9c0043a10051e15701.md)
  - [EmojiPicker](/6333fb298e520dbb752dc0cd.md)
  - [EventEmitterの利用](/61391728d5f8360051fd4942.md)
  - [G2G Transfer](/6346a2e0e4791185c5e88285.md)
  - [GROWI Bot](/62a71cdfb1519362cc276234.md)
  - [HackMD連携](/5d27efd443f7f50048a78e0a.md)
  - [Handsontable統合メモ](/5cc99eac30890b003fe9093b.md)
  - [InAppNotificationにニュースを配信する](/69ab8eb7659066cd59ddb618.md)
  - [LDAPグループ同期](/646d5f73d184d74b40517c3e.md)
  - [Packagesのエラーハンドリングアーキテクチャ](/60e6727cf04bf00049b9d514.md)
  - [Page Bulk Export](/655834752aa37f82842a2034.md)
  - [PageOperation](/62010f2f16bc406c1b5e291b.md)
  - [SAML RoleとGrowiの権限の連携](/5d25e82feeb1f9003ee9b64c.md)
  - [SMTP設定に関する仕様](/5f4ef239cff9700048251c9a.md)
  - [SWR Utilities](/63735c96c29dff4657eb78ca.md)
  - [Sidebar](/5edacd0e3512890048ddc19f.md)
  - [Slack Command Handling](/60ee432f4a58890049d183cd.md)
  - [WebpackAssetsのHTMLへの注入](/5e3ee633ccdb6f0048e8c124.md)
  - [apiv3仕様](/5cf494d4aa8c91003eb0b481.md)
  - [audit-log](/62a1639c028badd4ac23f533.md)
  - [growi-database-plugin](/634784794b3568aa883bfca6.md)
  - [skipSSR](/64bf8e68a1e72e1b846d02fd.md)
  - [socket.io room 機能を使った通知設計](/6137540af2060f00510d56bb.md)
  - [お知らせ機能](/650d5e741647c0285cbb8a33.md)
  - [アンケート機能](/6385911e1632aa30f4dae6a4.md)
  - [インストールプロセス](/6009091dd3b38b00486b4ba5.md)
  - [インラインコメント機能](/650154e4a3498dcb94e91b36.md)
  - [ショートカットキー](/5cc1cb12973c65003eeca8cc.md)
  - [スケルトン表示ガイドライン](/62d7ca7fb18c4bec89d81a12.md)
  - [タグに関する仕様](/6171077c700078147672e3e0.md)
  - [ビルトインエディタでの同時多人数編集](/6524a63e46f2d6a2691e430a.md)
  - [ファイルアップロードのシーケンス図](/5fd8424f2271ae00481ed2e8.md)
  - [ファイルアップロード設定](/5f55a6af28951e0048d61398.md)
  - [プレゼンテーション](/63ea366fdc96eb0ef7657f53.md)
  - [ページ&ユーザーグループv5](/61b2cdd6aa330ce7d8152a4e.md)
  - [ページの子孫数](/62ac00a1c395c23b7a8c86dc.md)
  - [ページの移動・リネーム](/62149d019311629d4ecd91cf.md)
  - [ページ同時編集時のコンフリクト解消に関する仕様](/615d4a77c0ac5081f05d9d57.md)
  - [ログイン時の挙動](/63eee058c9d7133b414ba205.md)
  - [ワークフロー機能](/64e6b3d5e28cb1aa7ee4197f.md)
  - [検索v5](/61975a974027a1fa01947059.md)
  - [検索結果ページのコメント表示](/621caadad9a9f09266ad21c3.md)
  - [権限修正が可能なページのアラート](/626a263645af0b779a282145.md)
  - [空ページ](/62b2f5b3f442e6078d890a8b.md)
- Last updated: 2025-12-18T13:15:17.866Z by yuki
- Full page listing (all children regardless of count): https://dev.growi.org/_api/v3/page-listing/children?id=69301054963f68dfcf2b7111
