Liferay CE 7.0.3 GA4 — 脆弱性リサーチ(RAPTOR Loop-Hunt)
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 を公開 → ポータルプロパティと がゲストに漏えい |
却下を含む厳選リスト全体: FINDINGS.md · 詳細レポート: REPORT.md
新規 vs. 既知 — CVE比較
先行知識として使用した既知のLiferay 7.0.x問題 約50件のカタログ: PRIOR-ART.md
(OSV [email protected]、NVDスイープ、Code White / CERT-EUアドバイザリ)
「新規」= 2026-07時点でOSV/NVD/Liferayアドバイザリに対応するCVEが見つからなかったもの; 発見は
CVE割り当てに提出されていない(製品ラインはEOLのため)。
GA4に存在を確認済みだがライブ再テストはしていない既知CVE
CVE-2020-15840(二重エンコードURLフィルター迂回)、CVE-2024-8980+CVE-2025-43748
(CSRF → スクリプトコンソールRCE)、CVE-2021-33335(会社管理者の乗っ取り — GA4は影響範囲の下限)、
CVE-2017-1000425(flash.jsp XSS)、CVE-2021-29040(詳細なJSONWSエラー)、
CVE-2022-41414 / CVE-2023-33949(列挙/登録のデフォルト)、CVE-2025-62261(平文のリセット
トークン — NVDは7.0.3 GA4を直接指定)。PRIOR-ART.md を参照。
プロセス(RAPTOR loop-hunt)
台帳: TRIED.md(試行したすべて。文書化済みの空振りスライス3件を含む)·
INVENTORY.md(カバレッジの分母)· 環境/フィクスチャ: ENV.md
Dockerでローカル再現する
公式の liferay/portal:7.0.3-ga4 イメージは存在しないため、公式バンドルからビルドします:
# Dockerfile
FROM openjdk:8-jdk
RUN apt-get update && apt-get install -y --no-install-recommends unzip curl \
&& rm -rf /var/lib/apt/lists/*
RUN curl -sSL -o /tmp/liferay.zip \
"https://downloads.sourceforge.net/project/lportal/Liferay%20Portal/7.0.3%20GA4/liferay-ce-portal-tomcat-7.0-ga4-20170613175008905.zip" \
&& unzip -q /tmp/liferay.zip -d /opt \
&& mv /opt/liferay-ce-portal-7.0-ga4 /opt/liferay \
&& rm /tmp/liferay.zip
EXPOSE 8080 11311
CMD ["/opt/liferay/tomcat-8.0.32/bin/catalina.sh", "run"]
docker build -t liferay-ga4 .
docker run -d --name liferay-ga4 -p 8080:8080 liferay-ga4
# first boot takes several minutes — wait for it:
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/)" = 200 ]; do sleep 10; done
その後、http://localhost:8080/ で初回セットアップウィザードを完了します(デフォルトのHSQL DB。ウィザードが
[email protected] の管理者パスワードを設定します)。
一括バリデータを実行
tools/liferay_ga4_check.py は単一ファイル・標準ライブラリのみのPython 3スクリプトです — 任意の
GA4インスタンスを指定すると、ライブ検証済みのすべての発見をテストします:
# passive validation of all findings (safe, no payloads detonated)
python3 tools/liferay_ga4_check.py http://localhost:8080
# with an account (self-registration is on by default) for the poller sink test
python3 tools/liferay_ga4_check.py http://localhost:8080 --user [email protected] --password '***'
# full RCE proof (opt-in): drops a SELF-DELETING JSP via the deserialization file-write
# gadget and fetches the command output; adjust --web-root to your install
python3 tools/liferay_ga4_check.py http://localhost:8080 --rce \
--web-root /opt/liferay/tomcat-8.0.32/webapps/ROOT
デフォルトのGA4インストールに対する期待出力: 9件がVULNERABLE(脆弱)(F-1、F-1+RCE、F-2、F-4、F-5*、F-8、F-11、F-12、F-13*)。
さらにF-10は非脆弱と確認(トンネルバリアは有効)。*F-5とF-13はフィクスチャパラメータが必要
(--leg-uuid/--version-id、--wcd-page/--group-id/--article-id)— --help 参照。
逆シリアライズガジェットはスクリプト内で純Pythonにより生成されます(本調査で使用したysoserial
AspectJWeaverペイロードとバイト単位で照合済み)— Java、jar、ysoserialは不要です。
堅牢と確認済み(他の結果を較正するための基準)
パスワードリセットチケット(128ビットUUID、単回使用、24時間)、チケットログイン時のセッション更新、
会社ごとの SecureRandom キーによるAES-128リメンバーミークッキー、デフォルトのPBKDF2ハッシュ、
ポータル全体のXMLスタック(デフォルトで外部エンティティ無効)、WebDAV/SharePointダイジェストゲート、
/api/axis|/api/liferay|/api/atom のlocalhost IPロック、アップロードパス検証、/combo /sprite
のトラバーサルガード、スクリプトコンソールとGogo Web UIのオムニアドミンゲート。
カバレッジの声明と制限
カバレッジは完全なインベントリに対してコンポーネント単位で追跡されました(TRIED.md)。
対象外: 4 GBツリー全体の関数単位の精査(Semgrepアンカーのみ)、
modules/apps のうち foundation/web-experience 以外の大半(ファイル単位の精査のみ)、F-2ガジェット研究、
非デフォルト設定でのライブテスト(F-9/F-14)、およびPDFBox 2.0.3依存関係CVEの到達可能性。
ループは枯渇したのではなく、レポート作成のために一時停止されました。