Skip to content
  • Jeff King's avatar
    http: treat http-alternates like redirects · cb4d2d35
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    The previous commit made HTTP redirects more obvious and
    tightened up the default behavior. However, there's another
    way for a server to ask a git client to fetch arbitrary
    content: by having an http-alternates file (or a regular
    alternates file, which is used as a backup).
    
    Similar to the HTTP redirect case, a malicious server can
    claim to have refs pointing at object X, return a 404 when
    the client asks for X, but point to some other URL via
    http-alternates, which the client will transparently fetch.
    The end result is that it looks from the user's perspective
    like the objects came from the malicious server, as the
    other URL is not mentioned at all.
    
    Worse, because we feed the new URL to curl ourselves, the
    usual protocol restrictions do not kick in (neither curl's
    default of disallowing file://, nor the protocol
    whitelisting in f4113cac
    
     (http: limit redirection to
    protocol-whitelist, 2015-09-22).
    
    Let's apply the same rules here as we do for HTTP redirects.
    Namely:
    
      - unless http.followRedirects is set to "always", we will
        not follow remote redirects from http-alternates (or
        alternates) at all
    
      - set CURLOPT_PROTOCOLS alongside CURLOPT_REDIR_PROTOCOLS
        restrict ourselves to a known-safe set and respect any
        user-provided whitelist.
    
      - mention alternate object stores on stderr so that the
        user is aware another source of objects may be involved
    
    The first item may prove to be too restrictive. The most
    common use of alternates is to point to another path on the
    same server. While it's possible for a single-server
    redirect to be an attack, it takes a fairly obscure setup
    (victim and evil repository on the same host, host speaks
    dumb http, and evil repository has access to edit its own
    http-alternates file).
    
    So we could make the checks more specific, and only cover
    cross-server redirects. But that means parsing the URLs
    ourselves, rather than letting curl handle them. This patch
    goes for the simpler approach. Given that they are only used
    with dumb http, http-alternates are probably pretty rare.
    And there's an escape hatch: the user can allow redirects on
    a specific server by setting http.<url>.followRedirects to
    "always".
    
    Reported-by: Jann Horn (work account)'s avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    cb4d2d35