Skip to content
  • Junio C Hamano's avatar
    [PATCH] daemon.c and path.enter_repo(): revamp path validation. · d79374c7
    Junio C Hamano authored
    
    
    The whitelist of git-daemon is checked against return value from
    enter_repo(), and enter_repo() used to return the value obtained
    from getcwd() to avoid directory aliasing issues as discussed
    earier (mid October 2005).
    
    Unfortunately, it did not go well as we hoped.
    
    For example, /pub on a kernel.org public machine is a symlink to
    its real mountpoint, and it is understandable that the
    administrator does not want to adjust the whitelist every time
    /pub needs to point at a different partition for storage
    allcation or whatever reasons.  Being able to keep using
    /pub/scm as the whitelist is a desirable property.
    
    So this version of enter_repo() reports what it used to chdir()
    and validate, but does not use getcwd() to canonicalize the
    directory name.  When it sees a user relative path ~user/path,
    it internally resolves it to try chdir() there, but it still
    reports ~user/path (possibly after appending .git if allowed to
    do so, in which case it would report ~user/path.git).
    
    What this means is that if a whitelist wants to allow a user
    relative path, it needs to say "~" (for all users) or list user
    home directories like "~alice" "~bob".  And no, you cannot say
    /home if the advertised way to access user home directories are
    ~alice,~bob, etc.  The whole point of this is to avoid
    unnecessary aliasing issues.
    
    Anyway, because of this, daemon needs to do a bit more work to
    guard itself.  Namely, it needs to make sure that the accessor
    does not try to exploit its leading path match rule by inserting
    /../ in the middle or hanging /.. at the end.  I resurrected the
    belts and suspender paranoia code HPA did for this purpose.
    
    This check cannot be done in the enter_repo() unconditionally,
    because there are valid callers of enter_repo() that want to
    honor /../; authorized users coming over ssh to run send-pack
    and fetch-pack should be allowed to do so.
    
    Signed-off-by: default avatarJunio C Hamano <junkio@cox.net>
    d79374c7