flawopen.com/Teardowns/cve-2024-26585-linux-tls-tx-work-close-race
CVE-2024-26585: Linux TLS बंद होने की दौड़
Linux kTLS में TX work queue होने से पहले sendmsg/recvmsg जाग सकता था। सुधार पहले work schedule करता है।
एक कामगार साझा कतार में आख़िरी काम डालने से पहले साथी से कहता है, “काम पूरा हुआ।” इस बीच साथी दुकान बंद करके कतार के काम रद्द कर सकता है; फिर कामगार बहुत देर से नया काम जोड़ता है। kernel का सुधार TLS transmit work को completion signal से पहले queue करता है।
इस पेज के मुख्य शब्द
kTLS- Linux kernel में TLS सुविधा, जो kernel के network path में TLS records संभालती है।
Async crypto completion- TLS की asynchronous encryption operation पूरी होने के बाद चलने वाला callback।
`complete()`- Linux completion primitive, जो operation पूरा होने की प्रतीक्षा कर रहे thread को जगाता है।
Delayed TX work- Queue किया गया kernel work जो encryption के बाद TLS record transmission जारी रखता है।
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-362
मूल कारण विश्लेषण (Root Cause)
net/tls/tls_sw.c में tls_encrypt_done() पहले रिकॉर्ड के लिए delayed TX work schedule करने से पहले प्रतीक्षारत sendmsg()/recvmsg() thread को complete() कर सकता था। जागा हुआ thread लौटकर socket बंद कर सकता है, जबकि callback अभी work queue करने वाला हो; इससे socket teardown और TX-work scheduling में race बनती है। upstream commit e01e3934a1b2 क्रम बदलता है: यदि रिकॉर्ड ctx->tx_list के आगे है, तो complete() से पहले ctx->tx_work schedule होता है। CVE सूचना race का वर्णन करती है; दिए गए स्रोत पुराने MSG_ZEROCOPY, मुक्त network pages, overwrite या refcount_inc_not_zero() fix के दावों की पुष्टि नहीं करते।
हमले का चरण-दर-चरण प्रवाह
1. TLS transmit शुरू
Process kTLS transmit path का उपयोग करता है; record encryption asynchronous रूप से पूरी हो सकती है।
2. Callback क्रम देखता है
tls_encrypt_done() जाँचता है कि पूरा हुआ record ctx->tx_list के आगे है या नहीं।
3. Wake और close में race
Patch से पहले callback complete() से thread को जगा सकता था और बाद में TX work queue करता था; बीच में thread socket बंद कर सकता था।
4. Patch handoff क्रम बदलता है
सुधार पहले delayed TX work queue करता है, फिर completion signal देता है; thread scheduling से पहले आगे नहीं बढ़ सकता।
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
// e01e3934a1b2 से पहले net/tls/tls_sw.c का संबंधित क्रम
bool ready = false;
if (rec == first_rec)
ready = true;
if (atomic_dec_and_test(&ctx->encrypt_pending))
complete(&ctx->async_wait.completion);
if (!ready)
return;
if (!test_and_set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
schedule_delayed_work(&ctx->tx_work.work, 1);
// e01e3934a1b2 के बाद net/tls/tls_sw.c का संबंधित क्रम
if (rec == first_rec) {
// काम जमा करने वाले thread को जगाने से पहले transmission work को queue में डालें।
if (!test_and_set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
schedule_delayed_work(&ctx->tx_work.work, 1);
}
if (atomic_dec_and_test(&ctx->encrypt_pending))
complete(&ctx->async_wait.completion);
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓
CVE-2024-26585backport वाले supported distribution kernel पर अपडेट करें; stable branches fixes backport कर सकती हैं, इसलिए vendor advisory जाँचें। - ✓Async callbacks की समीक्षा में, यदि जागा हुआ thread shared object बंद कर सकता है, तो completion signal से पहले अगला work queue करें।
- ✓Teardown में callback work को synchronize करके cancel या flush करें ताकि cancellation point के बाद callback नया work न queue कर सके।
- ✓Controlled concurrency regression test जोड़ें जो async TLS completion और socket close में race कराए और work-order की जाँच करे।
- ✓
MSG_ZEROCOPYया hardware crypto को इस CVE की शर्त न मानें; upstream विवरण async crypto completion और TX work scheduling पर केंद्रित है।