@@ -19,6 +19,7 @@ all() ->
1919 ad_fill ,
2020 rfc4514_escape_value ,
2121 rfc4514_fill_dn ,
22+ dn_lookup_fallback_dn_escaping ,
2223 user_dn_pattern_gh_7161 ,
2324 format_different_types_of_ldap_attribute_values ,
2425 ldap_log_domain_routing ,
@@ -84,7 +85,7 @@ rfc4514_fill_dn(_Config) ->
8485 F = fun (Fmt , Args , Res ) ->
8586 ? assertEqual (Res , rabbit_ldap_rfc4514 :fill_dn (Fmt , Args ))
8687 end ,
87- % % DN injection prevented
88+ % % A comma in the substituted value is escaped
8889 F (" cn=${username},ou=People" , [{username , " user,ou=Evil" }],
8990 " cn=user\\ ,ou=Evil,ou=People" ),
9091 % % user_dn is NOT escaped (it is already a complete DN)
@@ -97,6 +98,36 @@ rfc4514_fill_dn(_Config) ->
9798 " cn=x\\ ,y,dc=b" ),
9899 ok .
99100
101+ dn_lookup_fallback_dn_escaping (_Config ) ->
102+ PrevPattern = application :get_env (rabbitmq_auth_backend_ldap , user_dn_pattern ),
103+ PrevLog = application :get_env (rabbitmq_auth_backend_ldap , log ),
104+ ok = application :set_env (rabbitmq_auth_backend_ldap , log , false ),
105+ ok = application :set_env (rabbitmq_auth_backend_ldap , user_dn_pattern ,
106+ " cn=${username},ou=People,dc=example,dc=com" ),
107+ try
108+ % % No DN-special characters: escaping is a no-op
109+ ? assertEqual (rabbit_auth_backend_ldap :fill_user_dn_pattern (" alice" ),
110+ rabbit_auth_backend_ldap :escaped_user_dn (" alice" )),
111+ ? assertEqual (" cn=alice,ou=People,dc=example,dc=com" ,
112+ rabbit_auth_backend_ldap :escaped_user_dn (" alice" )),
113+ % % A comma in the substituted value is escaped
114+ ? assertEqual (" cn=evil\\ ,ou=admins,ou=People,dc=example,dc=com" ,
115+ rabbit_auth_backend_ldap :escaped_user_dn (" evil,ou=admins" )),
116+ % % A binary username (the form used at runtime) is handled identically
117+ ? assertEqual (" cn=evil\\ ,ou=admins,ou=People,dc=example,dc=com" ,
118+ rabbit_auth_backend_ldap :escaped_user_dn (<<" evil,ou=admins" >>)),
119+ % % Bare fill leaves the substituted value unescaped
120+ ? assertEqual (" cn=evil,ou=admins,ou=People,dc=example,dc=com" ,
121+ rabbit_auth_backend_ldap :fill_user_dn_pattern (" evil,ou=admins" ))
122+ after
123+ restore_env (user_dn_pattern , PrevPattern ),
124+ restore_env (log , PrevLog )
125+ end ,
126+ ok .
127+
128+ restore_env (Key , {ok , V }) -> application :set_env (rabbitmq_auth_backend_ldap , Key , V );
129+ restore_env (Key , undefined ) -> application :unset_env (rabbitmq_auth_backend_ldap , Key ).
130+
100131ad_fill (_Config ) ->
101132 F = fun (Fmt , Args , Res ) ->
102133 ? assertEqual (Res , rabbit_auth_backend_ldap_util :fill (Fmt , Args ))
0 commit comments