Description
- uvloop version: 0.21.0
- Python version: 3.12.6
- Platform:
uname_result(system='Linux', node='xxx', release='6.1.109', version='#1 SMP PREEMPT_DYNAMIC Thu Sep 19 22:28:35 UTC 2024', machine='x86_64')
- Can you reproduce the bug with
PYTHONASYNCIODEBUG
in env?: No - Does uvloop behave differently from vanilla asyncio? How?: Yes, see below
We encountered a very nasty data leakage bug with uvloop
. It is leaking responses to incorrect HTTP requests in a uvicorn
based server under a heavy load. This caused some users data to leak into requests of other users leading to a incorrect information exposure.
This issue is caused solely by uvloop
as removal of it fixed the issue. Relying on vanilla asyncio does not have the same issue.
The issue happened under high load situations. The service processes some 800 million requests per day but 100 requests in a day had the wrong responses from other concurrently happening requests. It seemed to happen in a situations when there is a higher load. Also the issue sometimes correlated with other issues we experienced with uvloop
:
- start_connection raises an IndexError when socket creation fails with uvloop aio-libs/aiohappyeyeballs#93
- unable to perform operation on <WriteUnixTransport closed=True reading=False 0x7f16825f8ba0 #506
Sometimes we observed these strange and bad looking RuntimeError
s coming from depths of uvloop
at about same time as we saw the incorrect responses coming from requests. But this did not happen always in correlation. (The above errors also got fixed by removal of uvloop
).
I haven't been able to reproduce this as it seems to only happen under heavy load situations and rarely enough (but still bad to leak information).
It seems uvloop
might have some major issues in its TCP/socket/stream implementation that it tries to some times use incorrect already used socket like the RuntimeErrors would hint. Not sure is it actually related to the data leakage issue.