Stefan Sperling <s...@elego.de> writes:

> This is quite a dangerous bug isn't it?
> Anyone relying on authz for confidentially would rightfully regard
> this as a security issue. I think we should fix the code.
> Most people have probably written their authz rules according to the
> book, so their authz rules may not work as expected.

Do they?  Perhaps they write them by trial-and-error, testing to see
if they get the behaviour they want.  In that case we will break authz
files that work.


> Can you test if the diff below fixes this?
>
> Index: subversion/libsvn_repos/authz.c
> ===================================================================
> --- subversion/libsvn_repos/authz.c   (revision 899439)
> +++ subversion/libsvn_repos/authz.c   (working copy)
> @@ -271,7 +271,7 @@ authz_parse_line(const char *name, const char *val
>    else
>      b->deny |= svn_authz_write;
>  
> -  return TRUE;
> +  return FALSE;
>  }

It doesn't appear to.  I wrote the following test to verify the
current behaviour, it continues to PASS with your patch.


Index: subversion/tests/cmdline/authz_tests.py
===================================================================
--- subversion/tests/cmdline/authz_tests.py     (revision 901125)
+++ subversion/tests/cmdline/authz_tests.py     (working copy)
@@ -903,6 +903,39 @@
                        root_url + '/A-copy/B/E/beta',
                        root_url + '/A-copy/C')
 
+
+def multiple_matches(sbox):
+  "multiple lines matching a user"
+
+  sbox.build(create_wc = False)
+  root_url = sbox.repo_url
+  write_restrictive_svnserve_conf(sbox.repo_dir)
+  if sbox.repo_url.startswith("http"):
+    expected_err = ".*[Ff]orbidden.*"
+  else:
+    expected_err = ".*svn: Authorization failed.*"
+
+  # Disable access and commit fails
+  write_authz_file(sbox, {'/': 'jrandom ='})
+  svntest.actions.run_and_verify_svn(None, None, expected_err,
+                                     'cp', '-m', 'fail copy',
+                                     root_url, root_url + '/fail')
+
+  # At present if multiple lines match the permissions of all the
+  # matching lines are amalgamated.  So jrandom gets access regardless
+  # of the line excluding access and regardless of the  order of the
+  # lines.  This might be a bug.
+
+  write_authz_file(sbox, {'/': 'jrandom =' + '\n' + '* = rw'})
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'first copy',
+                       root_url, root_url + '/first')
+
+  write_authz_file(sbox, {'/': '* = rw' + '\n' + 'jrandom ='})
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'second copy',
+                       root_url, root_url + '/second')
+
 ########################################################################
 # Run the tests
 
@@ -928,6 +961,7 @@
                          svntest.main.is_ra_type_file)),
               Skip(authz_access_required_at_repo_root,
                    svntest.main.is_ra_type_file),
+              Skip(multiple_matches, svntest.main.is_ra_type_file),
              ]
 
 if __name__ == '__main__':

-- 
Philip

Reply via email to