git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 0/9] bound upload-pack memory allocations

From
Jeff King <peff@peff.net>
Date
Feb 28, 2024, 22:37 UTC
Message-ID
<20240228223700.GA1157826@coredump.intra.peff.net>

Benjamin Flesch reported to the security list that a client can convince upload-pack to allocate arbitrary amounts of memory by sending a few repeated nonsense directives. Patches 1-6 here eliminate those spots. which roughly bounds the amount of memory that upload-pack will allocate to scale with the number of refs and objects in the repository. I also found a few spots where upload-pack is a little too eager to hold object contents in memory (so still bounded, but something like "all the trees" can get pretty big). That's patches 7-9.

We're not doing a coordinated disclosure or special release for this. Even after these patches, it's possible to get upload-pack to allocate quite a bit of memory, especially for a large repository. Not to mention that pack-objects may also allocate quite a bit to serve the pack itself. So while this is low-hanging fruit, a public-facing Git site probably still needs to have some kind of external tooling to kill hungry processes (even if it's just OOM-killing them so they don't hurt other clients).

There are a few unbounded parts of receive-pack (e.g., you can send an infinite number of refs to push). That may be something we want to put some configurable boundaries on, but I punted on it for this series. IMHO it is a lot less interesting since you'd usually have to authenticate to invoke receive-pack in the first place.

  [1/9]: upload-pack: drop separate v2 "haves" array
  [2/9]: upload-pack: switch deepen-not list to an oid_array
  [3/9]: upload-pack: use oidset for deepen_not list
  [4/9]: upload-pack: use a strmap for want-ref lines
  [5/9]: upload-pack: accept only a single packfile-uri line
  [6/9]: upload-pack: disallow object-info capability by default
  [7/9]: upload-pack: always turn off save_commit_buffer
  [8/9]: upload-pack: use PARSE_OBJECT_SKIP_HASH_CHECK in more places
  [9/9]: upload-pack: free tree buffers after parsing
 Documentation/config/transfer.txt |   4 +
 Documentation/gitprotocol-v2.txt  |   6 +-
 builtin/upload-pack.c             |   2 +
 object.c                          |  14 ++++
 object.h                          |   1 +
 revision.c                        |   3 +-
 serve.c                           |  14 +++-
 t/t5555-http-smart-common.sh      |   1 -
 t/t5701-git-serve.sh              |  24 +++++-
 upload-pack.c                     | 117 +++++++++++++-----------------
 10 files changed, 113 insertions(+), 73 deletions(-)
-Peff
Next: Jeff King
Message 1 of 17 in “bound upload-pack memory allocations”
  1. 0/9 bound upload-pack memory allocationsJeff King, Feb 28, 2024
  2. 1/9 upload-pack: drop separate v2 "haves" arrayJeff King, Feb 28, 2024
  3. 2/9 upload-pack: switch deepen-not list to an oid_arrayJeff King, Feb 28, 2024
  4. 3/9 upload-pack: use oidset for deepen_not listJeff King, Feb 28, 2024
  5. 4/9 upload-pack: use a strmap for want-ref linesJeff King, Feb 28, 2024
  6. 5/9 upload-pack: accept only a single packfile-uri lineJeff King, Feb 28, 2024
  7. 6/9 upload-pack: disallow object-info capability by defaultJeff King, Feb 28, 2024
  8. Patrick SteinhardtMar 4, 2024
  9. Jeff KingMar 4, 2024
  10. Taylor BlauApr 29, 2024
  11. 7/9 upload-pack: always turn off save_commit_bufferJeff King, Feb 28, 2024
  12. 8/9 upload-pack: use PARSE_OBJECT_SKIP_HASH_CHECK in more placesJeff King, Feb 28, 2024
  13. 9/9 upload-pack: free tree buffers after parsingJeff King, Feb 28, 2024
  14. Patrick SteinhardtMar 4, 2024
  15. Jeff KingMar 4, 2024
  16. Patrick SteinhardtMar 4, 2024
  17. Junio C HamanoFeb 28, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.