FlawOpen

flawopen.com/Teardowns/cve-2024-26585-linux-tls-tx-work-close-race

● CVE-2024-26585 · CVSS 4.7 · मध्यम
सुरक्षा अनुसंधान · FlawOpen

CVE-2024-26585: Linux TLS बंद होने की दौड़

Linux kTLS में TX work queue होने से पहले sendmsg/recvmsg जाग सकता था। सुधार पहले work schedule करता है।

💡 आसान भाषा में (ELI5)

एक कामगार साझा कतार में आख़िरी काम डालने से पहले साथी से कहता है, “काम पूरा हुआ।” इस बीच साथी दुकान बंद करके कतार के काम रद्द कर सकता है; फिर कामगार बहुत देर से नया काम जोड़ता है। 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

1. TLS transmit शुरू

Process kTLS transmit path का उपयोग करता है; record encryption asynchronous रूप से पूरी हो सकती है।

चरण 2

2. Callback क्रम देखता है

tls_encrypt_done() जाँचता है कि पूरा हुआ record ctx->tx_list के आगे है या नहीं।

चरण 3

3. Wake और close में race

Patch से पहले callback complete() से thread को जगा सकता था और बाद में TX work queue करता था; बीच में thread socket बंद कर सकता था।

चरण 4

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);

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत