FlawOpen

flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection

● CVE-2022-31150 · CVSS 5.3 · मध्यम
सुरक्षा अनुसंधान · FlawOpen

CVE-2022-31150: Undici में CRLF injection

CVE-2022-31150 में अविश्वसनीय CR/LF, Undici request serialization तक पहुँच सकते थे। यहाँ upstream fix और upgrade उपाय हैं।

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

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

1. अविश्वसनीय मान

Application data, Undici के header, method या path तक पहुँचता है।

चरण 2

2. जाँच का अभाव

प्रभावित संस्करणों में अमान्य control characters request निर्माण तक पहुँच सकते थे।

चरण 3

3. Protocol सीमा

HTTP serialization पंक्ति सीमाओं पर निर्भर है; control characters स्वीकारने से fields जुड़ या बिगड़ सकते हैं।

चरण 4

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`;
}

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

स्रोत