[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [tor-bugs] #20081 [Core Tor/Tor]: potential memory corruption in or/buffers.c (not exploitable)



#20081: potential memory corruption in or/buffers.c  (not exploitable)
-------------------------------------------------+-------------------------
 Reporter:  asn                                  |          Owner:
     Type:  defect                               |         Status:
                                                 |  needs_review
 Priority:  Medium                               |      Milestone:  Tor:
                                                 |  0.2.9.x-final
Component:  Core Tor/Tor                         |        Version:
 Severity:  Normal                               |     Resolution:
 Keywords:  029-proposed, tor-bug-bounty,        |  Actual Points:
  review-group-9                                 |
Parent ID:                                       |         Points:  0.3
 Reviewer:                                       |        Sponsor:
-------------------------------------------------+-------------------------

Comment (by teor):

 I am happier with the second patch, but somewhat counter-intuitively, it
 limits the returned `sz` to `MAX_CHUNK_ALLOC << 1`, not `MAX_CHUNK_ALLOC`.

 `preferred_chunk_size(MAX_CHUNK_ALLOC)`:
 * passes both initial checks, and
 * passes `while (CHUNK_SIZE_WITH_ALLOC(sz) < target)` even when `sz` is
 `MAX_CHUNK_ALLOC`, because `CHUNK_SIZE_WITH_ALLOC(sz)` subtracts the chunk
 header offset.

 `preferred_chunk_size(CHUNK_SIZE_WITH_ALLOC(MAX_CHUNK_ALLOC))`:
 * actually produces a result of `MAX_CHUNK_ALLOC`, and is the highest
 value that does so.

 If we want to keep this behaviour, we should document it, but I'd prefer
 we fix it so that `MAX_CHUNK_ALLOC` really is the maximum allocated chunk
 size (or, perhaps, to avoid changing behaviour, make `MAX_CHUNK_ALLOC`
 equal to `65536 << 1`?). But either way, this is not a security issue.

 The first patch is not ideal: it would let the overflow happen, then
 abort, which is not undefined behaviour for unsigned types, but it's not
 best practice. (And it might cause various static analysis tools to
 complain, and also likely crash on `-fsanitize=unsigned-integer`, which is
 somewhat immaterial given we crash straight after anyway...)

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/20081#comment:6>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
_______________________________________________
tor-bugs mailing list
tor-bugs@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-bugs