On Fri, Nov 11, 2011 at 01:45:52PM -0000, Echlin, Jamie wrote: > Hi Stefan, > > > > Could short-circuit be implicated here? > > > > Yes. The trace shows that you're falling into the > > short-circuit code path. Try disabling the option to see if > > the problem persists. > > > > Which version of Subversion are you running on the server? > > 1.6.12, so within the range of versions affected. > > We could disable the option but as we don't know which repo is causing > it we'd have to do it on all, and this badly affects performance. > > I could not find the patch mentioned on the advisory, so it maybe that > we upgrade to 1.6.17 asap. >
Here's the 1.6.x patch, extracted from the revision log. You don't strictly need the parts that touch tests/cmdline/. ------------------------------------------------------------------------ r1130551 | cmpilato | 2011-06-02 15:52:49 +0200 (Thu, 02 Jun 2011) | 9 lines Merge from trunk r1130303. * r1130303 CVE-2011-1921 and CVE-2011-1783. Justification: Already released in 1.6.17. Votes: +3: cmpilato (I'm applying the "obvious fix" rule) Index: subversion/mod_dav_svn/authz.c =================================================================== --- subversion/mod_dav_svn/authz.c (revision 1130550) +++ subversion/mod_dav_svn/authz.c (revision 1130551) @@ -46,6 +46,11 @@ dav_svn__allow_read(request_rec *r, return TRUE; } + /* Sometimes we get paths that do not start with '/' and + hence below uri concatenation would lead to wrong uris .*/ + if (path && path[0] != '/') + path = apr_pstrcat(pool, "/", path, NULL); + /* If bypass is specified and authz has exported the provider. Otherwise, we fall through to the full version. This should be safer than allowing or disallowing all accesses if there is a Index: subversion/tests/cmdline/svnsync_tests.py =================================================================== --- subversion/tests/cmdline/svnsync_tests.py (revision 1130550) +++ subversion/tests/cmdline/svnsync_tests.py (revision 1130551) @@ -802,6 +802,66 @@ def descend_into_replace(sbox): run_test(sbox, "descend_into_replace.dump", subdir='/trunk/H', exp_dump_file_name = "descend_into_replace.expected.dump") +def specific_deny_authz(sbox): + "verify if specifically denied paths dont sync" + + sbox.build("specific-deny-authz") + + dest_sbox = sbox.clone_dependent() + build_repos(dest_sbox) + + svntest.actions.enable_revprop_changes(dest_sbox.repo_dir) + + run_init(dest_sbox.repo_url, sbox.repo_url) + + svntest.main.run_svn(None, "cp", + os.path.join(sbox.wc_dir, "A"), + os.path.join(sbox.wc_dir, "A_COPY") + ) + svntest.main.run_svn(None, "ci", "-mm", sbox.wc_dir) + + write_restrictive_svnserve_conf(sbox.repo_dir) + + # For mod_dav_svn's parent path setup we need per-repos permissions in + # the authz file... + if sbox.repo_url.startswith('http'): + svntest.main.file_write(sbox.authz_file, + "[specific-deny-authz:/]\n" + "* = r\n" + "\n" + "[specific-deny-authz:/A]\n" + "* = \n" + "\n" + "[specific-deny-authz:/A_COPY/B/lambda]\n" + "* = \n" + "\n" + "[specific-deny-authz-1:/]\n" + "* = rw\n") + # Otherwise we can just go with the permissions needed for the source + # repository. + else: + svntest.main.file_write(sbox.authz_file, + "[/]\n" + "* = r\n" + "\n" + "[/A]\n" + "* = \n" + "\n" + "[/A_COPY/B/lambda]\n" + "* = \n") + + run_sync(dest_sbox.repo_url) + + lambda_url = dest_sbox.repo_url + '/A_COPY/B/lambda' + + # this file should have been blocked by authz + svntest.actions.run_and_verify_svn(None, + [], svntest.verify.AnyOutput, + 'cat', + lambda_url) + + + ######################################################################## # Run the tests @@ -841,6 +901,7 @@ test_list = [ None, delete_svn_props, commit_a_copy_of_root, descend_into_replace, + Skip(specific_deny_authz, svntest.main.is_ra_type_file), ] if __name__ == '__main__': Index: subversion/libsvn_repos/authz.c =================================================================== --- subversion/libsvn_repos/authz.c (revision 1130550) +++ subversion/libsvn_repos/authz.c (revision 1130551) @@ -746,6 +746,9 @@ svn_repos_authz_check_access(svn_authz_t *authz, c return SVN_NO_ERROR; } + /* Sanity check. */ + SVN_ERR_ASSERT(path[0] == '/'); + /* Determine the granted access for the requested path. */ while (!authz_get_path_access(authz->cfg, repos_name, current_path, user, Index: . =================================================================== --- . (revision 1130550) +++ . (revision 1130551) Property changes on: . ___________________________________________________________________ Modified: svn:mergeinfo Merged /subversion/trunk:r1130303 ------------------------------------------------------------------------