This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/main by this push:
     new ad9ce07e6 Remove sensitive headers from the mochiweb request in pdict
ad9ce07e6 is described below

commit ad9ce07e640522d7a0548d36e5570f5a31b391b4
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Wed Sep 13 14:51:54 2023 -0400

    Remove sensitive headers from the mochiweb request in pdict
    
    Previously we saved the request "as-is", mainly to inspect it later and see 
if
    the client socket stays open during long running requests. In case of a 
crash
    there is some chance the coordinator would dump its process dictionary to 
the
    logs. So it seems prudent to remove sensitive headers from it before saving 
it
    in the process dictionary.
---
 src/chttpd/src/chttpd_util.erl             | 14 +++++++++++++-
 src/chttpd/test/eunit/chttpd_util_test.erl | 21 +++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/chttpd/src/chttpd_util.erl b/src/chttpd/src/chttpd_util.erl
index 4dc590949..7e7338bd8 100644
--- a/src/chttpd/src/chttpd_util.erl
+++ b/src/chttpd/src/chttpd_util.erl
@@ -121,7 +121,19 @@ get_db_info(DbName) ->
     end.
 
 mochiweb_client_req_set(ClientReq) ->
-    put(?MOCHIWEB_CLIENT_REQ, ClientReq).
+    Method = mochiweb_request:get(method, ClientReq),
+    Socket = mochiweb_request:get(socket, ClientReq),
+    Path = mochiweb_request:get(raw_path, ClientReq),
+    Version = mochiweb_request:get(version, ClientReq),
+    Opts = mochiweb_request:get(opts, ClientReq),
+    Headers = mochiweb_request:get(headers, ClientReq),
+    % Remove any senstive info in case process dict gets dumped
+    % to the logs at some point
+    Headers1 = mochiweb_headers:delete_any("Authorization", Headers),
+    Headers2 = mochiweb_headers:delete_any("Cookie", Headers1),
+    Headers3 = mochiweb_headers:delete_any("X-Auth-CouchDB-Token", Headers2),
+    ClientReq1 = mochiweb_request:new(Socket, Opts, Method, Path, Version, 
Headers3),
+    put(?MOCHIWEB_CLIENT_REQ, ClientReq1).
 
 mochiweb_client_req_clean() ->
     erase(?MOCHIWEB_CLIENT_REQ).
diff --git a/src/chttpd/test/eunit/chttpd_util_test.erl 
b/src/chttpd/test/eunit/chttpd_util_test.erl
index fbfd532cc..1d692d623 100644
--- a/src/chttpd/test/eunit/chttpd_util_test.erl
+++ b/src/chttpd/test/eunit/chttpd_util_test.erl
@@ -121,6 +121,7 @@ chttpd_util_client_socker_monitor_test_() ->
         fun test_util:stop_couch/1,
         with([
             ?TDEF(t_client_req_set_get_clean),
+            ?TDEF(t_client_req_sensitive_headers_are_removed),
             ?TDEF(t_client_req_check_config),
             ?TDEF(t_closed_socket_kills_coordinator)
         ])
@@ -137,6 +138,26 @@ t_client_req_set_get_clean(_) ->
     ?assertEqual(undefined, chttpd_util:mochiweb_client_req_get()),
     gen_tcp:close(Sock).
 
+t_client_req_sensitive_headers_are_removed(_) ->
+    {ok, Sock} = gen_tcp:listen(0, [{active, false}]),
+    Headers = [
+        {"AutHoriZatioN", "Basic s3cr3t"},
+        {"COOkiE", "C00kie"},
+        {"x-AUth-CouchDB-TokeN", "S3cr3tT0k3n"},
+        {"other", "oth3r"}
+    ],
+    ClientReq = mochiweb:new_request({Sock, {'GET', "/foo", {1, 1}}, Headers}),
+    chttpd_util:mochiweb_client_req_set(ClientReq),
+    ResReq = chttpd_util:mochiweb_client_req_get(),
+    ?assertEqual(Sock, mochiweb_request:get(socket, ResReq)),
+    ?assertEqual('GET', mochiweb_request:get(method, ResReq)),
+    ?assertEqual([], mochiweb_request:get(opts, ResReq)),
+    ?assertEqual({1, 1}, mochiweb_request:get(version, ResReq)),
+    ?assertEqual("/foo", mochiweb_request:get(raw_path, ResReq)),
+    ResHeaders = mochiweb_request:get(headers, ResReq),
+    ?assertEqual([{"other", "oth3r"}], mochiweb_headers:to_list(ResHeaders)),
+    gen_tcp:close(Sock).
+
 t_client_req_check_config(_) ->
     config:set("chttpd", "disconnect_check_msec", "100", false),
     config:set("chttpd", "disconnect_check_jitter_msec", "50", false),

Reply via email to