- cURL प्रोजेक्ट ने पहले
strncpy() को हटाने के बाद, अब strcpy() को भी codebase में पूरी तरह प्रतिबंधित कर दिया है
strcpy() का API सरल है, लेकिन इसमें buffer size validation अलग हो जाने का जोखिम रहता है, इसलिए लंबी अवधि के maintenance में यह सुरक्षित नहीं माना जाता
- इसके बदले
curlx_strcopy() नाम का एक नया function जोड़ा गया है, जो destination buffer size और string length दोनों को argument के रूप में लेकर copy संभव है या नहीं, यह जांचने के बाद ही काम करता है
- यह function अंदरूनी तौर पर
memcpy() का उपयोग करता है और null terminator को संभालने की गारंटी भी देता है
- इस बदलाव से security और code consistency बेहतर होती है, और AI द्वारा गलत vulnerability reports बनाने की समस्या भी कम हो सकती है
strcpy हटाने की पृष्ठभूमि
- cURL पहले ही
strncpy() के सभी calls हटा चुका था, और इस function के कम सहज API, null termination की गारंटी न दे पाने, और अनावश्यक 0 padding जैसी समस्याओं की ओर इशारा किया था
- जहां partial string copy की जरूरत होती है, वहां
memcpy() का उपयोग करके null termination को अलग से संभालने के लिए बदलाव किया गया
strcpy() का API सरल है, लेकिन यह buffer size को स्पष्ट रूप से नहीं बताता, जिससे maintenance के दौरान validation code और copy call अलग हो जाने का जोखिम रहता है
- जब code को दशकों तक कई developers बदलते रहते हैं, तब buffer size validation निष्प्रभावी हो जाने की संभावना बनी रहती है
नया string copy function पेश किया गया
- इस जोखिम को रोकने के लिए
curlx_strcopy() नाम का एक replacement function जोड़ा गया
- यह destination buffer, buffer size, source buffer, और source string length को arguments के रूप में लेता है
- copy और null termination दोनों संभव होने पर ही
memcpy() से काम करता है
- विफल होने पर destination buffer को empty string से initialize कर देता है
- इस function में
strcpy() की तुलना में ज्यादा arguments और ज्यादा code चाहिए, लेकिन buffer validation को copy operation के साथ मजबूती से जोड़कर सुरक्षा सुनिश्चित की जाती है
- cURL codebase में
strcpy() के उपयोग को पूरी तरह प्रतिबंधित कर दिया गया है, ठीक strncpy() की तरह
implementation details
- function definition का उदाहरण इस प्रकार है
void curlx_strcopy(char *dest, size_t dsize, const char *src, size_t slen)
{
DEBUGASSERT(slen < dsize);
if(slen < dsize) {
memcpy(dest, src, slen);
dest[slen] = 0;
}
else if(dsize)
dest[0] = 0;
}
DEBUGASSERT के जरिए development के दौरान errors को जल्दी पकड़ा जाता है, और actual deployment environment में इसे हमेशा सफल होने के हिसाब से design किया गया है
strcpy की तरह इसमें return value नहीं है, और testing तथा fuzzing चरण में errors पकड़ने का तरीका अपनाया गया है
community reaction
- कुछ developers ने कहा कि यह
strcpy_s() (C11 Annex K) जैसा है, लेकिन cURL अभी भी C89 standard का उपयोग कर रहा है
- अन्य प्रतिक्रियाओं में return value जोड़ने की जरूरत या buffer failure के समय handling बेहतर करने के सुझाव भी आए
- इस पर cURL की ओर से कहा गया कि “यह function हमेशा सफल होने के लिए design किया गया है, इसलिए return value की जरूरत नहीं है”
AI से जुड़ा अतिरिक्त प्रभाव
- इस बदलाव से AI chatbots द्वारा cURL code में
strcpy के उपयोग को गलत तरीके से पहचानकर उसे ‘vulnerable’ बताने की समस्या रोकी जा सकती है
- हालांकि, लेखक ने यह भी कहा कि “AI आगे भी दूसरी झूठी reports बना सकता है,” और AI-आधारित code analysis की सीमाओं का जिक्र किया
अभी कोई टिप्पणी नहीं है.