• Show log

    Commit

  • Hash : 6cb9cd53
    Author : Patrick Steinhardt
    Date : 2018-11-14T12:04:42

    strntol: fix out-of-bounds reads when parsing numbers with leading sign
    
    When parsing a number, we accept a leading plus or minus sign to return
    a positive or negative number. When the parsed string has such a leading
    sign, we set up a flag indicating that the number is negative and
    advance the pointer to the next character in that string. This misses
    updating the number of bytes in the string, though, which is why the
    parser may later on do an out-of-bounds read.
    
    Fix the issue by correctly updating both the pointer and the number of
    remaining bytes. Furthermore, we need to check whether we actually have
    any bytes left after having advanced the pointer, as otherwise the
    auto-detection of the base may do an out-of-bonuds access. Add a test
    that detects the out-of-bound read.
    
    Note that this is not actually security critical. While there are a lot
    of places where the function is called, all of these places are guarded
    or irrelevant:
    
    - commit list: this operates on objects from the ODB, which are always
      NUL terminated any may thus not trigger the off-by-one OOB read.
    
    - config: the configuration is NUL terminated.
    
    - curl stream: user input is being parsed that is always NUL terminated
    
    - index: the index is read via `git_futils_readbuffer`, which always NUL
      terminates it.
    
    - loose objects: used to parse the length from the object's header. As
      we check previously that the buffer contains a NUL byte, this is safe.
    
    - rebase: this parses numbers from the rebase instruction sheet. As the
      rebase code uses `git_futils_readbuffer`, the buffer is always NUL
      terminated.
    
    - revparse: this parses a user provided buffer that is NUL terminated.
    
    - signature: this parser the header information of objects. As objects
      read from the ODB are always NUL terminated, this is a non-issue. The
      constructor `git_signature_from_buffer` does not accept a length
      parameter for the buffer, so the buffer needs to be NUL terminated, as
      well.
    
    - smart transport: the buffer that is parsed is NUL terminated
    
    - tree cache: this parses the tree cache from the index extension. The
      index itself is read via `git_futils_readbuffer`, which always NUL
      terminates it.
    
    - winhttp transport: user input is being parsed that is always NUL
      terminated
    

  • README.md

  • Writing Clar tests for libgit2

    For information on the Clar testing framework and a detailed introduction please visit:

    https://github.com/vmg/clar

    • Write your modules and tests. Use good, meaningful names.

    • Make sure you actually build the tests by setting:

        cmake -DBUILD_CLAR=ON build/
    • Test:

        ./build/libgit2_clar
    • Make sure everything is fine.

    • Send your pull request. That’s it.