mirror of
https://git.yoctoproject.org/poky
synced 2026-03-06 23:39:40 +01:00
curl: CVE-2023-27534 SFTP path resolving discrepancy
Upstream-Status: Backport from 4e2b52b5f7
(From OE-Core rev: 7919a5a5eaa2689db9f0e8110b923bbfe0a610ab)
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
committed by
Steve Sakoman
parent
7fdc49e7ae
commit
762c35a049
122
meta/recipes-support/curl/curl/CVE-2023-27534.patch
Normal file
122
meta/recipes-support/curl/curl/CVE-2023-27534.patch
Normal file
@@ -0,0 +1,122 @@
|
||||
From 4e2b52b5f7a3bf50a0f1494155717b02cc1df6d6 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Thu, 9 Mar 2023 16:22:11 +0100
|
||||
Subject: [PATCH] curl_path: create the new path with dynbuf
|
||||
|
||||
CVE: CVE-2023-27534
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/4e2b52b5f7a3bf50a0f1494155717b02cc1df6d6]
|
||||
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
lib/curl_path.c | 71 ++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 35 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/lib/curl_path.c b/lib/curl_path.c
|
||||
index a1669d1..b9c470f 100644
|
||||
--- a/lib/curl_path.c
|
||||
+++ b/lib/curl_path.c
|
||||
@@ -30,66 +30,65 @@
|
||||
#include "escape.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
+#define MAX_SSHPATH_LEN 100000 /* arbitrary */
|
||||
+
|
||||
/* figure out the path to work with in this particular request */
|
||||
CURLcode Curl_getworkingpath(struct Curl_easy *data,
|
||||
char *homedir, /* when SFTP is used */
|
||||
char **path) /* returns the allocated
|
||||
real path to work with */
|
||||
{
|
||||
- char *real_path = NULL;
|
||||
char *working_path;
|
||||
size_t working_path_len;
|
||||
+ struct dynbuf npath;
|
||||
CURLcode result =
|
||||
Curl_urldecode(data->state.up.path, 0, &working_path,
|
||||
&working_path_len, REJECT_ZERO);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
+ /* new path to switch to in case we need to */
|
||||
+ Curl_dyn_init(&npath, MAX_SSHPATH_LEN);
|
||||
+
|
||||
/* Check for /~/, indicating relative to the user's home directory */
|
||||
- if(data->conn->handler->protocol & CURLPROTO_SCP) {
|
||||
- real_path = malloc(working_path_len + 1);
|
||||
- if(!real_path) {
|
||||
+ if((data->conn->handler->protocol & CURLPROTO_SCP) &&
|
||||
+ (working_path_len > 3) && (!memcmp(working_path, "/~/", 3))) {
|
||||
+ /* It is referenced to the home directory, so strip the leading '/~/' */
|
||||
+ if(Curl_dyn_addn(&npath, &working_path[3], working_path_len - 3)) {
|
||||
free(working_path);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
- if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
|
||||
- /* It is referenced to the home directory, so strip the leading '/~/' */
|
||||
- memcpy(real_path, working_path + 3, working_path_len - 2);
|
||||
- else
|
||||
- memcpy(real_path, working_path, 1 + working_path_len);
|
||||
}
|
||||
- else if(data->conn->handler->protocol & CURLPROTO_SFTP) {
|
||||
- if((working_path_len > 1) && (working_path[1] == '~')) {
|
||||
- size_t homelen = strlen(homedir);
|
||||
- real_path = malloc(homelen + working_path_len + 1);
|
||||
- if(!real_path) {
|
||||
- free(working_path);
|
||||
- return CURLE_OUT_OF_MEMORY;
|
||||
- }
|
||||
- /* It is referenced to the home directory, so strip the
|
||||
- leading '/' */
|
||||
- memcpy(real_path, homedir, homelen);
|
||||
- real_path[homelen] = '/';
|
||||
- real_path[homelen + 1] = '\0';
|
||||
- if(working_path_len > 3) {
|
||||
- memcpy(real_path + homelen + 1, working_path + 3,
|
||||
- 1 + working_path_len -3);
|
||||
- }
|
||||
+ else if((data->conn->handler->protocol & CURLPROTO_SFTP) &&
|
||||
+ (working_path_len > 2) && !memcmp(working_path, "/~/", 3)) {
|
||||
+ size_t len;
|
||||
+ const char *p;
|
||||
+ int copyfrom = 3;
|
||||
+ if(Curl_dyn_add(&npath, homedir)) {
|
||||
+ free(working_path);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
- else {
|
||||
- real_path = malloc(working_path_len + 1);
|
||||
- if(!real_path) {
|
||||
- free(working_path);
|
||||
- return CURLE_OUT_OF_MEMORY;
|
||||
- }
|
||||
- memcpy(real_path, working_path, 1 + working_path_len);
|
||||
+ /* Copy a separating '/' if homedir does not end with one */
|
||||
+ len = Curl_dyn_len(&npath);
|
||||
+ p = Curl_dyn_ptr(&npath);
|
||||
+ if(len && (p[len-1] != '/'))
|
||||
+ copyfrom = 2;
|
||||
+
|
||||
+ if(Curl_dyn_addn(&npath,
|
||||
+ &working_path[copyfrom], working_path_len - copyfrom)) {
|
||||
+ free(working_path);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
- free(working_path);
|
||||
+ if(Curl_dyn_len(&npath)) {
|
||||
+ free(working_path);
|
||||
|
||||
- /* store the pointer for the caller to receive */
|
||||
- *path = real_path;
|
||||
+ /* store the pointer for the caller to receive */
|
||||
+ *path = Curl_dyn_ptr(&npath);
|
||||
+ }
|
||||
+ else
|
||||
+ *path = working_path;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -41,6 +41,7 @@ SRC_URI = "https://curl.se/download/${BP}.tar.xz \
|
||||
file://CVE-2023-23914_5-5.patch \
|
||||
file://CVE-2023-23916.patch \
|
||||
file://CVE-2023-27533.patch \
|
||||
file://CVE-2023-27534.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "0aaa12d7bd04b0966254f2703ce80dd5c38dbbd76af0297d3d690cdce58a583c"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user