
Liferay CE 7.0.3 GA4 のセキュリティ調査: 事前認証RCE(CVE-2020-7961 クラス)を root 権限でエンドツーエンドに再現。さらに16件の発見事項 — うち8件以上は既知のCVEなし。エージェント型ループハント: Docker 上で25個のジェネレータ、22個のジャッジ、9個のライブバリデータ。証跡と一括チェッカー付き。
RAPTOR loop-hunt手法で実施した、Liferay Portal CE 7.0.3 GA4(git tag 7.0.3-ga4、コミット b2d7cc68a)のセキュリティ監査: 決定論的リコン → 生ソースを読む25の隔離された生成エージェント → 生ソースから反駁する22の独立した判定エージェント → Docker上の実GA4インスタンスを攻撃する9のライブ検証エージェント。
見出し:
root権限での未認証RCEをエンドツーエンドで再現(CVE-2020-7961クラス)、さらにライブ検証済みの脆弱性8件 — うち複数は既知のCVEなし。
⚠️ 法的/倫理的: ここで扱うものはすべて自己ホストのテストインスタンスを対象としています。Liferay CE 7.0はサポート終了(EOL)(最終リリースは7.0.6 GA7、2018年)であり、これらの問題は上流で未パッチです。この資料は、所有しているシステム、または明示的にテストを許可されたシステムに対してのみ使用してください。
お探しのものはこれでしょう: https://github.com/dinosn/liferay-ga4-rce-research/blob/main/tools/liferay_ga4_check.py :)
ステータス: ✅ Docker GA4インスタンスに対してライブ検証済み · 🔬 コードで確認済み(独立した判定エージェントが生ソースから完全なトレースを再導出) · 🧪 要設定/設定ゲート付き
| ID | 発見 | 深刻度 | 認証 | ステータス | エビデンス |
|---|---|---|---|---|---|
| F-1 | JSONWS型オーバーライド → 任意クラスのインスタンス化+セッター → rootでのRCE(c3p0 HexAsciiSerializedMap → ObjectInputStream → AspectJWeaverファイル書き込み → JSP) | 重大 | 不要 | ✅ | verified/f1-jsonws-deser-rce.md |
| F-2 | /poller/* jabsorb javaClassヒント → 任意クラスのインスタンス化+フィールド注入、userId検証より前 | 高(潜在) | 任意アカウント(自己登録はデフォルト有効) | ✅ シンク確認 / RCEアーム未達 | verified/F-2-poller.md |
| F-4 | XML-RPC pingback.ping の検証前フェッチ → ブラインドSSRF+内部ポートオラクル(127.0.0.1:11311 のGogoシェルに到達) | 中 | 不要 | ✅ | verified/f4-xmlrpc-pingback-ssrf.md |
| F-5 | SyncDownloadServlet の versionId IDOR → 任意の DLファイルバージョンを読み取り(クロスサイト、配信オブジェクトにVIEWチェックなし) | 高 | 不要(ゲスト閲覧可能な「leg」経由) | ✅ | verified/F-5.md |
| F-6 | XSLテンプレートエンジンがサンドボックスを無視(secureProcessing=false、restricted は破棄)→ document() SSRF および XSLTC rt:exec によるコマンド実行 | 重大 | サイトテンプレート作成者 | ✅ | verified/F-6-F-7-template-engines.md |
| F-7 | Velocity および FreeMarkerの制限付きテンプレートが生の propsUtil / saxReaderUtil を公開 → ポータルプロパティと file:// がゲストに漏えい | 高 | テンプレート作成者 | ✅ | verified/F-6-F-7-template-engines.md |
| F-8 | /image/*?img_id=N による Image_ テーブルIDOR — トークンなし、プレフィックススコープのチェックはプレフィックス交換で迂回、連番IDが列挙可能 | 中 | 不要 | ✅ | verified/f-8-image-idor.md |
| F-11 | SimpleCaptcha = 4桁PIN、誤答でも無効化されず、ゲストカウンターも増加しない → 約5,000リクエストで突破 | 中 | 不要 | ✅ | verified/f11-f12-captcha-reminder.md |
| F-12 | パスワード忘れ: ユーザー列挙+リマインダー回答オラクル キャプチャなし(新規セッションで迂回); 空の回答により、シークレット知識ゼロのクエリ未設定アカウントに実際のリセットチケットが発行される | 中〜高 | 不要 | ✅ | verified/f11-f12-captcha-reminder.md |
| F-13 | Webコンテンツ表示のリクエストパラメータオーバーライド(groupId/articleId/ddmTemplateKey)→ ゲスト非公開記事のクロスサイト読み取り(journal.article.view.permission.check.enabled=false がデフォルト) | 高 | 不要(ゲストページにWCDが必要) | ✅ | verified/F-13-wcd-param-override.md |
| F-3 | OSGi axis-extenderがモジュールSOAPサービスのServiceAccessPolicy/リモートアクセス標識をスキップ | 中(WSDDモジュール利用時は高) | 不要 | 🔬 | judge/axis-spring-remoting.md |
| F-9 | OpenIDがアサーション検証より前に被害者アカウントを攻撃者のOpenIDにリンク → アカウント乗っ取り | 高 | 不要(OpenID有効時、非デフォルト) | 🔬 🧪 | judge/sso-autologin.md |
| F-10 | TunnelServlet readObject はクラスブラックリストのみで防御; ROME/JdbcRowSetImpl/c3p0/AspectJWeaverガジェットがクラスパス上に存在 | 重大(潜在) | 信頼されたピア(共有シークレット+許可ホスト) | ✅ 事前認証ではバリアが有効 | verified/f10-f20-tunnel-auth-pipeline.md |
| F-14 | TokenAutoLogin が素の SM_USER ヘッダーを信頼(検証なし、IP許可リストなし) | 中 | 不要(トークンSSO有効時、非デフォルト) | 🔬 🧪 | judge/sso-autologin.md |
| F-15 | サイト管理者のLARインポートが RolesAdminPortletDataHandler を混入 → 会社ロールの一括削除/権限ワイプ | 中 | サイト管理者 | 🔬 | judge/export-import-lar.md |
| F-16 | OpenSocial(デフォルトバンドルには含まれない): 事前認証の makeRequest SSRF、/gadgets/ifr オリジンJS、偽造可能なセキュリティトークン → なりすまし、保存型XSS | 高 ×4 | 不要 / サイトメンバー | 🔬(デプロイ形態依存) | judge/opensocial-shindig.md |
| F-17 | WSRP(デフォルトバンドルには含まれない): 事前認証の ProxyServlet SSRF; マークアップエンドポイント → 任意ポートレットの描画+レイアウト typeSettings の永続化 | 中 | 不要 | 🔬(デプロイ形態依存) | judge/wsrp.md |
却下を含む厳選リスト全体: FINDINGS.md · 詳細レポート: REPORT.md
先行知識として使用した既知のLiferay 7.0.x問題 約50件のカタログ: PRIOR-ART.md
(OSV [email protected]、NVDスイープ、Code White / CERT-EUアドバイザリ)
| 発見 | 既知CVE? | 関連性 |
|---|---|---|
| F-1 JSONWS逆シリアライズRCE | CVE-2020-7961(CISA KEV、実環境で悪用済み) | 再現+独立した再導出。 GA4で未パッチであることを確認; AspectJWeaverファイル書き込みガジェットで完全なチェーンを実証(公開PoCは通常JdbcRowSetImpl JNDIを使用) |
F-10 TunnelServlet readObject | CVE-2020-15842(クラス一致) | 既知クラス。 ブラックリストのみの逆シリアライズ防御を確認; 事前認証バリアはライブ検証済み(共有シークレット/許可ホストなしでは悪用不可) |
F-7 テンプレート propsUtil エスケープ | CVE-2020-13445(テンプレートインジェクション、FreeMarker/Velocity) | バリアント。 同じバグクラス(テンプレートAPIが機密オブジェクトを制限できない)だが、メカニズムは異なる: 制限コンテキストの内側で生の PropsImpl/saxReaderUtil オブジェクトが公開される |
| F-12(列挙の部分) | CVE-2021-33321(login.secure.forgot.password=false) | 既知の安全でないデフォルト — ライブで独立に確認 |
| F-12(オラクル+空回答リセットチケット) | 該当なし | 新規。 ステップ2で新しいJSESSIONIDによるキャプチャ迂回; 空の answer で、クエリ未設定のアカウントにシークレット知識ゼロで有効な24時間リセットチケットが作成される |
| F-11 SimpleCaptchaブルートフォース | 該当なし(CVE-2019-6588は別のキャプチャ問題 — XSS) | 新規。 4桁PIN+無効化なし+ゲストカウンター迂回 |
| F-2 poller jabsorb逆シリアライズ | 該当なし | 新規。 シンクはライブ確認; LiferaySerializer のフィールドインジェクションにより武器化は未達(研究継続中) |
| F-4 pingback SSRFオラクル | 該当なし | 新規。 |
F-5 sync versionId IDOR | 該当なし | 新規。 |
| F-6 XSLエンジンRCE | 該当なし(CVE-2020-13445はFreeMarker/Velocityのみを対象) | 新規。 XSLエンジンは従来のテンプレートインジェクション修正のすべての対象外だった |
F-8 Image_ IDOR | 該当なし | 新規。 |
| F-13 WCDクロスサイト読み取り | 該当なし | 新規。 根本原因は安全でないデフォルト(journal.article.view.permission.check.enabled=false)に加え、新しい配信経路(ポートレットのリクエストパラメータオーバーライド) |
| F-3 axis-extender SAP迂回 | 該当なし | 新規。 |
| F-9 OpenID検証前リンク | 該当なし | 新規。 |
F-14 SM_USER ヘッダー信頼 | 該当なし | 新規。 |
| F-15 LARロールデータハンドラー混入 | 該当なし | 新規。 |
| F-16 / F-17 OpenSocial / WSRP | 該当なし | 新規、ただしモジュールはデフォルトのGA4バンドルには含まれない(Liferay-Releng-Bundle: false) |
「新規」= 2026-07時点でOSV/NVD/Liferayアドバイザリに対応するCVEが見つからなかったもの; 発見は CVE割り当てに提出されていない(製品ラインはEOLのため)。