Package: release.debian.org Severity: normal Tags: trixie X-Debbugs-Cc: [email protected] Control: affects -1 + src:freerdp3 User: [email protected] Usertags: pu
[ Reason ] There's one more security fix from upstream, back-ported to the debian version of freerdp3 - CVE-2026-40254 - it is possible to escape specified path when sharing files through freerdp client. [ Tests ] The resulting binaries works, including transferring files the normal way. I haven't tried exploiting the bug to see if it's fixed, though. [ Risks ] This change, unlike the previous ones, is a low-risk change, because it's small and confined in the code which didn't change much in subsequent (after debian) upstream releases, and the fix is small too. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Other info ] In order for the actual patch to apply cleanly, I picked up another change in this area too, which is a warning fix. Thanks, /mjt diff -Nru freerdp3-3.15.0+dfsg/debian/changelog freerdp3-3.15.0+dfsg/debian/changelog --- freerdp3-3.15.0+dfsg/debian/changelog 2026-04-03 18:45:10.000000000 +0300 +++ freerdp3-3.15.0+dfsg/debian/changelog 2026-05-06 11:13:18.000000000 +0300 @@ -1,3 +1,15 @@ +freerdp3 (3.15.0+dfsg-2.1+deb13u3) trixie; urgency=medium + + * security fix from 3.25.0: + + CVE-2026-40254 off-by-one in the path traversal filter in + channels/drive/client/drive_file.c:contains_dotdot() + https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-3xpj-m4hx-8vmx + clang-warnings-fix-Wjump-misses-init.patch + channels-drive-refine-bounds-checks-CVE-2026-40254.patch + + -- Michael Tokarev <[email protected]> Wed, 06 May 2026 11:13:18 +0300 + freerdp3 (3.15.0+dfsg-2.1+deb13u2) trixie; urgency=medium * security fixes for client from 3.24.0 (medium): diff -Nru freerdp3-3.15.0+dfsg/debian/patches/channels-drive-refine-bounds-checks-CVE-2026-40254.patch freerdp3-3.15.0+dfsg/debian/patches/channels-drive-refine-bounds-checks-CVE-2026-40254.patch --- freerdp3-3.15.0+dfsg/debian/patches/channels-drive-refine-bounds-checks-CVE-2026-40254.patch 1970-01-01 03:00:00.000000000 +0300 +++ freerdp3-3.15.0+dfsg/debian/patches/channels-drive-refine-bounds-checks-CVE-2026-40254.patch 2026-05-06 11:04:05.000000000 +0300 @@ -0,0 +1,39 @@ +From: Armin Novak <[email protected]> +Date: Fri, 10 Apr 2026 08:45:55 +0200 +Subject: [channels,drive] refine bounds checks +Origin: upstream, https://github.com/FreeRDP/FreeRDP/commit/f502dbb8462597fbe5b97f890359dfdecb525bf7 +Forwarded: not-needed +Bug: https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-3xpj-m4hx-8vmx +Bug: https://security-tracker.debian.org/tracker/CVE-2026-40254 +Comment: context & nullptr fixups for 3.15 by mjt + +* better logging, fix wrong path component printed +* ensure path does not end with path/.. + +diff --git a/channels/drive/client/drive_file.c b/channels/drive/client/drive_file.c +--- a/channels/drive/client/drive_file.c ++++ b/channels/drive/client/drive_file.c +@@ -113,6 +113,8 @@ static BOOL contains_dotdot(const WCHAR* path, size_t base_length, size_t path_l + if ((tst[2] == '/') || (tst[2] == '\\')) + return TRUE; + } ++ else ++ return TRUE; + } + tst += 2; + } while (TRUE); +@@ -147,11 +149,10 @@ static WCHAR* drive_file_combine_fullpath(const WCHAR* base_path, const WCHAR* p + /* Ensure the path does not contain sequences like '..' */ + if (contains_dotdot(&fullpath[base_path_length], base_path_length, PathWCharLength)) + { +- char abuffer[MAX_PATH] = { 0 }; +- (void)ConvertWCharToUtf8(&fullpath[base_path_length], abuffer, ARRAYSIZE(abuffer)); +- ++ char* abuffer = ConvertWCharToUtf8Alloc(&fullpath[base_path_length], NULL); + WLog_WARN(TAG, "[rdpdr] received invalid file path '%s' from server, aborting!", +- &abuffer[base_path_length]); ++ abuffer); ++ free(abuffer); + goto fail; + } + } diff -Nru freerdp3-3.15.0+dfsg/debian/patches/clang-warnings-fix-Wjump-misses-init.patch freerdp3-3.15.0+dfsg/debian/patches/clang-warnings-fix-Wjump-misses-init.patch --- freerdp3-3.15.0+dfsg/debian/patches/clang-warnings-fix-Wjump-misses-init.patch 1970-01-01 03:00:00.000000000 +0300 +++ freerdp3-3.15.0+dfsg/debian/patches/clang-warnings-fix-Wjump-misses-init.patch 2026-05-06 11:04:05.000000000 +0300 @@ -0,0 +1,87 @@ +From: Armin Novak <[email protected]> +Date: Thu, 8 Jan 2026 10:32:29 +0100 +Subject: [clang,warnings] fix Wjump-misses-init +Origin: upstream, https://github.com/FreeRDP/FreeRDP/commit/15b0085ddfbb0e98ad189311fe9d652ea502adcc +Forwarded: not-needed +Comment: preparation for CVE-2026-40254 fix + +--- + channels/drive/client/drive_file.c | 50 ++++++++++++++++-------------- + 1 file changed, 27 insertions(+), 23 deletions(-) + +diff --git a/channels/drive/client/drive_file.c b/channels/drive/client/drive_file.c +--- a/channels/drive/client/drive_file.c ++++ b/channels/drive/client/drive_file.c +@@ -129,29 +129,31 @@ static WCHAR* drive_file_combine_fullpath(const WCHAR* base_path, const WCHAR* p + if (!base_path || (!path && (PathWCharLength > 0))) + goto fail; + +- const size_t base_path_length = _wcsnlen(base_path, MAX_PATH); +- const size_t length = base_path_length + PathWCharLength + 1; +- fullpath = (WCHAR*)calloc(length, sizeof(WCHAR)); ++ { ++ const size_t base_path_length = _wcsnlen(base_path, MAX_PATH); ++ const size_t length = base_path_length + PathWCharLength + 1; ++ fullpath = (WCHAR*)calloc(length, sizeof(WCHAR)); + +- if (!fullpath) +- goto fail; ++ if (!fullpath) ++ goto fail; + +- CopyMemory(fullpath, base_path, base_path_length * sizeof(WCHAR)); +- if (path) +- CopyMemory(&fullpath[base_path_length], path, PathWCharLength * sizeof(WCHAR)); ++ CopyMemory(fullpath, base_path, base_path_length * sizeof(WCHAR)); ++ if (path) ++ CopyMemory(&fullpath[base_path_length], path, PathWCharLength * sizeof(WCHAR)); + +- if (!drive_file_fix_path(fullpath, length)) +- goto fail; ++ if (!drive_file_fix_path(fullpath, length)) ++ goto fail; + +- /* Ensure the path does not contain sequences like '..' */ +- if (contains_dotdot(&fullpath[base_path_length], base_path_length, PathWCharLength)) +- { +- char abuffer[MAX_PATH] = { 0 }; +- (void)ConvertWCharToUtf8(&fullpath[base_path_length], abuffer, ARRAYSIZE(abuffer)); ++ /* Ensure the path does not contain sequences like '..' */ ++ if (contains_dotdot(&fullpath[base_path_length], base_path_length, PathWCharLength)) ++ { ++ char abuffer[MAX_PATH] = { 0 }; ++ (void)ConvertWCharToUtf8(&fullpath[base_path_length], abuffer, ARRAYSIZE(abuffer)); + +- WLog_WARN(TAG, "[rdpdr] received invalid file path '%s' from server, aborting!", +- &abuffer[base_path_length]); +- goto fail; ++ WLog_WARN(TAG, "[rdpdr] received invalid file path '%s' from server, aborting!", ++ &abuffer[base_path_length]); ++ goto fail; ++ } + } + + ok = TRUE; +@@ -617,12 +619,14 @@ BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, w + + /* If we failed before (i.e. if information for a drive is queried) fall back to + * GetFileAttributesExW */ +- WIN32_FILE_ATTRIBUTE_DATA fileAttributes = { 0 }; +- if (!GetFileAttributesExW(file->fullpath, GetFileExInfoStandard, &fileAttributes)) +- goto out_fail; ++ { ++ WIN32_FILE_ATTRIBUTE_DATA fileAttributes = { 0 }; ++ if (!GetFileAttributesExW(file->fullpath, GetFileExInfoStandard, &fileAttributes)) ++ goto out_fail; + +- if (!drive_file_query_from_attributes(file, &fileAttributes, FsInformationClass, output)) +- goto out_fail; ++ if (!drive_file_query_from_attributes(file, &fileAttributes, FsInformationClass, output)) ++ goto out_fail; ++ } + + return TRUE; + out_fail: +-- +2.47.3 + diff -Nru freerdp3-3.15.0+dfsg/debian/patches/series freerdp3-3.15.0+dfsg/debian/patches/series --- freerdp3-3.15.0+dfsg/debian/patches/series 2026-04-03 18:45:10.000000000 +0300 +++ freerdp3-3.15.0+dfsg/debian/patches/series 2026-05-06 11:04:05.000000000 +0300 @@ -100,3 +100,6 @@ codec-h264-update-H264_CONTEXT-width-height-after-al-CVE-2026-33986.patch cache-persistent-update-PERSISTENT_CACHE_ENTRY-size--CVE-2026-33987.patch cache-persist-use-winpr_aligned_calloc-CVE-2026-33982.patch +# 3.25.0: +clang-warnings-fix-Wjump-misses-init.patch +channels-drive-refine-bounds-checks-CVE-2026-40254.patch

