security fix: --restrict-to-path must not accept pathes with same name prefix

bug: --restrict-to-path /foo  erroneously allowed  /foobar.
even worse: --restrict-to-path /foo/  erroneously allowed  /foobar.
This commit is contained in:
Thomas Waldmann 2016-08-02 15:50:21 +02:00
parent 28cbf24815
commit dde18d6a76

View file

@ -120,8 +120,13 @@ class RepositoryServer: # pragma: no cover
path = path[1:]
path = os.path.realpath(os.path.expanduser(path))
if self.restrict_to_paths:
# if --restrict-to-path P is given, we make sure that we only operate in/below path P.
# for the prefix check, it is important that the compared pathes both have trailing slashes,
# so that a path /foobar will NOT be accepted with --restrict-to-path /foo option.
path_with_sep = os.path.join(path, '') # make sure there is a trailing slash (os.sep)
for restrict_to_path in self.restrict_to_paths:
if path.startswith(os.path.realpath(restrict_to_path)):
restrict_to_path_with_sep = os.path.join(os.path.realpath(restrict_to_path), '') # trailing slash
if path_with_sep.startswith(restrict_to_path_with_sep):
break
else:
raise PathNotAllowed(path)