flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection
CVE-2022-31150: Undici में CRLF injection
CVE-2022-31150 में अविश्वसनीय CR/LF, Undici request serialization तक पहुँच सकते थे। यहाँ upstream fix और upgrade उपाय हैं।
HTTP अनुरोध एक ऐसे फ़ॉर्म जैसा है जिसकी हर पंक्ति का तय अर्थ होता है। बिना जाँचे पाठ की नकल करने पर छिपा हुआ line break आगे के पाठ को नया फ़ील्ड बना सकता है। Undici का सुधार लिखने से पहले header value, method और path की जाँच करता है।
इस पेज के मुख्य शब्द
Undici- Node.js की HTTP/1.1 client library; built-in fetch के लिए Node.js इसमें Undici implementation भी शामिल करता है।
CRLF injection- अविश्वसनीय carriage-return और line-feed bytes protocol field में पहुँचकर पंक्तियों की सीमा बदल सकते हैं।
HTTP token- Header name और method जैसे protocol elements के लिए सीमित अक्षर-समूह।
Request target- HTTP अनुरोध में भेजा गया path और query; control characters इसकी संरचना नहीं बदलने चाहिए।
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-93
मूल कारण विश्लेषण (Root Cause)
सुधार से पहले Undici अविश्वसनीय इनपुट से आए अमान्य control characters वाले header values को HTTP अनुरोध में serialize कर सकता था। CR/LF पंक्तियों की सीमाएँ हैं; इन्हें स्वीकार करने से header पंक्तियाँ जोड़ी या बिगाड़ी जा सकती हैं। upstream patch header names को HTTP tokens के रूप में जाँचता है, values के अमान्य अक्षर अस्वीकार करता है, method token की जाँच करता है और path में control characters रोकता है। GitHub advisory पैकेज संस्करण 5.8.0 से पुराने बताती है; NVD विवरण 5.7.1 से पुराने बताता है। दोनों 5.8.0 को patched मानते हैं। यह client request injection है; SSRF या credentials का खुलासा अपने-आप नहीं होता, बल्कि application और network path पर निर्भर है।
हमले का चरण-दर-चरण प्रवाह
1. अविश्वसनीय मान
Application data, Undici के header, method या path तक पहुँचता है।
2. जाँच का अभाव
प्रभावित संस्करणों में अमान्य control characters request निर्माण तक पहुँच सकते थे।
3. Protocol सीमा
HTTP serialization पंक्ति सीमाओं पर निर्भर है; control characters स्वीकारने से fields जुड़ या बिगड़ सकते हैं।
4. सुधार और सीमांकन
Undici 5.8.0 serialization से पहले header bytes, method tokens और path characters जाँचता है; प्रभाव संदर्भ पर निर्भर है।
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
// a29a151 से पहले lib/core/request.js में संबंधित serialization sink
function serializeRequest(request, method, path, headers) {
request.method = method;
request.path = path;
for (const [key, value] of Object.entries(headers)) {
// serialization से पहले protocol characters की जाँच नहीं होती।
request.headers += `${key}: ${value}\r\n`;
}
}
// upstream request parser का hardened validation pattern
const token = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
const invalidFieldValue = /[^\t\x20-\x7e\x80-\xff]/;
const invalidPath = /[^\u0021-\u00ff]/;
function validateRequestTarget(method, path) {
if (!token.test(method)) throw new InvalidArgumentError('invalid request method');
if (invalidPath.test(path)) throw new InvalidArgumentError('invalid request path');
}
function processHeader(request, key, value) {
if (!token.test(key)) throw new InvalidArgumentError('invalid header key');
if (invalidFieldValue.test(value)) throw new InvalidArgumentError(`invalid ${key} header`);
request.headers += `${key}: ${value}\r\n`;
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓npm undici को संस्करण 5.8.0 या नए में अपडेट करें; built-in fetch के लिए समर्थित Node.js release में bundled Undici version जाँचें और Node.js patch करें।
- ✓अविश्वसनीय header values में अमान्य control characters अस्वीकार करें; उन्हें चुपचाप हटाकर अस्पष्ट input पर काम जारी न रखें।
- ✓कच्चा HTTP request text जोड़ने के बजाय Undici की structured request APIs उपयोग करें।
- ✓Control characters वाले header names/values, methods और paths पर regression tests जोड़ें; भेजने से पहले rejection सुनिश्चित करें।
- ✓यदि app user-controlled destinations स्वीकार करता है, तो अलग से destination allowlist और network egress policy लागू करें; यह defense-in-depth है, CVE का fix नहीं।
- ✓Lockfile और transitive dependencies जाँचें ताकि vulnerable Undici copies स्थापित न रहें।