[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1111733: trixie-pu: package rabbitmq-server/4.0.5-6+deb13u1 (CVE-2025-50200)



Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: rabbitmq-server@packages.debian.org
Control: affects -1 + src:rabbitmq-server
User: release.debian.org@packages.debian.org
Usertags: pu

Hi,

[ Reason ]
This is a fix for CVE-2025-50200:
https://bugs.debian.org/1108075

I'm sorry because I completely missed it. The CVE is about rabbitmq, in some
cases, logging a base64 version of a login token (ie: login:password). I
simply applied upstream patch.

[ Impact ]
Login token appears in the log (encoded as base64).

[ Tests ]
Tested that rabbitmq-server continues working. It does, but I didn't check
for the specific CVE.

[ Risks ]
I have to admit I don't understand a thing about Erlang, though the patch
seemed to be easy to backport (small patch, easy to understand where to
patch).

[ 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

Please allow me to upload rabbitmq-server 4.0.5-6+deb13u2 to Trixie pu.

Cheers,

Thomas Goirand (zigo)
diff -Nru rabbitmq-server-4.0.5/debian/changelog rabbitmq-server-4.0.5/debian/changelog
--- rabbitmq-server-4.0.5/debian/changelog	2025-08-11 14:31:10.000000000 +0200
+++ rabbitmq-server-4.0.5/debian/changelog	2025-08-21 16:06:08.000000000 +0200
@@ -1,3 +1,16 @@
+rabbitmq-server (4.0.5-6+deb13u2) trixie; urgency=medium
+
+  * CVE-2025-50200: In versions 3.13.7 and prior, RabbitMQ is logging
+    authorization headers in plaintext encoded in base64. When querying
+    RabbitMQ api with HTTP/s with basic authentication it creates logs with all
+    headers in request, including authorization headers which show base64
+    encoded username:password. This is easy to decode and afterwards could be
+    used to obtain control to the system depending on credentials.
+    Added upstream patch: Fix_Cowboy_crashes_caused_by_double_reply.patch.
+    (Closes: #1108075)
+
+ -- Thomas Goirand <zigo@debian.org>  Thu, 21 Aug 2025 16:06:08 +0200
+
 rabbitmq-server (4.0.5-6+deb13u1) trixie; urgency=medium
 
   * Fix rabbitmq-server broken plugin versions by applying patch from the BTS.
diff -Nru rabbitmq-server-4.0.5/debian/patches/CVE-2025-50200_Fix_Cowboy_crashes_caused_by_double_reply.patch rabbitmq-server-4.0.5/debian/patches/CVE-2025-50200_Fix_Cowboy_crashes_caused_by_double_reply.patch
--- rabbitmq-server-4.0.5/debian/patches/CVE-2025-50200_Fix_Cowboy_crashes_caused_by_double_reply.patch	1970-01-01 01:00:00.000000000 +0100
+++ rabbitmq-server-4.0.5/debian/patches/CVE-2025-50200_Fix_Cowboy_crashes_caused_by_double_reply.patch	2025-08-21 16:06:08.000000000 +0200
@@ -0,0 +1,166 @@
+Description: [PATCH] Fix Cowboy crashes caused by double reply
+ Issue introduced in 383ddb16341.
+Author: Loic Hoguin <loic.hoguin@broadcom.com>
+Date: Tue, 25 Mar 2025 12:33:00 +0100
+Origin: upstream, https://patch-diff.githubusercontent.com/raw/rabbitmq/rabbitmq-server/pull/13612.patch
+Last-Update: 2025-08-18
+
+Index: rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
+===================================================================
+--- rabbitmq-server.orig/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
++++ rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
+@@ -51,6 +51,8 @@
+ 
+ -export([disable_stats/1, enable_queue_totals/1]).
+ 
++-export([set_resp_not_found/2]).
++
+ -import(rabbit_misc, [pget/2]).
+ 
+ -include("rabbit_mgmt.hrl").
+@@ -1175,3 +1177,18 @@ catch_no_such_user_or_vhost(Fun, Replace
+ %% error is thrown when the request is out of range
+ sublist(List, S, L) when is_integer(L), L >= 0 ->
+     lists:sublist(lists:nthtail(S-1, List), L).
++
++-spec set_resp_not_found(binary(), cowboy_req:req()) -> cowboy_req:req().
++set_resp_not_found(NotFoundBin, ReqData) ->
++    ErrorMessage = case rabbit_mgmt_util:vhost(ReqData) of
++        not_found ->
++            <<"vhost_not_found">>;
++        _ ->
++            NotFoundBin
++    end,
++    ReqData1 = cowboy_req:set_resp_header(
++        <<"content-type">>, <<"application/json">>, ReqData),
++    cowboy_req:set_resp_body(rabbit_json:encode(#{
++        <<"error">> => <<"not_found">>,
++        <<"reason">> => ErrorMessage
++    }), ReqData1).
+Index: rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl
+===================================================================
+--- rabbitmq-server.orig/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl
++++ rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl
+@@ -29,11 +29,14 @@ allowed_methods(ReqData, Context) ->
+ content_types_provided(ReqData, Context) ->
+    {rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
+ 
+-resource_exists(ReqData, Context) ->
+-    {case rabbit_mgmt_wm_exchange:exchange(ReqData) of
+-         not_found -> raise_not_found(ReqData, Context);
+-         _         -> true
+-     end, ReqData, Context}.
++resource_exists(ReqData0, Context) ->
++    case rabbit_mgmt_wm_exchange:exchange(ReqData0) of
++        not_found ->
++            ReqData1 = rabbit_mgmt_util:set_resp_not_found(<<"exchange_not_found">>, ReqData0),
++            {false, ReqData1, Context};
++        _ ->
++            {true, ReqData0, Context}
++    end.
+ 
+ allow_missing_post(ReqData, Context) ->
+     {false, ReqData, Context}.
+@@ -104,18 +107,6 @@ bad({{coordinator_unavailable, _}, _}, R
+ is_authorized(ReqData, Context) ->
+     rabbit_mgmt_util:is_authorized_vhost(ReqData, Context).
+ 
+-raise_not_found(ReqData, Context) ->
+-    ErrorMessage = case rabbit_mgmt_util:vhost(ReqData) of
+-        not_found -> 
+-            "vhost_not_found";
+-        _ ->
+-            "exchange_not_found"
+-    end,
+-    rabbit_mgmt_util:not_found(
+-        rabbit_data_coercion:to_binary(ErrorMessage),
+-        ReqData,
+-        Context).
+-
+ %%--------------------------------------------------------------------
+ 
+ decode(Payload, <<"string">>) -> Payload;
+Index: rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl
+===================================================================
+--- rabbitmq-server.orig/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl
++++ rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl
+@@ -25,11 +25,14 @@ variances(Req, Context) ->
+ allowed_methods(ReqData, Context) ->
+     {[<<"POST">>, <<"OPTIONS">>], ReqData, Context}.
+ 
+-resource_exists(ReqData, Context) ->
+-    {case rabbit_mgmt_wm_queue:queue(ReqData) of
+-         not_found -> raise_not_found(ReqData, Context);
+-         _         -> true
+-     end, ReqData, Context}.
++resource_exists(ReqData0, Context) ->
++    case rabbit_mgmt_wm_queue:queue(ReqData0) of
++        not_found ->
++            ReqData1 = rabbit_mgmt_util:set_resp_not_found(<<"queue_not_found">>, ReqData0),
++            {false, ReqData1, Context};
++        _ ->
++            {true, ReqData0, Context}
++    end.
+ 
+ allow_missing_post(ReqData, Context) ->
+     {false, ReqData, Context}.
+@@ -54,17 +57,6 @@ do_it(ReqData0, Context) ->
+ is_authorized(ReqData, Context) ->
+     rabbit_mgmt_util:is_authorized_admin(ReqData, Context).
+ 
+-raise_not_found(ReqData, Context) ->
+-    ErrorMessage = case rabbit_mgmt_util:vhost(ReqData) of
+-        not_found -> 
+-            "vhost_not_found";
+-        _ ->
+-            "queue_not_found"
+-    end,
+-    rabbit_mgmt_util:not_found(
+-        rabbit_data_coercion:to_binary(ErrorMessage),
+-        ReqData,
+-        Context).
+ %%--------------------------------------------------------------------
+ 
+ action(Else, _Q, ReqData, Context) ->
+Index: rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl
+===================================================================
+--- rabbitmq-server.orig/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl
++++ rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl
+@@ -29,11 +29,14 @@ allowed_methods(ReqData, Context) ->
+ content_types_provided(ReqData, Context) ->
+    {rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
+ 
+-resource_exists(ReqData, Context) ->
+-    {case rabbit_mgmt_wm_queue:queue(ReqData) of
+-         not_found -> raise_not_found(ReqData, Context);
+-         _         -> true
+-     end, ReqData, Context}.
++resource_exists(ReqData0, Context) ->
++    case rabbit_mgmt_wm_queue:queue(ReqData0) of
++        not_found ->
++            ReqData1 = rabbit_mgmt_util:set_resp_not_found(<<"queue_not_found">>, ReqData0),
++            {false, ReqData1, Context};
++        _ ->
++            {true, ReqData0, Context}
++    end.
+ 
+ allow_missing_post(ReqData, Context) ->
+     {false, ReqData, Context}.
+@@ -152,17 +155,6 @@ basic_get(Ch, Q, AckMode, Enc, Trunc) ->
+ is_authorized(ReqData, Context) ->
+     rabbit_mgmt_util:is_authorized_vhost(ReqData, Context).
+ 
+-raise_not_found(ReqData, Context) ->
+-    ErrorMessage = case rabbit_mgmt_util:vhost(ReqData) of
+-        not_found -> 
+-            "vhost_not_found";
+-        _ ->
+-            "queue_not_found"
+-    end,
+-    rabbit_mgmt_util:not_found(
+-        rabbit_data_coercion:to_binary(ErrorMessage),
+-        ReqData,
+-        Context).
+ %%--------------------------------------------------------------------
+ 
+ maybe_truncate(Payload, none)                         -> Payload;
diff -Nru rabbitmq-server-4.0.5/debian/patches/series rabbitmq-server-4.0.5/debian/patches/series
--- rabbitmq-server-4.0.5/debian/patches/series	2025-08-11 14:31:10.000000000 +0200
+++ rabbitmq-server-4.0.5/debian/patches/series	2025-08-21 16:06:08.000000000 +0200
@@ -1,3 +1,4 @@
 lets-use-python3-not-python-binary.patch
 rabbitmq-dist.mk.patch
 elixir-1.18-compat.patch
+CVE-2025-50200_Fix_Cowboy_crashes_caused_by_double_reply.patch

Reply to: