掰开揉碎,讲讲这个已存在近24年的CURL漏洞

2024-03-16 12:30

本文主要是介绍掰开揉碎,讲讲这个已存在近24年的CURL漏洞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

22cbb36cc1528b8282a942fe2aca702b.gif 聚焦源代码安全,网罗国内外最新资讯!

编译:代码卫士

这是一个与cookie、Internet代码和一个CVE有关的故事。故事发生在很久以前,所以搬好小板凳,仔细听好。当然,场景时候curl,它是与我工作有关的互联网传输工具和库。

1f43a4e00fdd4e0c23a5414b88e68548.gif

1998年

1998年,我们推出curl 4.9。在那个年代,少有人听说过或用过curl。距离curl 网站宣布某个新发布的下载量达到300次还有几个月的时间要过。当时,curl从头到尾都是非常小众的存在。

Curl 4.9是第一个具有 “cookie引擎“的发布。当时curl可接受HTTP cookie 并解析,了解这些cookie 并以正确的方式发回给随后的请求,就像浏览器那样。我当时负责的是管理cookie部分的curl代码。

1998年,与cookie如何运作有关的仅有标准是Netscape托管的一个非常简练的文档,名字叫cookie_spec。如有兴趣阅读该文档,可参见文末链接。这份文档实际上记录的并不是非常好,它省略了大量信息,你不得不通过查看其它客户端才能搞清楚。

我当时实现的 cookie 代码就是基于这份文档,浏览器当时似乎就是那样做的。该文档似乎适用于无数服务器实现。人们找到了该特性的良好用途。

4686f8b7332d888c53f69d157503b90b.gif

2000年代

这十年,IETF做出了一些努力创建了cookie标准,但均以失败告终。这些早期cookie标准的作者很可能认为自己可以创建标准,然后全世界就会魔法般地采用这些标准,但事实并非如此。Cookie 在某种程度上是特殊的:它们由如此多的作者、代码库和网站实现,以至于cookie的运作方式被从根本上来讲,以“上面命令“的方式改变了,它们的运作方式很困难,甚至可以说是不可能的。

7bf1d20fc416ca4e30e67f7cc7698c5b.gif

RFC 6265

最终,在2011年,cookie rfc 发布了!这次采用的是与上述方式相反的方法:它主要记录并澄清了cookie实际上是如何被使用的。

我当时也参与在内,提供了一些看法和观点。虽然我并非同意该标准中所述的一切,但相比于之前的状态来说,终于有了一个适当的标准是一个巨大的进步。

33bce40f26e8c1d4328f9ef4e8d3cf44.gif

双重语法

当时并未让我太担心但至此之后一直困扰我的一件事是该标准的编写方式:它提供了一个关于服务器应当如何发送cookie的字段语法,并提供了另外一个关于语法客户端应如何接受cookie的字段语法。

同样的cookie拥有两个语法。

这样做至少存在两个缺点:

1、标准难以阅读,我们很容易落入其中一个语法并假设它适用于自己的用例并意外获得错误的角色描述。

2、定义如何发送cookie的语法实际上并不十分相关,因为客户端才是决定是否应当接受和处理cookie的主体。现有的大量cookie解析器(浏览器)在如何接受方面都十分自由,因此没有人会注意到或者关心服务器是否没有遵信更加严格的标准中的语法。

ce03e55b47007ed42d4acf1fc43dd127.gif

RFC 6265bis

从几年前开始,IETF就一直在修订并更新2011年发布的cookie标准。事情发生了变化,而且一些cookie扩展已得到应用,因此应当被涵盖在标准中。如果我们执行当前管理cookie的代码,那么RFC的旧标准显然不够用,而它的更新版本就是6265bis。

Curl 是最新状态并钰 RFC6265bis 的初稿合规。

以上提及的双重语法问题仍然并未解决,不过当我最近分享关于该标准的选择和想法时遇到了不同寻常的坚决抵制。

我们可以发现,从根本上来讲,cookie的运作方式仍然和1998年时是一样的。当然有一些附加的细微差别和增补,但基本的原则并未改变。而且在cookie标准更新中也将一直如此。

Cookie的其中一个奇特之处在于,它不会像其它web特性那样在源上运作。

751f23bd8a84f71d15f7adecdc27b28e.gif

HTTP 请求隧道

虽然随着时间的流逝,cookie 已发生缓慢改变,但HTTP标准也得到更新并在几十年来更新数次,但可能更加重要的一点是,HTTP服务器实现执行了更加严格的解析策略,如果自由接受,那么很容易导致灾难。严重且反复发生的HTTP请求隧道/走私攻击已向我们证明了这一点。

为对抗此类攻击,并降低其它问题的风险。HTTP服务器开始提前拒绝那些看似“非法“或畸形的HTTP请求。在入门前就拦截阻止。具体而言,请求中的控制代码就是这么做的。当前,如果尝试向包含控制代码的新的HTTP服务器发送请求,那么很有可能该服务器将拒绝该请求并返回响应代码400。这里所说的”控制代码“是值在1到31(排除9)之间的字节。

广为人知的HTTP服务器Apache httpd 自2016年12月发布的2.4.25起,在默认情况下启用该行为。现代的nginx 版本似乎也会这么做,不过我并未调查确切的开始日期。

2a31a1ad23c816cfc10ece74bd037a78.gif

其它主机的cookie

要是今天才开始设计cookie,那么一定会和现在的样子不同。

设置cookie的网站将cookie 发送给客户端。网站会对所发送的cookie设置很多属性。具体而言,当cookie应当被客户端再次发回时,它回设置相匹配的参数。

为cookie设置的其中一个参数是需要匹配客户端发送cookie的域。名为 www.example.com的服务器可为整个 “example.com”域设置cookie,意味着该cookie 随后由客户端发送以及当访问 “second.example.com”时发送。服务器可为“姐妹“网站设置cookie!

5a3ccac1df51c9ebbec2745c51505b2c.gif

最终合二为一

1998年在curl中添加的cookie代码在所接受的内容方面十分自由。虽然多年来得到调整和优化,但该cookie代码仍然发挥着作用,而且和真实的网站兼容。

改动cookie代码的主要动力一直都是确保curl像cookie的其它代理一样以及能和这些代理在野互操作。

4e8b6efa366217c702c53b6227239e75.gif

CVE-2022-35252

2022年6月,我们收到了关于curl安全问题的漏洞报告,也就是后来的CVE-2022-35252。

结果证明,1998年的老旧cookie代码接受包含控制代码的cookie。这些控制代码可能是名称或内容的一部分还好,而如果用户启用了 “cookie 引擎“,则curl将存储这些cookie并将其发送给后续请求。

Curl愿意接受的cookie例子如下:

Set-Cookie: name^a=content^b; domain=.example.com

其中 “^a” 和 “^b” 代表的时控制代码、字节代码1和2。如上所述,由于该域名可为另外一个主机标记cookie,因此该cookie将被包含在该域所有主机的请求中。

当curl将这种cookie 发送给HTTP服务器时,会在出站请求中包括标头字段。

Cookie: name^a=content^b

6e0bc7faf445bd8a0d1880ea57943664.gif

400

默认配置的Apache httpd和其它服务器将返回400。对于接受这些cookie的脚本或应用程序而言,只要cookie还在继续发送,那么进一步的请求就会被拒绝,即造成拒绝服务。

875bd30846d5cd7fbcb03bfde25b8118.gif

标准是怎么说的?

RFC6265中关于客户端的部分即5.2节并不容易解释,而且搞清楚客户端应当摒弃具有控制cookie的cookie要求对文档进行深入研究。实际上,标准中并没有提到“控制代码”或该字节范围。我想我可能只是一个标准的糟糕读者。

0c1b092f804e8e732ed21dd5e4b0f458.gif

浏览器

由于热门浏览器的源代码轻松可获取,因此我们很容易知道它们在干什么。当然,结果我们发现 Chrome 和 Firefox 已经忽视了包含任意字节的进站cookie:

%01-%08 / %0b-%0c / %0e-%1f / %7f

该范围不包括 %09(TAB),%0a/%0d是行尾。

a5b48fe19d56da607bfea053d9110edd.gif

修复方案

Curl的修复方案并不十分了你个人惊讶,只是拒绝包含其中一种或更多被禁的字节值的cookie字段。由于这些字段并未被浏览器接受,因此任何合法网站将其用于任何良好目的的风险非常小,因此我认为这种更改几近零风险。

33fd11c44883ab282d4814c75d074993.gif

漏洞年龄

从4.9版本开始,curl中就已经存在这些易受攻击的代码,也就是说距离修复该漏洞的版本7.85.0已经过去了8729天(23.9年),也就是说我们在项目的第201天引入该漏洞,并在项目的第8930天将其修复。

当代码交付时并没有问题,在大量用户使用它时也并没有问题重重。然而,当 HTTP服务器怀疑是恶意的HTTP请求并拒绝时,问题就来了。因此,代码转变为拒绝服务差不多只是附带损害,是一个遗憾的副作用。

可能在RFC6265发布之时,这个漏洞就存在了。也有可能当第一个广为使用的HTTP服务器开始拒绝这些请求时,这个漏洞就存在了。

e7a26f92c7c7abafac01cbee8d994134.gif

项目记录

一个CVE漏洞在代码中存在了8729天可以说是一个新纪录。不过,它仍然在潜伏期超过8000天的CVE漏洞中排名第四。

最后,感谢Stefan Eissing 深挖Apache的历史详情,感谢Axel Chong提交了CVE-2022-35252提交的漏洞报告。

代码卫士试用地址:https://codesafe.qianxin.com

开源卫士试用地址:https://oss.qianxin.com


推荐阅读

严重的 iOS 漏洞可导致拒绝服务或任意代码执行,苹果已修复

【漏洞预警】Squid缓冲区溢出及拒绝服务漏洞安全预警通告

分析:BIND 服务在处理 DNAME 响应时存在拒绝服务漏洞(CVE-2016-8864)

BT修复拒绝服务协议漏洞

思科TelePresence出现严重漏洞:root访问权限及拒绝服务

原文链接

https://daniel.haxx.se/blog/2022/09/05/a-bug-that-was-23-years-old-or-not/#comments

题图:Pixabay License‍

本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

4fbe3da82592feb613486a605e085de3.jpeg

2cbbc50d7ec68fab519a08a978848ffd.jpeg

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

   96515e7894eae81d34979c1976ef217f.gif 觉得不错,就点个 “在看” 或 "赞” 吧~

这篇关于掰开揉碎,讲讲这个已存在近24年的CURL漏洞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815502

相关文章

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码,但由于defineClas

【A题成品论文已出】24数学建模国赛A题成品论文(附参考代码)免费分享

A 题  “板凳龙”  闹元宵 摘要 “板凳龙”是一种传统的民俗文化活动,通常由许多板凳连接成龙的形状进行表演。本文基于螺旋线和板凳龙的运动特性,建立数学模型来分析舞龙队在不同情况下的运动轨迹、调头路径和速度优化等问题。问题主要涉及板凳龙的行进路径、碰撞避免、调头空间的设计,以及如何优化龙头的速度,以确保龙身与龙尾的行进安全。 针对问题一,舞龙队由223节板凳组成,龙头前把手的速度为1

【Git 学习笔记_24】Git 使用冷门操作技巧(四)——更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1:只查看当前分支(git b)别名2:以图表形式显示自定义格式的 git 日志(git graph)别名3:查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表(git unmerged)别名4:查看 git 状态(git st)别名5:查看 git 简要状态(git s)别名6:查看最新版本的统计信息(git l1)别名7:查看最近 5 个版本的提

【vulhub】thinkphp5 2-rce 5.0.23-rce 5-rce 漏洞复现

2-rec 1.启动环境  cd /.../vulhub/thinkphp/2-rce # cd进入2-rce靶场文件环境下docker-compose up -d # docker-compose启动靶场docker ps -a # 查看开启的靶场信息 2.访问192.168.146.136:8080网页 3.构造payload http

LeetCode题练习与总结:存在重复元素Ⅱ--219

一、题目描述 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3输出:true 示例 2: 输入:nums = [1,0,1,1], k